Warum überschreibt -> ListViewItem.Name -> ListViewSubItem[0].Name



  • Warum überschreibt -> ListViewItem.Name -> ListViewSubItem[0].Name, dass macht für mich irgendwie keinen Sinn, wenn ich zum Beispiel mit
    IndexOfKey() arbeitet, welches den Namen nutzt, um das richtige Element zu finden, folgendes Beispiel:

    ListViewItem1.Name = "@key1";
    ListviewSubItem1.Name = "Text":
    ListviewSubItem2.Name = "Kommentar"
    ListViewItem2.Name = "@key2";
    ListviewSubItem1.Name = "Text":
    ListviewSubItem2.Name = "Kommentar"
    ListViewItem3.Name = "@key3";
    ListviewSubItem1.Name = "Text":
    ListviewSubItem2.Name = "Kommentar"
    ListViewItem4.Name = "@key4";
    ListviewSubItem1.Name = "Text":
    ListviewSubItem2.Name = "Kommentar"

    Jetzt will ich das SubItem mit den Namen "Text" vom dritten ListViewItem haben

    int idx mMyListView.Items.IndexOfKey("@key3");
    int idx2 = mMyListView.Items[idx].subItems.IndexOfKey("Text");
    mMyListView.Items[idx].subItems[idx2]
    

    Das funktioniert nicht weil, "Name" vom ListViewItem immer vom SubItem überschrieben wird. Warum speichern die das nicht separat für ListViewItem und ListViewSubItem
    Vielleicht interpretiere ich das auch falsch mit den IndexOfKey,Name und dessen Verwendung:(



  • Das Problem wird hier darin liegen, das wenn du ein ListView-Item anlegst, das erste SubItem also Index[0] sofort angelegt wird. - Es ist quasi der Master im Item. Setzt du zum Beispiel ListViewItem.Text, wird dieser auf das erste SubItem ebenfalls übernommen.



  • Ja das ist schon etwas komisch.
    Bei .Text ist es verständlich und auch irgendwie logisch. Das ListViewItem soll ja keine selbst Daten halten, die sollen in den SubItems drinnen stecken. Macht Sinn.

    Bei .Name, bzw. allgemein Feldern die als "Key" verwendet werden, finde ich es komisch. Weil da geht's ja um die "Identität" des Objekts. Und das Item ist halt nicht das SubItem.

    Als Lösung fällt mir nur ein das Tag Feld zu verwenden (hoffentlich ist das nicht auch mit dem ersten Subitem geshared!) und sich ne eigene IndexOfTag Funktion zu basteln.



  • Ich hab mir mal die Sourcen von dotnetframework.org/ angeschaut, allerdings weiß ich nicht wie aktuell die sind, da ist es aber in der Tat so, dass die Property im ListViewItem einfach durchreicht wird. Meiner Meinung nach nicht korrekt ist.

    public string Name {
                get {
                    if (SubItemCount == 0) {
                        return string.Empty;
                    }
                    else {
                        return subItems[0].Name;
                    }
                }
                set {
                    SubItems[0].Name = value;
                }
            }
    

    zum Vergleich die Mono-Implementierung, die separat speichert:

    public string Name {
                            get {
                                    return name;
                            }
                            set {
                                    name = value == null ? String.Empty : value;
                            }
    }
    

    Zu allem Überfluss ist die indexofkey nicht case sensitiv, was ich auch total behämmert finde aber naja... 😡



  • Hm, Spontan würde ich mir eine Klasse vom ListViewItem ableiten und die benötigten Properties (Name ...) so implementieren, das der Name des Items keinen Einfluss auf das SubItem hat und umgekehrt. Also quasi so wie es die Mono-Version macht.



  • Was soll ihm das bringen?



  • Das gleiche wie die Verwendung des Tags? Mit dem Unterschied, das Name und SubItem[0].Name dann die korrekten Werte haben? Und nicht wie im Framework vorhanden beide den Namen des SubItems.



  • Mir wäre neu dass ListViewItem.Name virtual wäre.
    Und ohne das sehe ich nicht wie die Sache funktionieren soll.


Anmelden zum Antworten