none
List mit ValueMember sortieren RRS feed

  • Frage

  • Guten Morgen.

    Irgendwie stehe ich gerade an. Folgender Code liefert eine Liste von Einträgen mit DisplayMember und ValueMember zurück, welche in der GUI in einer ComboBox angezeigt werden. Nun möchte ich diese Liste gern nach dem ValueMember bzw optional nach dem DisplayMember sortieren. Der Datentyp ergibt sich aber aus der jeweiligen DataColumn und ich weiß ihn vorher nicht. Wie stelle ich das am Besten an?

    DataColumn colV = result.Columns[valueMember];
    DataColumn colD = result.Columns[displayMember];
    
    return (from DataRow row in result.Rows select new ListEntry { DisplayName = GetDisplayValue(colDisplay, valueType, metadata, row[colD]), ValueMember = row[colV] }).ToList();
    
    

    Danke für Hinweise

    Matthias

    Freitag, 2. Dezember 2011 09:13

Antworten

  • Hallo Matthias,

    das einfachste wäre in Deinem Falle, die Select-Methode zu nutzen,
    und den Sort-Parameter mit valueMember bzw. displayMember zu versorgen.

    Entweder ergänzt Du zu result.Select("", valueMember)
    oder vorher wenn result bereits auf einem Select basiert.

    Die komplexere Variante wäre, sich einen eigenen Comparer zu bauen,
    was mir zwar als erstes in denn Sinn kam, aber doch einiges mehr an Aufwand bedeutet.

    Gruß Elmar

    Freitag, 2. Dezember 2011 10:24
    Beantworter
  • Hallo Matthias,

    exemplarisch für eine Sortierung nach valueMember:

    return (from DataRow row in result.Select("", valueMember) 
            select new ListEntry { DisplayName = GetDisplayValue(colDisplay, valueType, metadata, row[colD]), ValueMember = row[colV] })
            .ToList();
    
    

    Gruß Elmar

    Freitag, 2. Dezember 2011 10:41
    Beantworter

Alle Antworten

  • Hallo Matthias,

    das einfachste wäre in Deinem Falle, die Select-Methode zu nutzen,
    und den Sort-Parameter mit valueMember bzw. displayMember zu versorgen.

    Entweder ergänzt Du zu result.Select("", valueMember)
    oder vorher wenn result bereits auf einem Select basiert.

    Die komplexere Variante wäre, sich einen eigenen Comparer zu bauen,
    was mir zwar als erstes in denn Sinn kam, aber doch einiges mehr an Aufwand bedeutet.

    Gruß Elmar

    Freitag, 2. Dezember 2011 10:24
    Beantworter
  • Hallo Elmar.

    Das "result" ist eine System.Data.DataTable. Kannst Du das mit dem Select noch näher erläutern - hab ich leider nicht ganz verstanden.

    Matthias

    Freitag, 2. Dezember 2011 10:26
  • Hallo Matthias,

    exemplarisch für eine Sortierung nach valueMember:

    return (from DataRow row in result.Select("", valueMember) 
            select new ListEntry { DisplayName = GetDisplayValue(colDisplay, valueType, metadata, row[colD]), ValueMember = row[colV] })
            .ToList();
    
    

    Gruß Elmar

    Freitag, 2. Dezember 2011 10:41
    Beantworter
  • Super, Danke. Hat gut funktioniert. Für absteigende Reihenfolge hab ich dann einfach result.Select("", valueMember).Reverse() genommen.

    Danke

    Matthias

    Freitag, 2. Dezember 2011 10:56
  • Hallo Matthias,

    Du kannst bei Select direkt absteigend sortieren, in dem Du DESC angibst,
    ASC sortiert aufsteigend, ist aber optional, da Standard.

    Und dürfte etwas effizienter sein.

    Auch kannst Du mehrere Spalten als kommaseparierte Liste angeben.

    Sollten die Spaltennamen Leerzeichen oder Sonderzeichen enthalten,
    setze sie in eckige Klammern.

    Ein Beispiel: "[Spalte 1] ASC, [Spalte 2] DESC"

    Gruß Elmar

    Freitag, 2. Dezember 2011 11:38
    Beantworter
  • Hallo Elmar.

    Die Query selbst ist über eine eigene GUI konfiguriert, daher kann ich das nicht so einfach angeben. Aber in der ComboBox gibt es dann eh nur weniger Einträge. Daher ist .Reverse() da okay.

    Danke

    Matthias

    Freitag, 2. Dezember 2011 12:02
  • Hallo Matthias,

    das hängt hier nicht einer GUI, eine kleine Methode würde reichen ala:

            public static string BuildSortCriteria(string columnName, bool descending)
            {
                if (String.IsNullOrEmpty(columnName))
                    return String.Empty;
    
                string sort = "[" + columnName + "]" + ((descending) ? " DESC" : " ASC");
                return sort;
            }
    

    Gruß Elmar

    Samstag, 3. Dezember 2011 11:13
    Beantworter
  • Hallo Matthias Heise,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Freitag, 9. Dezember 2011 12:13
    Moderator