Combobox und eine Klasse die von List<string> erbt



  • Ich habe eine Klasse die von List<string> erbt in der ich ToString() überschrieben habe, aber wenn ich diese einer Combobox hinzufüge.Zeigt diese nur [Auflistung] an.Wie bringe ich die Combobox dazu den richtigen Text anzuzeigen?



  • Zeig mal die Überschreibung (Signatur) und stell mit dem Debugger sicher, das zum Zeitpunkt des Hinzufügens Deine Liste bei GetType() Deinen Typen zurück liefert.



  • Interessant, kann ich nachvollziehen. Nach welchen Gesichtspunkten holt sich die ComboBox denn den "default string value" (der laut MSDN angezeigt werden sollte)?

    Beispiel:

    public class Tester : List<String>
        {
            public override string ToString()
            {
                return string.Join(" ", ToArray());
            }
        }
    
    // in OnLoad eines Forms welches nur eine ComboBox besitzt:
    Tester t = new Tester();
    t.Add("Hallo");
    t.Add("Welt");
    
    System.Diagnostics.Debug.Print(t.ToString()); // "Hallo Welt"
    System.Diagnostics.Debug.Print(String.Format("{0}", t)); // "Hallo Welt"
    comboBox1.Items.Add(t); // "(Auflistung)"
    


  • Stimmt, kann ich auch nachvollziehen.
    Bei mir fügt er den gewollten Text nur ein, wenn ich folgenden Code verwende:

    comboBox1.Items.Add(t.ToString());
    


  • So mache ich es im Moment auch,aber dann muss mir die Liste nochmal raussuchen wenn ich sie verwenden will,statt einfach mit SelectedItem drauf zuzugreifen.



  • Workarround:

    Bau Dir nen Wrapper, der Deine Liste entgegen nimmt und ToString() von der Liste liefert. So kannst Du mit wenig Aufwand arbeiten und , wenn das Problem gefunden ist, zügig zurück switchen.



  • Knuddlbaer schrieb:

    Workarround:

    Bau Dir nen Wrapper, der Deine Liste entgegen nimmt und ToString() von der Liste liefert. So kannst Du mit wenig Aufwand arbeiten und , wenn das Problem gefunden ist, zügig zurück switchen.

    Einfacher geht es, wenn man ein 'DisplayMember' festlegt. Das muss allerdings eine Property sein, eine Methode geht nicht. Sollte aber kein Problem sein, wenn man folgenden Wrapper verwendet:

    string StringDisplay { get { return ToString(); } }
    


  • @Konrad:

    Thx - das ist wesentlich eleganter 🤡



  • Es geht übrigens noch viiiel einfacher: die 'FormattingEnabled'-Eigenschaft der Combobox auf 'false' setzen!



  • Kannst Du zufällig was darüber sagen was intern passiert ? Wenn ich die Liste direkt mit string.Format("{0}",x); verwende, kommt ToString(); bei raus.

    Dunkel leuchtet da noch ein TypeDescriptor auf, aber vllt. kannst Du aus dem FF ein paar Begriffe in den Raum werfen die das vom OP beschriebene erhellt.



  • Windows.Forms verwendet einen eigenen Formatter, der die 'DataMember'-Information in möglichst generischer Form verwendet, um aus der angegebenen Property eine lesbare Information zu extrahieren. Irgendwo auf dem Weg geht da aber was schief, weil da anscheinend diverse Sonderfälle abgeprüft werden. Ich habe mir jetzt keine Details angeschaut aber ich vermute, dass an einem Punkt auf den Spezialfall „Unterklasse von IList“ getestet wird.

    => Das Verhalten ist an sich ein Bug.


Anmelden zum Antworten