tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
7874
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Jacka
    Jacka Jacka ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Beiträge
    390
    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 :
    1
    2
    3
    
    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!

    Bin für jeden Hinweis dankbar!
    Viele Grüße,
    Jacka
     
    Biologie ist das was lebt, Chemie das was kracht und Physik das, wo nichts funktioniert!

    - - - - - - - - - - - - - - - -

    Open Source JS-Framework für Business Web-Applications: ExtJS

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi,

    Schon mal die Methode Clear probiert?!

    Bsp
    Code vbnet:
    1
    
    dataGridView.Rows.Clear()
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    Avatar von Jacka
    Jacka Jacka ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Beiträge
    390
    Vielen Dank für den Hinweis!
    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
     
    Biologie ist das was lebt, Chemie das was kracht und Physik das, wo nichts funktioniert!

    - - - - - - - - - - - - - - - -

    Open Source JS-Framework für Business Web-Applications: ExtJS

  4. #4
    DerJörg Tutorials.de Gastzugang
    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
     

  5. #5
    DerCrack DerCrack ist offline Rookie
    Registriert seit
    Nov 2010
    Beiträge
    5
    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
     

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 14.02.08, 16:18
  2. Alle Datensätze bis auf die letzten z.B. 50 aus der Datenbank löschen
    Von aliben37 im Forum Relationale Datenbanksysteme
    Antworten: 5
    Letzter Beitrag: 10.08.07, 20:26
  3. [VB2005] Aus DataGridView nach Access
    Von Jacka im Forum .NET Datenverwaltung
    Antworten: 1
    Letzter Beitrag: 10.01.07, 20:36
  4. Antworten: 4
    Letzter Beitrag: 15.07.05, 11:03
  5. Antworten: 3
    Letzter Beitrag: 02.02.04, 10:22