2012-05-29 68 views
0

我有一個datagridview插入的值。gridview是這樣的。從datagridview刪除多行

Item    PRID     
    ------    ------    
    Item1    1 
    Item2    2 
    Item3    2 

我想比較PRID與一個變量,它包含選定的行PRID。 到目前爲止我所做的一切。

   foreach (DataGridViewRow dgv_r in PurchaseOrder_dgv.Rows) 
       { 
        if (dgv_r.Cells[1].Value.ToString() == CurrentSelected_PRID_ForPurchaseOrder.ToString()) 
        { 
         PurchaseOrder_dgv.Rows.Remove(dgv_r); 
        } 
       } 

但它刪除底行不是第二row.and提供了以下error.What我要的是如果CurrentSelected_PRID_ForPurchaseOrder的值等於2,那麼它應該同時刪除rows.I've試了一下使用循環也,但它給了我索引超出範圍error.It給出以下錯誤。

Object Reference Not set to an instance of object 
+0

你沒有給出錯誤,但它可能與在'foreach'期間刪除元素有關。數據網格的底層數據源是什麼?它是一個數據庫,您可以從中刪除行並重新綁定網格? – mellamokb

+0

它只是沒有刪除行當有三行它刪除底部兩個並離開頂部1.數據正在插入gridview手動使用for循環。我已經更新了這個問題。 – Mj1992

回答

1

這是一對夫婦的方式。一個是做以下

for (int i = dataGridView1.RowCount - 1; i >= 0; i--) 
    if (String.Compare(dataGridView1.Rows[i].Cells[1].Value.ToString(), "2") == 0) 
     dataGridView1.Rows.Remove(dataGridView1.Rows[i]); 

這是從DataGridView的底端循環,並與同時迭代刪除行可以避免這個問題。

我希望這會有所幫助。

+0

如果我試試這個,它不會刪除一行。 – Mj1992

+0

我錯誤地在if condition.thnx它工作。 – Mj1992

0

由於mellamokb指出原因是因爲你在foreach中編輯集合。一種解決方案是首先將具有相同PRID的行存儲在列表中,然後將其刪除。像這樣的東西

var rowsToRemove = new List<int>(); 

foreach (DataGridViewRow dgv_r in PurchaseOrder_dgv.Rows) 
{ 
    if (dgv_r.Cells[1].Value.ToString() == CurrentSelected_PRID_ForPurchaseOrder.ToString()) 
    { 
     rowsToRemove.Add(dgv_r.Index); 
    } 
} 

rowsToRemove.Reverse(); 
rowsToRemove.ForEach(i => PurchaseOrder_dgv.Rows.RemoveAt(i)); 

另一種解決方案是使用while循環代替考慮集合大小變化的可能性。

int i = 0; 
while (i < PurchaseOrder_dgv.Rows.Count) 
{ 
    if (PurchaseOrder_dgv.Rows[i].Cells[1].Value.ToString() == CurrentSelected_PRID_ForPurchaseOrder.ToString()) 
    { 
     PurchaseOrder_dgv.Rows.RemoveAt(i); 
    } 
    i++; 
} 
+0

這是什麼dgv_r? – Mj1992

+0

從你的第一個例子中,它不是刪除一行也只是顯示錯誤。 – Mj1992

+0

@ Mj1992,對不起,我已經更新了第二個示例,您在解決方案中遇到什麼錯誤? –