Șterge Mai multe rânduri din datagridview

Am o vizualizare datagrid în care valorile sunt inserate. Gridview este așa.

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

Încerc să compare PRID cu o variabilă care ține rândul selectat PRID. Ce am făcut până acum.

                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);
                    }
                }

Dar șterge rândul de jos nu rândul al doilea.și dă următoarea eroare.Ce vreau este dacă valoarea CurrentSelected_PRID_ForPurchaseOrder este egală cu 2 atunci ar trebui să ștergeți ambele rows.I am încercat folosind pentru buclă, de asemenea, dar îmi dă Indexul din afara intervalului error.It dă următoarea eroare.

 Object Reference Not set to an instance of object
0
nu se șterge rândul atunci când există trei rânduri care șterge partea de jos două și se lasă în partea de sus 1.Datele sunt introduse în gridview manual folosind buclă. Am actualizat întrebarea.
adăugat autor Mj1992, sursa
Nu ați dat eroarea, dar probabil are legătură cu eliminarea elementelor în timpul unei foreach . Care este sursa de date subiacente pentru rețeaua de date? Este o bază de date, din care puteți să eliminați rândurile și să rebobiți grila?
adăugat autor mellamokb, sursa

2 răspunsuri

Sunt câteva moduri în jurul acestui lucru. Unul este de a face următoarele

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]);

Aceasta este looping din capătul inferior al DataGridView și evită problema cu eliminarea rândurilor în timp ce este iterată.

Sper ca asta ajuta.

1
adăugat
dacă încerc acest lucru nu șterge un singur rând.
adăugat autor Mj1992, sursa
eram greșit în condiția if.thnx a funcționat.
adăugat autor Mj1992, sursa

Așa cum a subliniat mellamokb motivul este pentru că editați colecția în timpul foreach-ului. O soluție ar fi să stocați mai întâi rândurile cu același PRID într-o listă și apoi să le eliminați după. Ceva de genul

var rowsToRemove = new List();

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));

O altă soluție este folosirea unei buclă în timp ce ia în considerare posibilitatea schimbării dimensiunii colecției.

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
adăugat
Ce este dgv_r aici?
adăugat autor Mj1992, sursa
de la primul exemplu, nu se șterge un singur rând, de asemenea, doar afișarea erorii.
adăugat autor Mj1992, sursa
Thnx pentru ajutor. @ Exemplul KillerCam a lucrat bine.
adăugat autor Mj1992, sursa
@ Mj1992, îmi pare rău că am actualizat al doilea exemplu, ce eroare ai în soluția pentru?
adăugat autor Ash Burlaczenko, sursa