2016-05-24 10 views
0

Grundsätzlich habe ich eine MySQL-DB bin ich die Daten aus einer Spalte einer Tabelle in eine ListBox binden. Ich möchte Benutzern erlauben hinzufügen/bearbeiten/entfernen von Elementen und zu seinLöschen von Zeilen aus Datentabelle ordnungsgemäß in. NET

Änderungen speichern können/ablehnen zum löschen, ich möchte der Benutzer in der Lage sein das ausgewählte Element in der List-Box zu löschen .. hier ist was ich

bisher ausprobiert habe (1) dt.Rows(lst.SelectedIndex).Delete()

Dies löscht die Zeile jedoch erst aus der DataTable, wenn sie mit der Methode DataAdapter.Update aktualisiert wird, sodass der nächste Index in der ListBox auf die gelöschte verweist Zeile in der DataTable.

(2): dt.Rows.RemoveAt(lst.SelectedIndex)

Dies funktioniert gut, aber wenn die Datentabelle zu aktualisieren (nachdem der Benutzer save klickt), werden die gelöschten Zeilen nicht einmal gelöscht.

(3) Versucht AcceptChanges Aufruf: oben

dt.Rows(lst.SelectedIndex).Delete() 
    dt.AcceptChanges() 

Und ich bekomme das gleiche Ergebnis wie die zweite.

Hier ist, wie ich endlich die Datentabelle aktualisieren:

Dim cmdBldr As New MySqlCommandBuilder(da) 
    da.Update(dt) 

So ist es eine Möglichkeit, Benutzer zu ermöglichen, auf die Datatable beliebige Anzahl von Zeilen hinzufügen/löschen Sie vor der Aktualisierung?

+0

Wenn Sie beide ('.Delete()' und '.RemoveAt()') aufrufen, was passiert? – Aimnox

+1

Ich habe eine 'BindingSource' verwendet - dank Jmcilhinneys Antwort -, aber auf jeden Fall ist das, was du vorschlägst, keine gute Idee, denn zuerst werden zwei Einträge aus der Listbox gelöscht. –

Antwort

3

Binden Sie die DataTable an eine BindingSource (die Sie im Designer hinzufügen würden) und binden Sie diese an die ListBox. Sie würden dann den ausgewählten Datensatz löschen, indem Sie RemoveCurrent auf dem BindingSource aufrufen. Dadurch wird diese Zeile als Deleted markiert und von der BindingSource ausgeschlossen.

Rufen Sie nicht AcceptChanges auf etwas. Dadurch wird dem Datenadapter angezeigt, dass keine Änderungen zum Speichern vorhanden sind. Rufen Sie Update auf dem Datenadapter auf, um die Änderungen von DataTable in der Datenbank zu speichern. Das ruft intern nach einem erfolgreichen Speichern AcceptChanges auf. Wenn AcceptChanges aufgerufen wird, werden alle mit Deleted gekennzeichneten Zeilen aus der DataTable entfernt, während alle Zeilen, die mit oder Modified markiert sind, mit Unchanged gekennzeichnet sind.

+0

Danke, die 'BindingSource' löste das Problem .. aber ich frage mich, gibt es eine Möglichkeit, dies zu tun, ohne eine zusätzliche' BindingSource' zu ​​verwenden (indem die 'DataTable' direkt an die' ListBox' gebunden wird)? –

+0

Ja, aber warum möchten Sie? Die 'BindingSource' existiert aus einem bestimmten Grund. – jmcilhinney

+1

Es war nur, weil ich 6-8 Tabellen binde, aber ich habe bereits eine Bindungsquelle für jede Tabelle verwendet. Danke nochmal :) –

Verwandte Themen