Laden...

Fragen zum Sortieren

Erstellt von kstanger vor einem Jahr Letzter Beitrag vor einem Jahr 1.011 Views
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr
Fragen zum Sortieren

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?

Karl Stanger
3.825 Beiträge seit 2006
vor einem Jahr

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

D
152 Beiträge seit 2013
vor einem Jahr

Das Thema hatten wir doch vor kurzen
Verständnisprobleme mit BindingList

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

-> 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
            }

Karl Stanger
4.931 Beiträge seit 2008
vor einem Jahr

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).

3.825 Beiträge seit 2006
vor einem Jahr

-> 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

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

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.

Karl Stanger
T
2.219 Beiträge seit 2008
vor einem Jahr

@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.

4.931 Beiträge seit 2008
vor einem Jahr

@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.

F
10.010 Beiträge seit 2004
vor einem Jahr

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.

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

-> 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. 😠

Karl Stanger
4.931 Beiträge seit 2008
vor einem Jahr

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.

F
10.010 Beiträge seit 2004
vor einem Jahr

@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.

190 Beiträge seit 2012
vor einem Jahr
  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

@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.

Karl Stanger
16.807 Beiträge seit 2008
vor einem Jahr

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.