簡體   English   中英

從數據網格視圖中刪除多行

[英]Delete Multiple rows from 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);
                    }
                }

但它刪除了底行而不是第二行。並給出了以下錯誤。我想要的是,如果CurrentSelected_PRID_ForPurchaseOrder的值等於 2,那么它應該刪除這兩行。我也嘗試過使用 for 循環,但它給出我索引超出范圍錯誤。它給出了以下錯誤。

 Object Reference Not set to an instance of object

有幾種方法可以解決這個問題。 一是做到以下幾點

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的底端循環,避免了在迭代時刪除行的問題。

我希望這有幫助。

正如 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++;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM