Benutzer mit den meisten Antworten
ForEach Remove SelectedIndices

Frage
-
Grüße Euch!
So ich ändere meine Frage weil es mich in den Wahnsinn treibt..Nach dem ich den Button drücke sollen die Elemente der rechten Textbox in die linke. Aber ich verstehe den Code nicht. Ich drehe förmlich durch weil mir jegliche Logik entgeht aber ich weiß dass es eine geben muss weil es ja funktioniert.
Erkläre mit bitte jemand diese Musterlösung:private void button1_Click(object sender, EventArgs e) { foreach (string s in listBox2.SelectedItems) listBox1.Items.Add(s); for (int i = listBox2.SelectedItems.Count - 1; i >= 0; i--) { listBox2.Items.RemoveAt(listBox2.SelectedIndices[i]); } }
Ich verstehe nicht inwiefern int i = listBox2.SelectedItems.Count - 1 die Position der Items beschreiben soll. Oder wie man aus diesem Wert die Indizes ableiten will. Ich lese es folgendermaßen:
int i = Zähle die Anzahl der ausgewählten Items in der ListBox 2
- Bearbeitet Volker94 Sonntag, 23. Oktober 2016 18:19
Antworten
-
Hallo Volker,
um das Problem mit den veränderten Auflistungen zu umgehen, das bereits Tom angesprochen hat, kopiere die Auflistung in ein Array. Dann funktioniert das Löschen mit den SelectedItems:
foreach (string item in listBox1.SelectedItems.Cast<string>().ToArray()) { listBox2.Items.Add(item); listBox1.Items.Remove(item); }
Der Cast<string> auf den enthaltenen Typ ist notwendig, da ToArray() aus dem LINQ Repertoire stammt.
Damit die Anzeige nicht "zappelt", kann man vorher BeginUpdate und am Ende EndUpdate für die Listboxen verwenden.
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 28. Oktober 2016 06:04
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 4. November 2016 08:34
-
Hallo Volker,
das Problem an deiner Lösung ist das ; hinter der foreach-Schleife. Dadurch liegt der Aufruf der RemoveAt-Methode nicht mehr im foreach-Block. So müsste es aussehen:
foreach ( int i in lstBoxRechts.SelectedIndices){ lstBoxRechts.Items.RemoveAt(i); }
Wobei du bei einer Anweisung die {} auch weg lassen kannst, aber oftmals helfen sie solche Fehler zu verhindern. Weiterhin ist es empfehlenswert auf die Einrückung zu achten, ggf. auch Automatisch von VS über Strg+K, Strg+D formatiert.
Um einen Code nachzuvollziehen empfiehlt es sich hin- und wieder diesen einfach Schrittweise zu Debuggen (F10 und F11 in VS). Wenn du das machst, wirst du bemerken das die for-Schleife herunter zählt. Und da Arrays und listen bei 0 anfangen zu zählen, das höchste Element immer Count-1 ist.
Wobei du mit solchen Konstrukten vorsichtig sein solltest, zumindest bei der foreach-Schleife. Denn das Verändern der Auflistung (hier entfernen) verändert auch die SelectedIndices-Auflsitung wodurch in neueren Teilen des Frameworks ein Fehler auftritt. Auflistungen dürfen einfach nicht verändert werden, wärend man sie mit foreach durchläuft. Daher nimmt man hier sehr oft einfach eine for- oder while-Schleife um das Problem zu umgehen.
Hinweis: Meine Antwort bezieht sich auf die Frage bevor sie bearbeitet wurde. Soweit ich mich an den Original Inhalt erinnere stand dort etwas anderes...
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Bearbeitet Tom Lambert (Koopakiller)Moderator Sonntag, 23. Oktober 2016 18:26 Hinweis...
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 28. Oktober 2016 06:05
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 4. November 2016 08:34
-
Hallo
die Antwort findet sich hier,
Zitat:
Mit der foreach-Anweisung wird eine Gruppe von eingebetteten Anweisungen für jedes Element in einem Array oder einer Objektauflistung wiederholt, das die Schnittstelle System.Collections.IEnumerable oder System.Collections.Generic.IEnumerable<T> implementiert. Die foreach-Anweisung wird verwendet, um die Auflistung zu durchlaufen und dadurch die gewünschten Informationen zu erhalten. Setzen Sie sie nicht ein, um der Auflistung Elemente hinzuzufügen oder aus ihr zu entfernen, um unvorhersehbare Nebeneffekte zu vermeiden. Wenn Sie Elemente aus der Quellauflistung hinzufügen oder entfernen müssen, verwenden Sie eine for-Schleife.
Gruß
- Bearbeitet K. Pater Sonntag, 23. Oktober 2016 16:19
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 28. Oktober 2016 06:06
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 4. November 2016 08:34
Alle Antworten
-
Hallo
die Antwort findet sich hier,
Zitat:
Mit der foreach-Anweisung wird eine Gruppe von eingebetteten Anweisungen für jedes Element in einem Array oder einer Objektauflistung wiederholt, das die Schnittstelle System.Collections.IEnumerable oder System.Collections.Generic.IEnumerable<T> implementiert. Die foreach-Anweisung wird verwendet, um die Auflistung zu durchlaufen und dadurch die gewünschten Informationen zu erhalten. Setzen Sie sie nicht ein, um der Auflistung Elemente hinzuzufügen oder aus ihr zu entfernen, um unvorhersehbare Nebeneffekte zu vermeiden. Wenn Sie Elemente aus der Quellauflistung hinzufügen oder entfernen müssen, verwenden Sie eine for-Schleife.
Gruß
- Bearbeitet K. Pater Sonntag, 23. Oktober 2016 16:19
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 28. Oktober 2016 06:06
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 4. November 2016 08:34
-
Hallo,
ich übersetze dann noch die Musterlösung. :)
For a multiple-selection ListBox, this property returns a collection containing the indexes to all items that are selected in the ListBox. (Quelle)
SelectedIndices-Auflistung enthält so viele Indizes, wie Elemente ausgewählt wurden. Deshalb wird in der Musterlösung i mit (Anzahl der ausgewählten Elemente - 1) initialisiert. SelectedIndices[i] gibt immer die konkrete Position des ausgewählten Elements zurück. Es wird also die Auflistung durchlaufen und immer das Element an der von SelectedIndices zurückgegebenen Position entfernt.
Ich hoffe, ich konnte dir damit ein bisschen weiterhelfen.
Beste Grüße
- Bearbeitet Flogex Sonntag, 23. Oktober 2016 18:23
-
Hallo Volker,
das Problem an deiner Lösung ist das ; hinter der foreach-Schleife. Dadurch liegt der Aufruf der RemoveAt-Methode nicht mehr im foreach-Block. So müsste es aussehen:
foreach ( int i in lstBoxRechts.SelectedIndices){ lstBoxRechts.Items.RemoveAt(i); }
Wobei du bei einer Anweisung die {} auch weg lassen kannst, aber oftmals helfen sie solche Fehler zu verhindern. Weiterhin ist es empfehlenswert auf die Einrückung zu achten, ggf. auch Automatisch von VS über Strg+K, Strg+D formatiert.
Um einen Code nachzuvollziehen empfiehlt es sich hin- und wieder diesen einfach Schrittweise zu Debuggen (F10 und F11 in VS). Wenn du das machst, wirst du bemerken das die for-Schleife herunter zählt. Und da Arrays und listen bei 0 anfangen zu zählen, das höchste Element immer Count-1 ist.
Wobei du mit solchen Konstrukten vorsichtig sein solltest, zumindest bei der foreach-Schleife. Denn das Verändern der Auflistung (hier entfernen) verändert auch die SelectedIndices-Auflsitung wodurch in neueren Teilen des Frameworks ein Fehler auftritt. Auflistungen dürfen einfach nicht verändert werden, wärend man sie mit foreach durchläuft. Daher nimmt man hier sehr oft einfach eine for- oder while-Schleife um das Problem zu umgehen.
Hinweis: Meine Antwort bezieht sich auf die Frage bevor sie bearbeitet wurde. Soweit ich mich an den Original Inhalt erinnere stand dort etwas anderes...
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Bearbeitet Tom Lambert (Koopakiller)Moderator Sonntag, 23. Oktober 2016 18:26 Hinweis...
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 28. Oktober 2016 06:05
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 4. November 2016 08:34
-
Hallo Volker,
um das Problem mit den veränderten Auflistungen zu umgehen, das bereits Tom angesprochen hat, kopiere die Auflistung in ein Array. Dann funktioniert das Löschen mit den SelectedItems:
foreach (string item in listBox1.SelectedItems.Cast<string>().ToArray()) { listBox2.Items.Add(item); listBox1.Items.Remove(item); }
Der Cast<string> auf den enthaltenen Typ ist notwendig, da ToArray() aus dem LINQ Repertoire stammt.
Damit die Anzeige nicht "zappelt", kann man vorher BeginUpdate und am Ende EndUpdate für die Listboxen verwenden.
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 28. Oktober 2016 06:04
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 4. November 2016 08:34
-
[..] Es geht darum dass in listBox2.Items.RemoveAt(listBox2.SelectedIndices[i] i= 0 am Ende wird, weil sonst der Vorgang als nicht vollständig angenommen wird richtig?
Hallo Volker94.
Die Elemente einer Auflistung werden immer null-basiert durchnummeriert, das heißt, das erste Element hat den Index 0. Bleibt i größer 0, werden nicht alle Elemente aus deiner Auflistung gelöscht.
Beste Grüße