Hallo,
Nichts scheint hier einfach zu gehen. 🙁
Ich wollte das DataGridView sortieren: geht aber nur, wenn nicht gebunden.
-> ok ->
Dann versuche ich es mal mit der BindingSource:
private void ComboBoxTimingSortieren_SelectedIndexChanged(object sender, EventArgs e)
{
BindingSourceTiming.DataSource = Timings;
if (BindingSourceTiming.SupportsSorting != true)
{
MessageBox.Show(" no SupportsSorting");
}
switch (ComboBoxTimingSortieren.SelectedItem.ToString())
{
case "Uhrzeit, Led und Relais gemischt":
BindingSourceTiming.Sort = "Uhrzeit ASC";
break;
case "Uhrzeit Led, dann Uhrzeit Relais":
BindingSourceTiming.Sort = "Typ ASC, Uhrzeit ASC";
break;
case "Uhrzeit Relais, dann Uhrzeit Led":
BindingSourceTiming.Sort = "Typ DESC, Uhrzeit ASC";
break;
case "Led Uhrzeit, dann Relais Uhrzeit":
BindingSourceTiming.Sort = "Uhrzeit ASC, Typ ASC";
break;
case "Relais Uhrzeit, dann Led Uhrzeit":
BindingSourceTiming.Sort = "Uhrzeit ASC, Typ DESC";
break;
default:
BindingSourceTiming.Sort = "Uhrzeit ASC";
break;
}
}
Geht auch nicht, da das nicht supported wird. Dazu muss die "zugrunde liegende Liste eine IBindingList sein.
Meine zugrunde liegende Liste ist mit
public List<Timing> Timings;
definiert.
Wie komme ich denn jetzt zu einer IBindingList?
Kannst Du Deine Liste nicht mit List<T>.Sort() sortieren ?
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
-> BerndFfm: nein, not supported
-> david.m: ja, aber da kann ich nur eine BindingList erzeugen, und das gibt auch not supported
So habe ich es nochmal verifiziert:
BindingList<Timing> source = new BindingList<Timing>(Timings);
BindingSourceTiming.DataSource = source;
if (BindingSourceTiming.SupportsSorting != true)
{
MessageBox.Show(" no SupportsSorting"); // ergibt no SupportsSorting
}
Standardmäßig unterstützt eine BindingList<T>
auch keine Sortierung: SupportsSorting sowie ApplySortCore
Man müßte also selber eine Klasse davon ableiten, s.a. SortableBindingList mit Filterfunktionalität bestücken
Oder such mal generell nach SortableBindingList
.
PS: Weil mir das schon im anderen Beitrag von dir aufgefallen ist: es ist keine guter Code, den switch
anhand der UI-Texte durchzuführen (was passiert bei Übersetzungen?) - besser wäre entweder der Index oder eine eigene Aufzählung (enum
).
-> BerndFfm: nein, not supported
In Xamarin.Forms wird es leider auch nicht supported so wie ich es gebraucht hätte.
Schnell ein Bubble Sort geschrieben, das klappt gut :
private void SortDevices(ref List<ListDevice> devices)
{
if (devices.Count < 2) return;
for (int j = 0; j < devices.Count - 1; j++)
for (int k = j + 1; k < devices.Count; k++)
if (IsGreater(devices[k], devices[j]))
{
ListDevice tdev = devices[j];
devices[j] = devices[k];
devices[k] = tdev;
j = 0;
}
}
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Das habe ich mir auch schon überlegt, so als Plan B.
Danke, dass du es hier schon dargestellt hast, spart mir etwas Aufwand.
Andererseits ist es ein schwaches Bild von den UI-Entwicklern, ein DataGridView zu entwickeln (was ja an Excel erinnern soll) und dort die Funktionalität des Sortierens (was ich als Basic sehe) so zu machen, dass sie eigentlich nicht in das Gesamtkonzept passt und daher nur mit großer Mühe (wenn überhaupt) zu programmieren ist.
@BerndFfm
Kleine Anmerkung zu der SortDevices Methode.
Das ref kann hier beim Parameter entfallen, da die Referenz auf die Liste nicht geändert wird also nicht überschrieben oder genullt wird.
Auch wenn die die Werte innerhalb der Liste änderst, brauchst du kein ref solange du die Instanz nicht überschreibst.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
@BerndFfm: Warum denn jetzt Bubblesort?
Dein vorheriger Vorschlag müßte doch auch funktionieren:
Timings.Sort();
BindingSourceTiming.DataSource = new BindingList<Timing>(Timings); // und neu zuweisen
Bei einer sehr großen Liste könnte man sicherlich noch optimieren.
Wenn man diese Funktionalität jedoch öfter braucht, dann sollte man trotzdem besser eine SortableBindingList<T>
benutzen.
PS: Für verschiedene Sortierungen, kann dann Sort(Comparison<T>) benutzt werden.
Andererseits ist es ein schwaches Bild von den UI-Entwicklern, ein DataGridView zu entwickeln (was ja an Excel erinnern soll) und dort die Funktionalität des Sortierens (was ich als Basic sehe) so zu machen, dass sie eigentlich nicht in das Gesamtkonzept passt und daher nur mit großer Mühe (wenn überhaupt) zu programmieren ist.
Sorry, das liegt nicht an MS sondern daran, daß Du bis jetzt die Grundlagen der SW Architektur nicht verstanden hast.
Das DGV erlaubt das Sortieren, bietet ja extra die Bedienung dieser Schnittstelle an. Das DU dann die falsche Liste nimmst,
ist weder ein MS noch ein DGV problem.
Wie hier schon oft gesagt wurde, nicht erst machen, auf die Schn...e fallen und dann beschweren, sondern endlich mal anfangen
die Grundlagen zu erlesen.
Das spart Dir viel Zeit und Frust.
-> TH69: das mit den Texten bei Switch werde ich ändern.
-> TH69: BindingSourceTiming.DataSource = new BindingList<Timing>(Timings); ergibt "not supported"
-> FZelle: falsche Liste - welche Liste soll ich denn nehmen?
ich brauche doch eine IBindingList, oder?
Das haben wir diskutiert und festgestellt, dass es nicht (?) geht.
https://mycsharp.de/forum/threads/124985/verstaendnisprobleme-mit-bindinglist
Also bleibt die Frage, wie das gehen soll, wenn ich die richtige Liste nicht nehmen kann. Dazu brauche ich einen Vorschlag; sonst bleibt mir doch nur das BubbleSort. 😠
Noch mal genauer erklärt: entweder du nimmst eine SortableBindingList<T>
, und dann kannst du das Sortieren mittels Sort
-Eigenschaft durchführen (dein bisheriger Code) oder aber du sortierst die zugrundeliegende Liste Timings
und entfernst deinen restlichen Code.
@kstanger
Ich habe mal zum Spass bei google "datagridview bindinglist sort" eingegeben.
Der erste Link geht zu datagridview-sort-and-e-g-bindinglistt-in-net
Und da dann die erste Antwort verweist auf die MSDN, also die Doku von MS.
https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/ms993236(v=msdn.10)
Und da ist es haar klein erklärt.
@FZelle
404 - Page not found
https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/ms993236(v=msdn.10)
@Th69:
In der Doku zu SortableBindingList steht:
This content has been retired and may not be updated in the future. The product, service, or technology mentioned in this content is no longer supported.
Also werde ich doch die zugrunde liegende Liste Timings sortieren, es sei denn jemand, der die Grundlagen so richtig versteht (z.B. FZelle), bringt mir die richtige Liste, mit der das dann alles kein Problem ist.
This content has been retired and may not be updated in the future. The product, service, or technology mentioned in this content is no longer supported.
ist ein genereller Hinweis, weil der Blogbeitrag 18 Jahre alt ist.
Aber Du arbeitest auch mit einer 20 Jahre alten Technologie, die sich nicht grundlegend geändert hat. Es steht alles im Artikel, was Du brauchst.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code