将项目添加到列表视图并过滤现有项目

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

从控制器将变量应用于视图中的按钮?Sencha Touch

对列表视图中的现有项目进行排序

使用过渡将项目附加到列表视图

当检查可以是字符串数组中的一个或多个项目时,如何将列表视图项目添加到数组中?

在 Android 中加载动态项目时无法将页脚视图添加到列表视图