Entwickler-Ecke

WinForms - ListView.Add Abfrage


Delete - Di 23.08.16 19:37
Titel: ListView.Add Abfrage
Hallo Community,
ich habe verschiedene userControls, die alle per delegate mit der Methode x verbunden sind. Von den einzelnen UserControls, möchte ich nun ListViewItems in die ListView einfügen. Dabei darf das SubItem [3] nicht 2mal vorkommen.

Mein Lösungsansatz:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private void x(string Typ, string Beschreibung, string Pfad, string Nameimprojekt)
        {
            foreach (ListViewItem item in liste.listView1.Items)
            {
                if (item.SubItems[3].Text != Nameimprojekt)
                {
                    ListViewItem i = new ListViewItem(Typ);
                    i.SubItems.Add(Path.GetExtension(Pfad));
                    i.SubItems.Add(Pfad);
                    i.SubItems.Add(Nameimprojekt);
                    i.SubItems.Add(Beschreibung);
                    liste.listView1.Items.Add(i);
                }
                else
                {
                    MessageBox.Show("Es gibt bereits ein Importmedium, was den selben Namen hat. Bitte geben Sie einen anderen Namen ein.""Name vergeben", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                }
            }
        }


Ich denke mal, es liegt noch daran, dass keine Items in der LV sind. Wie kann ich dieses Problem lösen?


Christian S. - Di 23.08.16 19:50

Ich verstehe ehrlich gesagt nicht, was Du versuchst zu erreichen und was dabei nicht funktioniert :gruebel:


Palladin007 - Di 23.08.16 19:54

Du hast kein Problem dazu geschrieben bei dem Du Hilfe brauchst ;)

Ich denke, Du möchtest eine Liste haben, wo der Wert, der in SubItem[3] steht, eindeutig sein soll, oder?

Dein Code hat dabei eine ganz gewaltige Schwachstelle:
Nehmen wir an, Du hast 10 Items, eines davon hat den Namen, der neu dazu kommen soll.
Du läufst dann jedes Item durch und wenn das den Namen nicht hat, wird ein Item hinzu gefügt.
Das Resultat: Zu den 10 Items kommt 9 mal das neue Item hinzu, am Ende hast Du also 8 Items zu viel und den Namen, der eindeutig sein soll, 10 mal in der Liste vorhanden.

Ich würde es eher so lösen:
Du legst eine List<string> an.
Wenn Du durch die vorhandenen Items gehst, dann fügst Du dieser Liste den Name jedes Items (bzw. SubItem[3]) hinzu.
Danach hast Du alle bereits vorhandenen Namen in dieser Liste und kannst mit Contains prüfen, ob es den neuen Namen bereits gibt.

Oder als LINQ-Lösung:
Du castest die Items mit Cast in den richtigen Typen (Da die meisten Auflistungen bei WinForms untypisiert sind) und machst anschließend ein Select auf den Text von SubItem[3].
Am Ende hast Du eine Auflistung aller vorhandenen Namen und kannst anschließend ein Contains machen.
Ist geschmackssache, ich mag LINQ ganz gerne und würde es auch hier nutzen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
var existingNames = liste.listView1.Items.Cast<ListViewItem>().Select(item => item.SubItems[3].Text);

if (existingNames.Contains(Nameimprojekt))
    // Fehlermeldung
else
    // Hinzufügen