Laden...

Objekte in Schleife erstellen und ausserhalb der Schleife darauf zugreifen

Letzter Beitrag vor 8 Jahren 6 Posts 3.298 Views
Objekte in Schleife erstellen und ausserhalb der Schleife darauf zugreifen

Ich bin dazu gezwungen meine Objekte in einer For-Schleife in einer Funktion als Parameter zu erstellen, kann dann jedoch nicht auf diese zugreifen. Der Code sieht in etwa so aus:

supercooleListe.Items.Add( new ListItem { Name = "listItem1" } )

Wenn ich dann außerhalb der For-Schleife auf das neue ListItem zugreifen will bekomme ich die Fehlermeldung dass der Compiler das Objekt "listItem1" nicht kennt. Wie kann ich auf als Parameter erstellte Objekte zugreifen? 🤔

Wie greifst du denn darauf zu?


for(int i = 0; i < 100;i++)
{
    ListItem myItem = new ListItem(listItem1); //Oder mit geschweiften Klammern initialisieren
    supercooleListe.Items.Add(myItem).
    //Hier kann ich jetzt myItem verwenden
}
//Hier muss ich das Item aus der Liste raussuchen. Sprich durch die Liste iterieren und ein item mit dem Namen "listItem1" suchen.

Was Du versuchst, ist auf eine Variable zuzugreifen, die es nicht gibt.
Eine Variable mit dem Name listItem1 gibt es nicht, es gibt nur ein ListItem, das so heißt. Das ist ein großer Unterschied, denn der Name des ListItems ist nur eine Property.
Bei WinForms ist das meist gleichbedeutend, da der Designer die Variablen nach dem Namen des Controls benennt. Nur weil der das so tut, sind Name des Controls und Name der Variable gleich.
Wenn Du nun dynamisch die Controls erstellst, hat der Designer damit nichts mehr zu tun und dynamisch Variablen anlegen geht nicht.

Das Item, was Du sichst, wirst Du also nie unter den Variablen finden, Du musst es in den Items anhand des Namens suchen.
Z.B. So oder so ähnlich:

var myItem = supercooleListe.Items.Cast<ListItem>().Single(item => item.Name == "listItem1");

ist ungetestet

Alternativ kannst Du auch ein Dictionary mit dem Namen als Key und dem Item selber als Wert pflegen.
Dann suchst Du das Item eben über das Dictionary.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

Weeks of programming can save you hours of planning

So durchläufst Du die Listview Items :

foreach(ListViewItem lvi in supercooleListe.Items)
{
    if (lvi.Name == "listItem1") ...
}

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3