Windows.Forms.DataGridView Änderungen speichern ohne Zeile zu wechseln

10/10/2008 - 22:40 von Lutz Elßner | Report spam
Ich habe mit dem Assistent auf ein Windows Form ein DataGridView gezogen
und mit einer Datenbank verbunden (DataSet, TableAdapter, BindingSource ...)

das sind die einzigen Code Zeilen:

Public Class Form2
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.AdressenTableAdapter.Fill(Me.reisenDataSet.Adressen)
End Sub

Private Sub SpeichernToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
SpeichernToolStripButton.Click
Me.AdressenTableAdapter.Update(Me.reisenDataSet.Adressen)
End Sub
End Class

Nun werden Änderungen beim klicken auf den Button auch zurück geschrieben.
Jedoch muss man die geànderte Zeile verlassen (auf eine andere Zeile klicken) bevor man den Button zum speichern klickt.

Standardmàßig wird die Änderung im Control erst bei Navigation ins DataSet geschrieben, nicht wenn man sofort außerhalb klickt.

Mit welchem Trick ist es möglich, den Cursor in der geànderten Zelle stehen zu lassen, und die Änderung trotzdem immer zu
übernehmen.
Entweder durch sofort speichern klicken oder auch beim schließen des Formulars soll die Änderung immer zurück geschrieben werden.

Es soll funktionieren "wie bei Access", da kann man mittendrin das Formular schließen und die Daten werden trotzdem geàndert.
Beim SSMSE wird auch jede Änderung übernommen, ohne die geànderte Zeile zu wechseln.

Lutz
 

Lesen sie die antworten

#1 Peter Götz
11/10/2008 - 20:46 | Warnen spam
Hallo Lutz,

Ich habe mit dem Assistent auf ein Windows Form
ein DataGridView gezogen und mit einer Datenbank
verbunden (DataSet, TableAdapter, BindingSource ...)



Eine verführerisch einfach erscheinende Methode,
aber halt auch eine, bei der man nicht unbedingt
sieht und versteht, was der dabei automatisch erzeugte
Code wirklich macht.

Schau Dir mal das Beispiel unter

www.gssg.de -> Visual Basic -> VB.net
-> DataTable / DataView, RowState

an um eine Vorstellung davon zu bekommen
wie das DataGridView über das "Bindeglied"
DataView mit einer DataTable zusammenarbeitet
bzw. interagiert.

Wenn der Benutzer in einem DGV neue Daten
eintràgt, oder vorhandene Daten àndert, ist es
meist sinnvoll, diese Daten erst mal auf Plausibilitàt
und / oder formale Richtigkeit zu prüfen und abhàngig
vom Ergebnis dieser Prüfung zu entscheiden, ob
die Daten wirklich in die DataTable übernommen
werden sollen oder eben nicht.

Das DGV bietet dazu mehrere Ereignisse an.
Das erste wàre DGV_CellValidating, welches
ausgelöst wird, wenn die im Grid gerade ausgewàhlte
Zelle verlassen wird. Das kann durch einen Wechsel
in eine andere Zelle ausgelöst werden aber auch durch
einen Klick auf irgendeinen Button oder auch durch
Schliessen der zugehörigen Form.

Dann gibt es noch ein Ereignis DGV_RowValidating
das ausgelöst wird, wenn die im Grid gerade akt.
Zeile verlassen wird. Auch hier wieder entweder
durch Wechsel zu einer anderen Zeile oder eben
durch einen Klick auf ein anderes Control (z.B. Button)
oder Schliessen der Form.

Und zuletzt wird auch noch das Ereignis DGV_Validating
ausgelöst, wenn das Grid insgesamt den Focus verliert,
weil z.B. auf ein anderes Control (z.B. Button) geklickt
oder die Form geschlossen wird.

In jedem dieser Ereignisse gibt es eine Abbruchmöglichkeit
indem man e.Cancel = True setzt.
In DGV_CellValidating könnte z.B. die Prüfung des akt.
Zellinhaltes erfolgen und je nach Prüfungsergebnis z.B.
die Übernahme der geànderten Daten in die Datatable
erfolgen und ein Wechsel zu einer anderen Zelle oder
Zeile zugelassen oder eben durch Setzen von
e.Cancel = True verhindert werden.
Der Code im o.g. Beispiel in der Sub DGV_CellValidating
verdeutlicht das.
Zum Ausprobieren kannst Du im o.g. Beispiel einfach mal
in eine der Spalten "Wert1" oder "+Wert2" einen nicht
numerischen Wert (z.B. "Hallo") schreiben und dann auf
eine andere Zelle in der selben Zeile, auf eine andere
Zeile oder auch auf z.B. einen der im Beispiel vorhandenen
Buttons, einen der RadionButtons oder auf den Form-Schliessen-
Button klicken. Jede dieser Aktionen löst DGV_CellValidating
aus und dort wird wg. gerade eingegebenen "nicht numerischen"
Wertes eine Exception mit einer nachfolgenden Message-
Box ausgelöst und die betr. fehlerhaft ausgefüllte Zelle
behàlt den Focus.

Ein Klick auf Deinen Speicher-Button löst auch das
_CellValidating-Ereignis aus und kann nach erfolgter
Prüfung und Übernahme der Daten in die DataTable
dann auch letztlich das Speichern der neuen oder
geànderten Daten in die Datenbank via
DataAdapter.Update auslösen.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen