将项目添加到列表视图并过滤现有项目
Posted
技术标签:
【中文标题】将项目添加到列表视图并过滤现有项目【英文标题】:add items to listview and filter existing item 【发布时间】:2014-03-05 19:08:48 【问题描述】:我正在编写一个程序来计算学生的成绩并查看该学生是否是优等生。问题是只添加了第一荣誉生的名单。其余属于 2nd 和 3rd 的不再显示。我已经尝试解决这个问题将近 2 天了,但我仍然找不到解决这个问题的方法。
List<int> clsid = new List<int>()2,3,5;
int g = clsid.Count();
List<int> temp_rank1 = new List<int>();
List<int> temp_rank2 = new List<int>();
List<int> temp_rank3 = new List<int>();
//get the student id
foreach (int fr in clsid)
conek.OPEN("select stud_id from class_info where class_id = '"+fr+"' and tmp_gr1 >= 88");
while (conek.reader.Read())
temp_rank1.Add(conek.reader.GetInt32(0));
conek.CLOSE();
conek.OPEN("select stud_id from class_info where class_id = '" + fr + "' and tmp_gr1 >=85");
while (conek.reader.Read())
temp_rank2.Add(conek.reader.GetInt32(0));
conek.CLOSE();
conek.OPEN("select stud_id from class_info where class_id = '" + fr + "' and tmp_gr1 >= 83 ");
while (conek.reader.Read())
temp_rank3.Add(conek.reader.GetInt32(0));
conek.CLOSE();
如果同一student_id的总数等于g的学科总数,则获取学生id。
var tmp1 = temp_rank1.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp1.Count() >= 1)
foreach (var gh in tmp1)
rank1.Add(gh);
var tmp2 = temp_rank2.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp2.Count() >= 1)
foreach (var gh in tmp2)
rank2.Add(gh);
var tmp3 = temp_rank3.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp3.Count() >= 1)
foreach (var gh in tmp3)
rank3.Add(gh);
第一届荣誉学生
nye.SubItems.Add("First Honor");
listView1.Items.Add(nye);
int yt = 0;
foreach (int fgd in idr1)
if(rcs1[yt] >= 90)
ListViewItem gtb = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id = '"+fgd+"' ");
while (conek.reader.Read())
gtb.SubItems.Add(conek.reader.GetString(0));
conek.CLOSE();
foreach (int gfad in clsid)
conek.OPEN("select tmp_gr1 from class_info where class_info.stud_id = '" + fgd + "' and class_id = '" + gfad + "' ");
while (conek.reader.Read())
gtb.SubItems.Add(Math.Round(conek.reader.GetDouble(0),2).ToString());
conek.CLOSE();
gtb.SubItems.Add(Math.Round(rcs1[yt],2).ToString());
yt++;
listView1.Items.AddRange(new ListViewItem[] gtb );
二等奖学生
listView1.Items.Add("");
ListViewItem nyek = new ListViewItem();
nyek.SubItems.Add("Second Honor");
listView1.Items.Add(nyek);
int yet = 0;
foreach (int fed in idr2)
if(!idr1.Contains(fed))
if (rcs2[yet] >= 88)
ListViewItem gtbs = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id ='" + fed + "'");
while (conek.reader.Read())
gtbs.SubItems.Add(conek.reader.GetString(0));
conek.CLOSE();
foreach (int gfa in clsid)
conek.OPEN("select tmp_gr1 from class_info left join students on class_info.stud_id = students.stud_id where class_info.stud_id = '" + fed + "' and class_id = '" + gfa + "' ");
while (conek.reader.Read())
gtbs.SubItems.Add(Math.Round(conek.reader.GetDouble(0), 2).ToString());
conek.CLOSE();
gtbs.SubItems.Add(Math.Round(rcs2[yet], 2).ToString());
yet++;
listView1.Items.AddRange(new ListViewItem[] gtbs );
三等奖学生
listView1.Items.Add("");
ListViewItem ne = new ListViewItem();
ne.SubItems.Add("Third Honor");
listView1.Items.Add(ne);
int yat = 0;
foreach (int fbv in idr3)
if (!idr2.Contains(fbv))
if (rcs3[yat] >= 85)
ListViewItem bnb = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id = '" + fbv + "' ");
while (conek.reader.Read())
bnb.SubItems.Add(conek.reader.GetString(0));
conek.CLOSE();
foreach (int nmj in clsid)
conek.OPEN("select tmp_gr1 from class_info left join students on class_info.stud_id = students.stud_id where class_info.stud_id = '" + fbv + "' and class_id = '" + nmj + "' ");
while (conek.reader.Read())
bnb.SubItems.Add(Math.Round(conek.reader.GetDouble(0), 2).ToString());
conek.CLOSE();
bnb.SubItems.Add(Math.Round(rcs3[yat], 2).ToString());
yat++;
listView1.Items.AddRange(new ListViewItem[] bnb );
【问题讨论】:
【参考方案1】:您的问题是在 foreach 循环中您只迭代 tmp1:
var tmp1 = temp_rank1.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp1.Count() >= 1)
foreach (var gh in tmp1)
rank1.Add(gh);
var tmp2 = temp_rank2.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp2.Count() >= 1)
foreach (var gh in tmp1)
rank2.Add(gh);
var tmp3 = temp_rank3.GroupBy(n => n).Where(n => n.Count() == g).Select(n => n.Key);
if (tmp3.Count() >= 1)
foreach (var gh in tmp1)
rank3.Add(gh);
无论如何,我建议您重构,因为这段代码几乎不可读和可维护。 提取类似代码的方法,使用 linq 的 .Any() 代替 .Count >=1 并使用 .AddRange 代替迭代和使用 .Add
实际上你在更多地方犯了同样的错误,就像在第二个荣誉部分中一样:
listView1.Items.Add("");
ListViewItem nyek = new ListViewItem();
nyek.SubItems.Add("Second Honor");
listView1.Items.Add(nyek);
int yet = 0;
foreach (int fed in idr2)
if(!idr1.Contains(fed))
if (rcs2[yet] >= 88)
ListViewItem gtbs = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id ='" + fed + "'");
while (conek.reader.Read())
gtbs.SubItems.Add(conek.reader.GetString(0));
conek.CLOSE();
foreach (int gfa in clsid)
conek.OPEN("select tmp_gr1 from class_info left join students on class_info.stud_id = students.stud_id where class_info.stud_id = '" + fed + "' and class_id = '" + gfa + "' ");
while (conek.reader.Read())
gtbs.SubItems.Add(Math.Round(conek.reader.GetDouble(0), 2).ToString());
conek.CLOSE();
gtbs.SubItems.Add(Math.Round(rcs2[yet], 2).ToString());
yet++;
listView1.Items.AddRange(new ListViewItem[] gtbs );
什么时候应该:
listView2.Items.Add("");
ListViewItem nyek = new ListViewItem();
nyek.SubItems.Add("Second Honor");
listView1.Items.Add(nyek);
int yet = 0;
foreach (int fed in idr2)
if(!idr2.Contains(fed))
if (rcs2[yet] >= 88)
ListViewItem gtbs = new ListViewItem();
conek.OPEN("select concat(l_name,', ',f_name,' ',ucase(substring(m_name,1,1)),'.') from students where stud_id ='" + fed + "'");
while (conek.reader.Read())
gtbs.SubItems.Add(conek.reader.GetString(0));
conek.CLOSE();
foreach (int gfa in clsid)
conek.OPEN("select tmp_gr1 from class_info left join students on class_info.stud_id = students.stud_id where class_info.stud_id = '" + fed + "' and class_id = '" + gfa + "' ");
while (conek.reader.Read())
gtbs.SubItems.Add(Math.Round(conek.reader.GetDouble(0), 2).ToString());
conek.CLOSE();
gtbs.SubItems.Add(Math.Round(rcs2[yet], 2).ToString());
yet++;
listView2.Items.AddRange(new ListViewItem[] gtbs );
第三个也是一样的...只要仔细看看你在哪里引用第一个列表,而第二个应该被引用。
【讨论】:
感谢您指出这一点。我想尽可能多地更改代码,但我的时间不多了。我只需要让这个程序运行没有错误。我更改了 foreach 循环中的值,但仍然得到相同的答案,你能帮我多忙吗 已编辑,请尝试。 i 实际上是指 idr1 中的 id 列表。我用它来过滤ID。如果 ird2 中的 id 存在于 idr1 中,我不必添加那个。第三个荣誉也是如此 看看最后一行,这就是你要填充的列表视图对吗?它是 listView1 而不是 listView2,在您指的其他地方都没有 listView2。 no.. 我试图在一个列表视图中填写所有项目。以上是关于将项目添加到列表视图并过滤现有项目的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio:如何将列表视图中的项目添加到列表视图 onClick