Autor Beitrag
Früchstückskaffee
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 23.08.16 19:37 
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:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 23.08.16 19:50 
Ich verstehe ehrlich gesagt nicht, was Du versuchst zu erreichen und was dabei nicht funktioniert :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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:

ausblenden 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