Autor Beitrag
Realnub
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37

Win XP
VS 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37

Win XP
VS 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
DataRow row = (DataRow)myDataGridView.CurrentRow.DataBoundItem;					

Wenn Du den RowIndex aus den EventArgs verwendest, geht es auch so:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37

Win XP
VS 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 29.04.08 21:39 
Versuche einmal, DataBoundItem nach DataRowView zu casten und dann deren Row-Eigenschaft zu benutzen.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
DataRowView rv = myDataGridView.CurrentRow.DataBoundItem as DataRowView;
if (rv != null) {
    DataRow row = rv.Row;
    //  jetzt kann wie üblich auf row zugegriffen werden
}

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37

Win XP
VS 2005
BeitragVerfasst: 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