Ik heb een ListBox die op een TabPage staat. Aan deze listbox voeg ik met de Add-methode een instantie van een class met een ToString() methode toe, zoals bijvoorbeeld deze class:
De class voeg ik als volgt aan de listbox toe:
Werkt prima. Nu wil ik echter van dit object de member foo veranderen, waardoor de ToString ook een ander resultaat geeft:
Wat echter wél helpt is een ander tabblad selecteren (zoals gezegd, de listbox staat op een tabpage). Als ik na het switchen van tabblad terugschakel naar het tabblad waar mijn listbox op staat, dan zie ik de bijgewerkte waarde. Het moet dus op een of andere manier eenvoudig kunnen.
Mijn vraag is dus concreet: Hoe zorg ik dat de ListBox de ToString() van de items in de listbox opnieuw evalueert? Ik kan wel iedere keer de items verwijderen en weer toevoegen (ervan uitgaande dat de betreffende widget geselecteerd is, anders moet ik ze allemaal langs en dat wil ik al helemaal niet) vanuit de Widget-class als volgt:
Kan dit handiger? Ik zou het liefst zo min mogelijk ListBox1-manipulerende code in Widget hebben. Het liefst zelf helemaal geen, maar dat zal misschien lastig worden. Iemand toch een idee?
C#:
1
2
3
4
5
6
7
8
9
10
11
| public class Widget { public string foo; public Widget (string bar) { foo = bar; } public string ToString () { return foo; } } |
De class voeg ik als volgt aan de listbox toe:
C#:
1
2
| Widget w = new Widget ("Alice"); ListBox1.Add (w) |
Werkt prima. Nu wil ik echter van dit object de member foo veranderen, waardoor de ToString ook een ander resultaat geeft:
C#:
De ListBox moet ik op een of andere manier aan zijn verstand brengen dat de lijst bijgewerkt moet worden. Naief heb ik eerst geprobeerd ListBox1.Refresh () te proberen, maar dat doet niets. Ook minimaliseren, uit beeld slepen etcetera helpt niet, zelfs niet als ik Invalidate(). Hij tekent hem dan vast wel opnieuw maar nog met de oude waarden. De ToString() wordt niet opnieuw aangeroepen.1
| w.foo = "Bob"; |
Wat echter wél helpt is een ander tabblad selecteren (zoals gezegd, de listbox staat op een tabpage). Als ik na het switchen van tabblad terugschakel naar het tabblad waar mijn listbox op staat, dan zie ik de bijgewerkte waarde. Het moet dus op een of andere manier eenvoudig kunnen.
Mijn vraag is dus concreet: Hoe zorg ik dat de ListBox de ToString() van de items in de listbox opnieuw evalueert? Ik kan wel iedere keer de items verwijderen en weer toevoegen (ervan uitgaande dat de betreffende widget geselecteerd is, anders moet ik ze allemaal langs en dat wil ik al helemaal niet) vanuit de Widget-class als volgt:
C#:
1
2
3
4
5
6
7
| int idx = ListBox1.SelectedIndex; w = (Widget) ListBox1.SelectedItem; ListBox1.Items.RemoveAt(idx); ListBox1.Items.Insert(idx, w); ListBox1.SelectedIndex = idx; |
Kan dit handiger? Ik zou het liefst zo min mogelijk ListBox1-manipulerende code in Widget hebben. Het liefst zelf helemaal geen, maar dat zal misschien lastig worden. Iemand toch een idee?