2016-08-01 67 views
0

下面我有一个表中包含了学生在一个DataGridView结果: -为什么我的if else语句拒绝读取某一行?

ID NAME RESULT 
1 Peter PASS 
1 Peter SILVER 
2 Sam  FAIL 
2 Sam  SILVER 
3 Simon FAIL 
4 Cliff PASS 
5 Jason FAIL 
5 Jason FAIL 
6 Leonard PASS 
6 Leonard FAIL 

我想制作一个简单的程序,将在一个按钮的点击过滤掉某些行的基础上的结果。我现在所取得的成就是能够筛选出那些以PASS和/或SILVER作为结果的人,并只显示FAIL。

现在的问题是,无论何时点击按钮,它都会删除带有合格和/或银色的行,第二行除外:1 Peter SILVER。与此表留给我作为下面的最终结果是: -

enter image description here

来解决这个问题的唯一方法是现在再次点击该按钮。

下面是按钮的源代码: -

private void btnGenerate_Click(object sender, EventArgs e) 
    { 
     if (dtList.Rows.Count != 0) 
     { 
      try 
      { 
       foreach (DataGridViewRow dr in dtList.Rows) 
       { 
        //Column names in excel file 
        string colID = dr.Cells["ID"].Value.ToString(); 
        string colName = dr.Cells["Name"].Value.ToString(); 
        string colResult = dr.Cells["Result"].Value.ToString(); 


        if (!colResult.Equals("FAIL", StringComparison.InvariantCultureIgnoreCase)) 
        { 
         dtList.Rows.Remove(dr); 
        } 

       } 
      } 
      catch 
      { 

      } 
     } 

    } 
+4

空捕获会伤害你 –

+0

这不是一个答案,但使条件'Count> 0'更有意义,并且可能会影响后者。 –

+0

此外,当您尝试从您正在迭代的集合中删除行时,代码是否会失败? –

回答

2

的问题是你改变你迭代的列表。这绝不是一个好主意......

在这种情况下,你看第一行(彼得/帕斯)并将其删除。然后你看第二排。但是等等,我们删除了一行,所以第二行实际上现在是旧的第三行 - 我们刚刚跳过了原来的第二行。

您不会在其他地方注意到此问题,因为所有其他想要删除的行后面跟着您想保留的行。

解决这个问题的办法是要么:

  1. 创建你想保留,然后绑定 新的名单。无论您在显示

  2. 创建一个项目一个新的列表在迭代表格时要从数据表 中删除的项目列表。然后,一旦你有一个 项目的列表,你想删除迭代在列表中删除它们从 数据表。

  3. 使用for循环从最后的 索引开始遍历整个列表。这将意味着,当你移除物品时,你只会影响到 之后的物品,在这种情况下你已经处理了 。

第二种可能是在这种情况下最简单的方法。第一个涉及额外的代码,第三个可能不明显,为什么你这样做是为了跟在你后面的人。