2016-08-01 66 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循環從最後的 索引開始遍歷整個列表。這將意味着,當你移除物品時,你只會影響到 之後的物品,在這種情況下你已經處理了 。

第二種可能是在這種情況下最簡單的方法。第一個涉及額外的代碼,第三個可能不明顯,爲什麼你這樣做是爲了跟在你後面的人。