PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [.Net/VB 2005] BindingSource.EndEdit "vergisst" Änderungen


Iceman346
2010-03-03, 13:08:06
Folgendes Problem: Ich habe eine Tabelle in einer Datenbank welche eine Spalte "intPosition" besitzt. Diese nutze ich um den Inhalt der Tabelle bei der Ausgabe in einer bestimmten Reihenfolge zu sortieren.

Die Tabelle ist über eine BindingSource in das VB2005 Programm eingebunden. Im Programm habe ich eine DataGridView, die über eine Abfrage der Datenbank gefüllt wird. In dieser Abfrage ist die Sortierung über die Position enthalten.

Über das GUI des Programmes möchte ich nun die üblichen Knöpfe zum Verändern der Reihenfolge zur Verfügung stellen, also die Möglichkeit einen Eintrag nach oben und unten zu verschieben bzw. diesen an den Anfang bzw. ans Ende der Ausgabe zu stellen. Beim Drücken eines der Knöpfe soll also die Positionsspalte der Tabelle überarbeitet werden, so dass die Änderung dann entsprechend umgesetzt ist.

Meine Vorgehensweise war nun folgendermaßen:
- Ich hole mir die Position der vom User markierten Zeile
- Ich gehe sämtliche Einträge der Binding Source durch und bearbeite die Position jedes Eintrags falls nötig
- Ich rufe die EndEdit() Funktion der BindingSource auf, welche die Änderungen in das DataSet übernehmen sollte
- Mit TableAdapter.Update schreibe ich die Änderungen in die Datenbank
- Über das TableAdapter.Fill der Abfrage lese ich die Einträge neu ein und dementsprechend ändert sich der Inhalt der DataGridView

Als Beispiel mein Code um den Eintrag an die erste Position zu stellen:
If sender.Equals(ButtonFirst) Then
If pos > 1 Then
For i As Integer = 0 To TabBearbBindingSource.Count - 1
If TabBearbBindingSource.Item(i)("intPosition") < pos Then
TabBearbBindingSource.Item(i)("intPosition") = TabBearbBindingSource.Item(i)("intPosition") + 1
ElseIf TabBearbBindingSource.Item(i)("intPosition") = pos Then
TabBearbBindingSource.Item(i)("intPosition") = 1
End If
Next

Dim Msgboxstring = ""
For i As Integer = 0 To TabBearbBindingSource.Count - 1
Msgboxstring = Msgboxstring & "i: " & i & " Position: " & TabBearbBindingSource.Item(i)("intPosition") & " DauerStunden: " & TabBearbBindingSource.Item(i)("dblDauerStunden") & vbNewLine
Next

MsgBox(Msgboxstring)

TabBearbBindingSource.EndEdit()
TabBearbTableAdapter.Update(SpeicherDataSet.tabBearb)
Me.QryMasterTableAdapter.Fill(Me.SpeicherDataSet.qryMaster)
End If

In pos ist dabei die Anfangsposition der ausgewählten Zeile gespeichert. Im Endeffekt schaue ich also ob die Position des i-ten Eintrags kleiner ist als die Anfangsposition, erhöhe die Position um 1 falls ja und setze die Position des markierten Eintrags auf 1.

In der MsgBox die ich darunter ausgeben lasse ist auch alles in Ordnung, wenn ich nach Ende des Ablaufs aber in meine Datenbank hinein schaue ist dort der letzte Eintrag nicht angepasst, die markierte Zeile hat also keinen neuen intPosition Eintrag bekommen, obwohl dieser in der BindingSource geändert wurde.

Auswirkungen also quasi bildlich dargestellt:
Eintrag1 -> Position 1
Eintrag2 -> Position 2

Dann soll Eintrag2 nach ganz oben verschoben werden

Ausgabe in der MsgBox:
Eintrag1 -> Position 2
Eintrag2 -> Position 1

Eintrag in der Tabelle:
Eintrag1 -> Position 2
Eintrag2 -> Position 2

Außer das die EndEdit Funktion irgendwie buggy ist hab ich momentan absolut keine Erklärung für das Verhalten. Hat jemand sich schonmal mit sowas beschäftigt und kann mir sagen ob ich irgendwas falsch gemacht habe?