SelectedRow vs. sortieren DataGridView

31/08/2008 - 12:06 von Maik Weiß | Report spam
Hallo NG,

1. Frage:

ich habe ein Problem mit dem Sortieren eines DGV.
z.B. habe ich ein DGV mit einer DataSource=DataTable
(es können auch Index-Spalten in diesem DGV ausgeblendet sein)
Nun markiere ich eine Zeile und klicke auf einen Spaltenkopf
um das DGV neu zu sortieren, aber leider bleibt die zuvor
selektierte Zeile nicht die gleiche. Wie löst man das, dass
nach dem Sortieren auch noch die gleiche Zeile markiert ist?


2. Frage:

Nach dem Ereignis DataSourceChanged möchte ich ebenfals
die zuvor markierte Zeile wieder als SelectedRow bzw. CurrentRow
erhalten (es sei denn sie wurde gelöscht).
Dabei soll ebensfalls Rücksicht auf die zuvor eingestellte Sortierform
(Asc. oder Desc.) genommen werden sowie auf die entsprechende (vor dem
DataSourceChanged) sortierte Spalte.
Wie kann man das lösen?

Viele Grüße
Maik
 

Lesen sie die antworten

#1 Peter Götz
31/08/2008 - 14:45 | Warnen spam
Hallo Maik,

ich habe ein Problem mit dem Sortieren eines DGV.
z.B. habe ich ein DGV mit einer DataSource=DataTable



Tatsàchlich ist die DataSource für Dein Grid in diesem
Fall ein DataView-Objekt, welches implizit erzeugt worden
ist und das Bindeglied zwischen Deinem DataGridView und
dem eigentlichen Datenspeicher, der DataTable dient.
Diese DataView ist vereinfacht ausgedrückt eine Liste
von Zeigern, von denen jeder auf einen bestimmten
Datensatz in der DataTable verweist. Beim Ändern der
Sortierung durch einen Klick auf einen Spaltenkopf im
Grid ànderst Du nicht die Reihenfolge der Datensàtze
in der DataTable (die bleibt von der Sortierung völlig
unberührt) sondern ledliglich die Reihenfolge der Zeiger
in der DataView.

(es können auch Index-Spalten in diesem DGV
ausgeblendet sein) Nun markiere ich eine Zeile und
klicke auf einen Spaltenkopf um das DGV neu zu
sortieren, aber leider bleibt die zuvor selektierte
Zeile nicht die gleiche.



Es bleibt schon die gleiche Zeile. Wenn Du z.B.
im Grid die 3. Zeile von oben auswàhlst und nun
durch einen Klick auf einen Spaltenkopf die Sortierung
ànderst, dann ist danach immer noch die 3. Zeile von
oben ausgewàhlt. Nur verweist diese Zeile eben nicht
mehr auf den Datensatz in der zugrundeliegenden
DataTable, auf den sie vor der Sortierungsànderung
verwiesen hat.

Wie löst man das, dass nach dem Sortieren auch noch
die gleiche Zeile markiert ist?



Du musst Dir ganz einfach vor dem Sortieren merken,
welches der gerade aktuelle Datensatz war und diesen
nach dem Sortieren wieder suchen.

Wie das in konkretem Code aussehen kann, siehst Du
im Beispiel unter

www.gssg.de -> Visual Basic -> VB.net
-> "DataView.Sort, DataView.Find"

Nach dem Ereignis DataSourceChanged möchte ich
ebenfals die zuvor markierte Zeile wieder als
SelectedRow bzw. CurrentRow erhalten (es sei
denn sie wurde gelöscht).



Auch hier musst Du erst mal definieren, was Du unter
der "zuvor markierten Zeile" verstehst. Ist es wieder die
dritte von oben, die beispielsweise vor DataSourceChanged
markiert war oder soll es die Zeile sein, welche auf den
Datensatz zeigt, welcher in der zuvor markierten Zeile
zu sehen war?


Dabei soll ebensfalls Rücksicht auf die zuvor eingestellte
Sortierform (Asc. oder Desc.) genommen werden sowie
auf die entsprechende (vor dem DataSourceChanged)
sortierte Spalte.
Wie kann man das lösen?



Genauso wie schon oben beschrieben. Um einen
bestimmten Datensatz wieder zu finden, musst Du Dir
diesen DS merken um ihn danach wieder suchen und
finden zu können. Bei der Art der Sortierung ist es nicht
anders. Bisherige Sortierung merken und danach wieder
wie gemerkt einstellen.

Alles eigentlich ganz einfach. Du musst nur erst mal
verstanden haben, dass zwischen Deiner DataTable
und dem Grid noch ein weiteres Objekt, nàmlich eine
DataView, liegt, welche u.a. für das Sortieren der
Datensàtze zustàndig ist.

Unter

www.gssg.de -> Visual Basic -> VB.net

gibt es noch eine ganze Reihe weiterer Beispiele mit
dem DataGridView und auch mit dem àlteren DataGrid.
Datenquelle ist dabei meist eine DataTable und
DataGridView.DataSource bzw. DataGrid.DataSource
ist eine in diesen Beispielen explizit zur DataTable
erzeugte DataView.

Neben DataTable und DataView gibt es noch ein
weiteres grundlegendes Objekt, den CurrencyManager,
von dem Du gar nichts bemerkst, wenn Du Deine
Anwendung einfach nur im Designer zusammenklickst.

Das Zusammenspiel zwischen DataTable, DataView,
CurrencyManager und einem an die DataView
gebundenen Grid oder auch einem anderen Control
solltest Du erst mal verstanden haben, dann ist auch
das Wiederauffinden eines bestimmten Datensatzes
nach Änderung der Sortierung kein Problem mehr.

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

Ähnliche fragen