| Autor |
Beitrag |
Realnub
      
Beiträge: 37
Win XP
VS 2005
|
Verfasst: Di 29.04.08 16:01
Hallo,
Ich ziehe mir diverse Werte aus einer MySQL-Datenbank in ein DataTable, was die DataSource für ein DataGridView ist.
Im DGV habe ich eine Spalte mit Buttons gefüllt, über die die ganze Zeile gelöscht werden soll.
Wie mache ich das? Es soll mit einem Klick auf den Button, die Zeile im entsprechenden DataTable gelöscht werden, unter dem Gesichtspunkt, dass es noch möglich sein soll die Zeilen im DGV durch den User neu anordnen zu lassen?
//Die geänderten Daten sollen später über ein MySqlDataAdapter.Update zurück in die Datenbank gebracht werden.
Danke für Eure Hilfe,
Markus
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 29.04.08 17:17
In der SDK-Doku steht unter DataGridViewButtonColumn-Klasse:
| Zitat: | | Behandeln Sie das DataGridView.CellContentClick-Ereignis, um auf Mausklicks von Benutzern auf Schaltflächen zu reagieren. |
Über DataGridViewCellEventArgs bekommst Du Zugriff auf RowIndex, also auf die Zeile, die Du vermutlich löschen willst.
Hinweis: Benutze DataTable.Rows.Delete(row), aber keinesfalls DataTable.Rows.Remove(row). Zeilen, die mit Remove gelöscht werden, sind unwiderruflich verloren und können auch für DbDataAdapter.Update nicht berücksichtigt werden. Ich sehe übrigens keinen Zusammenhang zwischen Sortieren, Anzeige und Löschen.
Jürgen
|
|
Realnub 
      
Beiträge: 37
Win XP
VS 2005
|
Verfasst: Di 29.04.08 17:37
wie ich an den rowindex im dgv komme, weiß ich. aber wenn der user das dgv neu sortiert, dann wird doch das datatable nicht mit sortiert oder? da kann ich doch dann nicht einfach über den rowindex gehen? da müsste ich im dgv einen eindeutigen schlüssel oder so haben, nach dem ich im datatable suche und die zugehörige zeile lösche.
den tipp mit delete werde ich mir merken
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 29.04.08 18:20
Die DataTable ist eine (im Prinzip) unsortierte Datenmenge. Die Sortierung darf nur vorübergehend oder zur Anzeige relevant sein, aber nicht die "Identifizierung" einer bestimmten Zeile beeinflussen. Diese bekommt man z.B. so:
C#-Quelltext 1:
| DataRow row = (DataRow)myDataGridView.CurrentRow.DataBoundItem; |
Wenn Du den RowIndex aus den EventArgs verwendest, geht es auch so:
C#-Quelltext 1:
| DataRow row = (DataRow)myDataGridView.Rows[e.RowIndex].DataBoundItem; |
Das war falsch, wie die beiden nächsten Beiträge deutlich machen. In meinem nächsten Beitrag habe ich den ersten Code richtig eingetragen, der zweite Code kann in gleicher Weise berichtigt werden.
Die auf diese Weise bestimmte row ist diejenige, die Du bei Bedarf löschen kannst.
Bitte lies nach, was in der SDK-Doku zu diesen Begriffen steht, damit Du die Zusammenhänge verstehst.
Im übrigen kann ich zu den DataGridViewButtons nicht sagen: Ich habe immer noch nicht verstanden, warum MS eine ganze Spalte von Buttons für nützlich hält (alle mit der Bedeutung "Löschen"), wenn es z.B. BindingNavigator gibt (mit einem Löschen-Button). Aber nun ja...
Jürgen
Zuletzt bearbeitet von JüTho am Mi 30.04.08 08:31, insgesamt 1-mal bearbeitet
|
|
Realnub 
      
Beiträge: 37
Win XP
VS 2005
|
Verfasst: Di 29.04.08 20:49
habe in der sdk gelesen und wollte, dann einfach learning by doing betreiben aber casten von datarowview in datarow wirft ne fehlermeldung auf ... konnte das bisher noch nicht lösen.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 29.04.08 21:39
Versuche einmal, DataBoundItem nach DataRowView zu casten und dann deren Row-Eigenschaft zu benutzen.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mi 30.04.08 08:27
@Khabarakh
Du hast recht; ich hatte den Code aus dem Kopf aufgeschrieben und nur zur Hälfte in der SDK-Doku kontrolliert. Der Vollständigkeit halber nochmal berichtigt und mit kompletter Null-Prüfung versehen:
C#-Quelltext 1: 2: 3: 4: 5:
| DataRowView rv = myDataGridView.CurrentRow.DataBoundItem as DataRowView; if (rv != null) { DataRow row = rv.Row; } |
Auf die Null-Prüfung kann in der Praxis meistens verzichtet werden; denn von der Konstruktion her ist es ja bekannt, wenn zum DGV eine DataTable gehört; dann passt zwangsläufig auch DataRowView als DataBoundItem. Es könnte allenfalls Probleme bei einer neu hinzugefügten Zeile geben.
@Realnub
"wirft ne fehlermeldung auf" - bitte grundsätzlich diese Meldung angeben. (Hier ist es klar; leider hat die SDK-Doku kein passendes Beispiel. Ich hatte ebenfalls mehrere Sachen ausprobieren müssen; und wie Du siehst, habe ich es mir noch nicht vollständig und richtig gemerkt.)
Jürgen
|
|
Realnub 
      
Beiträge: 37
Win XP
VS 2005
|
Verfasst: Mi 30.04.08 09:27
ich danke dir und ich werde mich bessern und in zukunft die doku genauer studieren und fehlermeldungen hier genau posten
danke noch mal
|
|