Laden...

ListBox Items aktualisieren

Erstellt von spry64 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.976 Views
S
spry64 Themenstarter:in
52 Beiträge seit 2014
vor 10 Jahren
ListBox Items aktualisieren

Hallo,
ich hoffe jemand kann mir bei meinem Problem helfen.

Ich habe ein StringCollection "name" in der die Einträge für meine ListBox-Items stehen. Diese gehe ich in einer foreach-Schleife durch und ordne es dem entrechenden Item zu. Beim ersten ausführen des Programms klappt alles wunderbar. Wenn ich allerdings den Button klicke in der die neuen Werte für die Items aktualisiert werden, erscheint die Fehlermeldung "System.ArgumentOutOfRangeException", nämlich dass der Wert außerhalb des Bereichs lag. Das war für mich auch verständlich als ich ein Breapoint unter den Variablen "index" gesetzt habe, der den Wert -1 liefert.

Wenn ich "lstbWahl.Items.Clear(); " weglasse, erscheint die Fehlermeldung nicht allerdings werden die ListBox-Items aufeinander gehäuft.

private void Aktualisieren(){
     lstbWahl.Items.Clear(); //Leere den ListBox 

     foreach (String sc in name)
     {
         lstbWahl.Items.Add(sc); //ListBox Items füllen
     }
}

//Mein ListBox_Auswahl
private void lstbWahl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

     //Ermittle den gewählten Item von ListBox und ordne es den Vaibalen index zu
     int index = lstbWahl.SelectedIndex;

     //überprüfen welche der Items gewählt wurde
     if (lstbWahl.SelectedIndex == index)
          txtbAusgabe.Text = textblock[index]; //den entsprechen Text in TextBox ausgeben
}

//Mein Button_Click
private void btnSpeichern_Click(object sender, RoutedEventArgs e)
{
     Aktualisieren();
}
D
96 Beiträge seit 2012
vor 10 Jahren

Wenn du die ListBox mit listBox.Items.Clear() leerst, wird vermutlich das SelectionChanged Event ausgelöst, da nun kein Item mehr selektiert ist (sind ja alle weg). In deinem Event Handler liest du den neuen SelectedIndex aus, der aber -1 ist, da kein Item selektiert ist. In der Zeile:

txtbAusgabe.Text = textblock[index];

kommt es dann zu ArgumentOutOfRangeException, da -1 kein gültiger Arrayindex ist.

=> Prüfe einfach, ob der Index != -1 ist, bevor du auf das Array zugreifst.

Und übrigens:

     //Ermittle den gewählten Item von ListBox und ordne es den Vaibalen index zu
     int index = lstbWahl.SelectedIndex;

     //überprüfen welche der Items gewählt wurde
     if (lstbWahl.SelectedIndex == index)
          txtbAusgabe.Text = textblock[index]; //den entsprechen Text in TextBox ausgeben

Der Code macht so keinen Sinn. Der Ausdruck lstbWahl.SelectedIndex == index wird immer true liefern, da du index gerade erst mit lstbWahl.SelectedIndex initialisiert hast.

S
spry64 Themenstarter:in
52 Beiträge seit 2014
vor 10 Jahren

Ja der Wert ist -1 bevor ich auf das Array "textblock" zugreife. Den Index für textblock liefert ja "index", der davor schon -1 ist, bevor es als Indexwert benutzt wird. Das passiert aber wie gesagt wenn ich auf den Butten klicke, der meine ListBox-Items aktualisieren soll.

Ja ist schon richtig, dass die Abfrage

if (lstbWahl.SelectedIndex == index)

wenig Sinn macht, könnte ich genau so gut weglassen.

S
spry64 Themenstarter:in
52 Beiträge seit 2014
vor 10 Jahren

"name" und "textblock" sind im Übrigen Objekte der Klasse StringCollection.

2.207 Beiträge seit 2011
vor 10 Jahren

Hallo spry64,

Ja ist schon richtig, dass die Abfrage

if (lstbWahl.SelectedIndex == index)  

wenig Sinn macht, könnte ich genau so gut weglassen.

Dann lass es weg.

Allgemein: Arbeite mit ViewModels und dem MVVM-Pattern. Dann löst das dein Problem schon. Binde dann einfach die Liste von deinem ViewModel an dein Control und halte dir ein property, das dir immer den gerade ausgewählten Eintrag hält.

WPF Apps With The Model-View-ViewModel Design Pattern

Gruss

Coffeebean

D
96 Beiträge seit 2012
vor 10 Jahren

Es hört sich so an, als ob du immernoch Probleme hättest. Wenn dem so ist, dann beschreib dein Problem genauer, damit wir dir helfen können.
Zu deinem Problem aus dem ersten Post habe ich dir bereits gesagt wieso das auftritt und wie du es lösen kannst.