[VB2005] Alle Datensätze eines DataGridView löschen

Jacka

Erfahrenes Mitglied
Hallöchen!

Ja, ich habe mich nun auch mal an VB 2005 (XE) gewagt und gleich folgendes Problem:
Wie kann ich per Code alle Datensätze eines DataGridView löschen?
Ich importiere Werte aus einer Excelliste und zeige sie in einem DataGridView an.
Wird jetzt eine neue Excelliste importiert, sollen die Altdaten aus dem DataGridView natürlich nicht mehr angezeigt werden. Die Datensätze sollen also gelöscht werden.
Folgenden Code habe ich probiert:
Code:
For i As Integer = 0 To DataGridView1.RowCount 
            DataGridView1.Rows.RemoveAt(i)
Next i
Es handelt sich um 153 Datensätze. Bei Datensatz 77 kommt folgende Fehlermeldung:
"Die neue Zeile, für die kein Commit durchgeführt wurde, kann nicht gelöscht werden."
Aber der Datensatz ist wie jeder andere auch!
Woran kann das liegen? Gibt es vielleicht noch eine andere Möglichkeit zum Löschen?
Mir raucht schon die Birne! :confused:

Bin für jeden Hinweis dankbar!
Viele Grüße,
Jacka
 

Jacka

Erfahrenes Mitglied
Vielen Dank für den Hinweis!
:eek: Ach du meine Güte, was bin ich für ein Trottel...
Manchmal sieht man den Wald voller Bäumen nicht!

Da hätte ich gleich noch ein paar Fragen: :)
Kann man die Breite des "Datensatzmarkierers" (keine Ahnung wie das heißt, also da wo der Pfeil immer den aktuellen Datensatz anzeigt) per Code festlegen?
Welche Einstellung muss man vornehmen, dass alle Spalten die maximale Breite der Tabelle ausnutzen, also kein Rand entsteht?

Vielen Dank und Grüße,
Jacka
 
D

DerJörg

Moin!

Dieser Algorithmus funktioniert nicht so, wie gedacht, denn er löscht lediglich jede zweite Zeile: Aus dem DataGridView wird zunächst das 0-te Element gelöscht, also das vorige 1-te Element ist danach Element 0, das 2-te Element danach Element 1 usw. (siehe Tabelle unten). Wenn dann im zweiten Schleifendurchlauf das 1-te Element gelöscht wird, bleibt das 0-te (also das ursprünglich 1-te) stehen: aus "a b c d e f g" wird "b c d e f g"; wird dann das 1-te Element gelöscht, dann bleibt "b d e f g"; wird dann das 2-te Element gelöscht, dann bleibt "b d f g"; usw.

Dadurch ist bei aufgerundet der Hälfte der Elemente ceil(153:2=76,5)=77 schluß mit lustig, denn nach 77 (i=0...76) Schleifendurchläufen sind nur noch 77 Elemente vorhanden (maximaler Index 76). Wird dann versucht, das Element i=77 zu entfernen, tritt der benannte Fehler auf.

Das folgende kleine Excel-VB-Script demonstriert den Effekt, dass für die Bestimmung der Anzahl der Schleifendurchläufe lediglich bei der Schleifeninitialisierung der Wert von DataGridView1.RowCount, also 153 geholt wird und danach während des Schleifendurchlaufs nicht aktualisiert wird:

Sub countCycles()
Dim myMax, cycles As Integer

myMax = 153
cycles = 0

For i = 0 To myMax
myMax = myMax - 1
cycles = cycles + 1
Next
Cells(1, 1) = cycles
Cells(1, 2) = myMax
End Sub

Das Ergebnis sieht in Excel so aus:
cycles=154
myMax=-1

Die Schleife wird also 154-mal durchlaufen (mit den Indizes 0 bis 153). Dadurch wird noch ein weiteres Problem bei dieser Schleife deutlich: Der Index der letzten im DGV vorhandenen Zeile ist 152 (weil die Zeilen eines DGV 0-basiert sind); es wird aber im letzten Schleifendurchlauf die Zeile mit dem Index gleich Count, also 153 angesprochen. Das ist eins zu viel! Die Schleife müsste also so heißen (immer Element 0 löschend):

For i As Integer = 0 To DataGridView1.RowCount -1
DataGridView1.Rows.RemoveAt(0)
Next i

oder rückwärts zählend:

For i As Integer = DataGridView1.RowCount -1 To 0 step -1
DataGridView1.Rows.RemoveAt(i)
Next i

Anders ist es bei C#:
public void countCycles()
{
int myMax = 153, cycles = 0;
for (int i = 0; i < myMax; ++i)
{
myMax = myMax - 1;
cycles = cycles + 1;
}
Console.WriteLine(myMax);
Console.WriteLine(cycles);
}

Hier ist am Ende der Schleife myMax=76 und cycles=77. Hier käme die Fehlermeldung nicht, es würden aber trotzdem nur ca. die Hälfte der Zeilen entfernt werden.

Mit clear() geht es natürlich einfacher, alle Zeilen zu entfernen, aber falls man mal Teilbereiche einer Tabelle löschen möchte, ist es doch wichtig, sich über die korrekte Indizierung der Zeilen Gedanken zu machen.

Ich hoffe, dass mein Beitrag trotz der späten Antwort fast drei Jahre nach dem ursprünglichen Post jemandem nützlich ist.

Jörg
 

DerCrack

Grünschnabel
Hallo Jörg (hoffe du weilst noch hier im Forum?),

ich erhalte trotzdem eine Fehlermeldung. Man könne diesen Eintrag nicht löschen weil kein Commit erfolgt ist. Scheinbar will er den Datensatz aus der Tabelle und nicht nur aus dem DataGridView löschen.

Gruß,

Mark