Problem mit DataGridView.Sort

02/03/2010 - 08:36 von Joelau | Report spam
Hallo,

ich habe ein Datentabelle erstellt und sie an ein DataGridView gebunden:

DataTable dataTable1 = new DataTable ("RealTimeData");
dataTable1.Columns.Add ("Time", typeof (double));
dataTable1.Columns.Add ("Col1", typeof (double));
dataTable1.Columns.Add ("Col2", typeof (double));

// Create a data binding source
BindingSource rtdBindingSource = new BindingSource ();
// Bind it to the data table
rtdBindingSource.DataSource = dataTable1;
// and to the dataGridView
dataGridView1.DataSource = rtdBindingSource;

dann noch einige Properties des GridView angepasst:

dataGridView1.Columns [0].HeaderText = "Time [s]";
dataGridView1.Columns [0].Frozen = true;
dataGridView1.Columns [0].SortMode =
DataGridViewColumnSortMode.Programmatic;
dataGridView1.Columns [0].AutoSizeMode =
DataGridViewAutoSizeColumnMode.ColumnHeader;

dataGridView1.Columns [1].HeaderText = "Column 1";
dataGridView1.Columns [1].SortMode =
DataGridViewColumnSortMode.NotSortable;
dataGridView1.Columns [2].HeaderText = "Column 2";
dataGridView1.Columns [2].SortMode =
DataGridViewColumnSortMode.NotSortable;

Wenn ich jetzt im GUI Werte in das Grid eingebe ist alles OK. Die Werte in
der Tabelle bleiben dort, wo sie eingegeben wurden, es erfolgt keine
automatische Sortierung. Jetzt möchte ich die Tabelle bzgl. der ersten Spalte
sortieren und habe dazu einen Button definiert. In der Click Callback
Funktion des Buttons wird folgende Codezeile ausgeführt:

dataGridView1.Sort (dataGridView1.Columns ["Time"],
ListSortDirection.Ascending);

Die Tabelle ist anschliessend korrekt sortiert. Jetzt kommt das Problem:
Wenn ich jetzt weitere Werte über das GUI in einer neuen Zeile in die
Tabelle eintrage, wird nach jeder Eingabe eines neuen Wertes, egal in welcher
Spalte die Eingabe erfolgt, die Tabelle automatisch neu sortiert. Was muss
ich tun, um dies zu verhindern? Ich habe auch schon versucht, die Sortierung
über die BindingSource durchzuführen:

rtdBindingSource.Sort = "Time ASC"
was aber auch keinen Erfolg bringt.

Wer hat eine Idee? Vielen Dank für jede Hilfe.

Gruß
Jörg
 

Lesen sie die antworten

#1 Marcel Roma
02/03/2010 - 18:43 | Warnen spam
Hallo Joelau,

Wenn ich jetzt im GUI Werte in das Grid eingebe ist alles OK. Die Werte in
der Tabelle bleiben dort, wo sie eingegeben wurden, es erfolgt keine
automatische Sortierung.



Da die BindingSource.DataSource in Deinem Fall eine DataTable ist, wird
letzten Endes an dataTable1.DefaultView gebunden.

Sobald die gebundene Datenquelle eine Sortierung unterstützt, delegiert das
DataGridView die Sortierung an diese weiter. Dabei wird nicht etwa die
DataTable, sondern die damit assoziierte DataView sortiert
(dataTable1.DefaultView.Sort="Time"). Die DataTable.Rows verbleiben in der
Originalreihenfolge, egal nach welcher Spalte man die DataView gerade
sortiert. Am Anfang ist dataTable1.DefaultView.Sort == null, darum wird
keine Sortierung wàhrend der initialen Dateneingabe angewandt.


Jetzt möchte ich die Tabelle bzgl. der ersten Spalte
sortieren und habe dazu einen Button definiert. In der Click Callback
Funktion des Buttons wird folgende Codezeile ausgeführt:

dataGridView1.Sort (dataGridView1.Columns ["Time"],
ListSortDirection.Ascending);



Und das wird dann daraus gemacht:
dataTable1.DefaultView.Sort="Time";

Die Tabelle ist anschliessend korrekt sortiert. Jetzt kommt das Problem:
Wenn ich jetzt weitere Werte über das GUI in einer neuen Zeile in die
Tabelle eintrage, wird nach jeder Eingabe eines neuen Wertes, egal in welcher
Spalte die Eingabe erfolgt, die Tabelle automatisch neu sortiert.



Ich glaube, dass da ein Mißverstàndnis vorliegt. Die Daten werden
ausschließlich gem. des eingegebenen Sortierungskriteriums sortiert.
Natürlich wird eine Zeile mit Null im Sortierfeld "Time" an die erste
Position verschoben, sobald man z.B. in einem der beiden anderen Felder
einen Wert übernimmt.


Was muss ich tun, um dies zu verhindern? Ich habe auch schon versucht,
die Sortierung über die BindingSource durchzuführen:

rtdBindingSource.Sort = "Time ASC"
was aber auch keinen Erfolg bringt.



Ist ja auch quasi-identisch mit dem was Du oben gemacht hast.

Wer hat eine Idee? Vielen Dank für jede Hilfe.



Vorschlàge:

So wie Du's angehst, geht's nicht: Der Eigenschaft
dataTable1.DefaultView.Sort wird entweder ein Wert zugewiesen (dann wird
die DataView *immer* entspr. sortiert), oder ihr wird kein Wert zugewiesen
(dann ist die Originalreihenfolge da). Einen dritten Zustand gibt es nicht.

1. Arbeite mit dem DataGridView im ungebundenen Modus und verwende Deinen
eigene Sortierung (DataGridView.SortCompare-Ereignis oder mit
IComparer-Implementierung).
http://msdn.microsoft.com/de-de/lib...71608.aspx

2. Wenn Du mit einer DataTable in einem verbindungslosen Kontext und mit
wenig Daten arbeitest, kannst Du einfach beim Klick auf 'Sortieren' eine
zweite DataTable erstellen und die Originaldaten in der durch
dataTable1.DefaultView.Sort angegebenen Reihenfolge kopieren. Dann kannst
Du diese zweite Tabelle an das DataGridView binden.

3. Wenn Du mit einer sortierbaren Collection statt dem DataTable arbeiten
kannst, dann könnte Dich vielleicht folgender Link interessieren (s.
letzten Beitrag von Linda Liu):

http://social.msdn.microsoft.com/Fo...cdf7574eb3

4. Verwende den virtuelle Modus für das DataGridView

5. Verwende Excel-àhnliche Spread-Komponenten von Drittherstellern wie
FarPoint.


Gruss
Marcel

Ähnliche fragen