Autor Beitrag
nieselfriem
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 06.01.16 18:28 
Hallo Ich bin Dabei ein Formular zu bauen in dem eine DataGridview (Tabelle) aus einer Datenbank geladen wird. In dieser habe ich dann Selectionboxes eingefügt. Die Ausgewählten Zelen sollen dann in eine andere DatagridView rüber verschoben werden werden. Das kopieren klappt ganz gut. Jedoch will ich die kopierten Zeilen in dem Quell DatagridView löschen. Das klapp leider nicht ganz. Alle Zeilen werden zwar kopiert, aber nur die letzte Zeile der ausgewählten Zeilen wird gelöscht. Im Anhang habe ich zwei Screenshots die mein Problem mal visualsieren sollen.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public DataTable loadMatImpTable(String query)
{
    myConn.Open();
    SQLiteCommand cmd = new SQLiteCommand(query, myConn);
    SQLiteDataAdapter sda = new SQLiteDataAdapter();
    sda.SelectCommand = cmd;
    DataTable dt= new DataTable();
    sda.Fill(dt);
    return dt;
}

Das DataGridview befülle ich dann wie folgt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
DataTable dt = lt.loadMatImpTable(queryMat);

this.matExpDataGridVW.Rows.Clear();
           
foreach (DataRow item in dt.Rows)
{
    int n = matExpDataGridVW.Rows.Add();
    matExpDataGridVW.Rows[n].Cells[0].Value = false;
    matExpDataGridVW.Rows[n].Cells[1].Value = item["MaterialID"].ToString();
    matExpDataGridVW.Rows[n].Cells[2].Value = item["Name"].ToString();
    matExpDataGridVW.Rows[n].Cells[3].Value = item["Preis"];
    matExpDataGridVW.Rows[n].Cells[4].Value = item["Anzahl"].ToString();
    matExpDataGridVW.Rows[n].Cells[5].Value = item["Datum"].ToString();                
}

Dem Button habe ich folgende Aktion zugewiesen
1. Befüllen des leeren DataGridView mit den Ausgewählen aus dem Quell DataGridView
2. Versuch des Löschen aller ausgewählten Elemente aus Quell-DataGridView

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
private void mvImpSelectionBT_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow item in matExpDataGridVW.Rows)
    {
        if ((bool)item.Cells[0].Value == true)
        {
            int n = matImpDataGridVW.Rows.Add();
            matImpDataGridVW.Rows[n].Cells[0].Value = false;
            matImpDataGridVW.Rows[n].Cells[1].Value = item.Cells[1].Value.ToString();
            matImpDataGridVW.Rows[n].Cells[2].Value = item.Cells[2].Value.ToString();
            matImpDataGridVW.Rows[n].Cells[3].Value = item.Cells[3].Value.ToString();
            matImpDataGridVW.Rows[n].Cells[4].Value = item.Cells[4].Value.ToString();
            matImpDataGridVW.Rows[n].Cells[5].Value = item.Cells[5].Value.ToString();
        }                
    }

    foreach (DataGridViewRow item in matExpDataGridVW.SelectedRows)
    {
        matExpDataGridVW.Rows.Remove(item);
    }
}

Was muss ich anders machen, damit alle Zeilen gelöscht werden?

VG niesel

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 06.01.16 19:07 
ausblenden C#-Quelltext
1:
2:
3:
4:
foreach (DataGridViewRow item in matExpDataGridVW.SelectedRows)
{
   matExpDataGridVW.Rows.Remove(item);
}


Das wird mit Sicherheit so nicht funktionieren. Wenn du die Row entfernst ist die zwangsweise auch aus SelectedRows raus. Du iterierst aber mit dem foreach über SelectedRows. Un des ist nicht erlaubt einer Liste zu ändern über die man gerade iteriert. Dein Code sollte also nach dem ersten durchlauf und dem ersten löschen eine Exception werfen.

Entweder du erstellst eine irgendwie geartete Kopie von SelectedRows um dann über diese zu iterieren (Diese Kopie ändert sich ja dann nicht mehr wenn wenn man die OriginalRow aus Rows entfernt und über die kann man dann gefahrlos iterieren oder du benutzt einen Konstrukt der nicht iteriert. Etwa so z.B. (Pseudocode)

ausblenden C#-Quelltext
1:
2:
while(matExpDataGridVW.SelectedRows.Count > 0)
   matExpDataGridVW.Rows.Remove(matExpDataGridVW.SelectedRows[0]);


Kein Ahnung ob das die SelectedRows passend ändert. Wenn nicht dann solltest du denn Weg mit der Kopie der SelectedRows probieren.