Benutzer mit den meisten Antworten
BindingSource: Wie selektierten Datensatz beibehalten bei Umsortierung?

Frage
-
Hallo,
Wenn ich in einer BindingSource zur Laufzeit die Sortierung ändere, so wird der grade selektierte Datensatz auch geändert, und zwar auf die entsprechende Listenposition wie vorher, wo jetzt aber ein anderer Datensatz steht.
Ich will aber den selektierten Datensatz beibehalten und von ihm aus mit der neuen Sortierung weiter navigieren. Wie mache ich das?
Gruß,
WiWo
Antworten
-
Hallo,
beim Sortieren (wie auch beim Filtern) wird die Liste zurückgesetzt, womit nicht nur Position verloren geht - das Verhalten ist entspricht einem Zuweisen der Datenquelle.
Um wieder auf die ursprünglichen Datensatz (an neuer Position) zu kommen, kannst Du die BindingSource.Find Methode verwenden - vorausgesetzt Du hast eine IBindingList (wie DataView, BindingList(T)). Merke Dir vor dem Sortieren den eindeutigen Schlüssel und wende ihn danach an. Gibt es keinen eindeutigen Schlüssel, so landest Du auf dem ersten Eintrag mit übereinstimmenden Wert.
Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 12. Oktober 2012 12:37
-
Hallo,
Du kannst die Bindung mit SuspendBinding temporär unterbrechen und wenn das Sortieren (bzw. Filtern) und Positionieren beendet ist, mit ResumeBinding wieder herstellen. Bei Grids muss man ggf. auch RaiseListChangedEvents zwischenzeitlich auf false setzen (siehe Hinweise bei ResumeBinding).
Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 12. Oktober 2012 12:37
Alle Antworten
-
Hallo,
beim Sortieren (wie auch beim Filtern) wird die Liste zurückgesetzt, womit nicht nur Position verloren geht - das Verhalten ist entspricht einem Zuweisen der Datenquelle.
Um wieder auf die ursprünglichen Datensatz (an neuer Position) zu kommen, kannst Du die BindingSource.Find Methode verwenden - vorausgesetzt Du hast eine IBindingList (wie DataView, BindingList(T)). Merke Dir vor dem Sortieren den eindeutigen Schlüssel und wende ihn danach an. Gibt es keinen eindeutigen Schlüssel, so landest Du auf dem ersten Eintrag mit übereinstimmenden Wert.
Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 12. Oktober 2012 12:37
-
Hallo, beispielsweise so hier:
object item = listBox1.SelectedItem; listBox1.Items.Insert(0, "Item"); listBox1.SelectedItem = item;
Basiert natürlich darauf, das jedes Item einmalig in der Liste ist.Koopakiller - http://koopakiller.ko.ohost.de/
-
Hallo Koopakiller,
Dein Vorschlag hat leider nichts mit meiner Aufgabenstellung zu tun. Ich hab eine BindingSource, die ihre Daten aus einer DataTable bezieht und an diverse TextBoxen weiterreicht. Die Form wird zur Wahl eines Kunden benutzt, auf einem Mobilterminal. Die zuletzt angetippte R/O-Textbox erhält eine andere Farbe und die zugehörige Tabellenspalte bestimmt dann die Suchreihenfolge für MoveFirst-, MovePrev-, MoveNext- & MoveLast-Buttons.
Gruß,
WiWo
-
Ich hab das mit der Find-Methode mal umgesetzt (die Tabelle hat einen Primär-Index). Es funktioniert, braucht aber auf dem Mobil-Terminal jeweils etwa 1/2 Sekunde extra, was etwas schade, aber grad noch vertretbar ist.
Allerdings werden innerhalb dieser halben Sekunde die falschen Werte erstmal angezeigt, danach springt die Anzeige wieder zu den richtigen, wie sie vorher schon da standen.
Wie kann ich erreichen, dass es zwischen Umsortierung bis zur Beendigung des Finds keinen Screen-Update gibt? SuspendLayout()/ResumeLayout() funktionieren dafür nicht. Irgendwelche Double-Bufferings gibts in den Mobile-Forms auch nicht.
Gruß,
WiWo
-
Um die zwischenzeitliche Falsch-Anzeige zu unterdrücken, hab ich jetzt vor der Umsortierung für alle Elemente DataBindings.Clear() gemacht und nach der richtigen Positionierung dann wieder gesetzt. Das funktioniert gut, aber lässt sich das eventuell auch einfacher gestalten?
Gruß,
WiWo
-
Hallo,
Du kannst die Bindung mit SuspendBinding temporär unterbrechen und wenn das Sortieren (bzw. Filtern) und Positionieren beendet ist, mit ResumeBinding wieder herstellen. Bei Grids muss man ggf. auch RaiseListChangedEvents zwischenzeitlich auf false setzen (siehe Hinweise bei ResumeBinding).
Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 12. Oktober 2012 12:37
-
Hallo Elmar,
die beiden Methoden von BindingSource hatte ich bislang übersehen.
Allerding arbeiten sie, wie ich jetzt bei Tests gesehen habe, nicht so wie gewünscht. Sie sind wohl tatsächlich nur gedacht für Fälle, bei denen in den gebundenen Controls eine Reihe Datenmanipulationen gemacht werden und nur am Schluss wieder mit der BindingSource abgeglichen werden, nicht aber für den umgekehrten Fall, dass Manipulationen an der Bindingsource vorübergehend die Controls unbeeinflusst lassen sollen. Es sieht so aus, als ob die Bindung von BindingSource zur eigentlichen Datenquelle mit SuspendBinding auch unterbrochen ist. Zumindest mit dem Compact Framework ist das so. Aber trotzdem Danke für den Tipp.
Gruß,
Winfried
-
Hallo WiWo,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.