Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Fragen zum Sortieren
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

Fragen zum Sortieren

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.811
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden


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
private Nachricht | Beiträge des Benutzers
david.m
myCSharp.de - Member



Dabei seit:
Beiträge: 143

beantworten | zitieren | melden

Das Thema hatten wir doch vor kurzen
Verständnisprobleme mit BindingList
private Nachricht | Beiträge des Benutzers
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

-> 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
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.581

beantworten | zitieren | melden

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).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.811
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

Zitat von kstanger
-> 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
private Nachricht | Beiträge des Benutzers
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.086
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.581

beantworten | zitieren | melden

@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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.998

beantworten | zitieren | melden

Zitat von kstanger
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.
private Nachricht | Beiträge des Benutzers
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

-> 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
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.581

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.998

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 169
Herkunft: Radeberg

beantworten | zitieren | melden

@FZelle
404 - Page not found

https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/ms993236(v=msdn.10)
- 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
private Nachricht | Beiträge des Benutzers
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 96

Themenstarter:

beantworten | zitieren | melden

@Th69:
In der Doku zu SortableBindingList steht:
Zitat
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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.301

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers