[.NET+C#] Object in ListBox verandert, ListBoxweergave niet

Pagina: 1
Acties:

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 22-08-2025
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:

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#:
1
w.foo = "Bob";
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.

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?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zult ieder geval je ListBox aan moeten passen. Als jij in je ListBox een item toevoegt wordt er gewoon een ListItem aangemaakt met de Value van je object. Voor de rest zit het volgens mij helemaal niet meer gekoppelt. Je zult het dus idd zo moeten doen als je nou voorstelt

Je zou natuurlijk eventueel zelf een subClass van ListBox kunnen maken die dat allemaal afhandeld zodat die code niet in Widget hoeft te komen.

[ Voor 22% gewijzigd door Woy op 12-10-2004 12:06 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 22-08-2025
rwb schreef op 12 oktober 2004 @ 12:05:
Als jij in je ListBox een item toevoegt wordt er gewoon een ListItem aangemaakt met de Value van je object. Voor de rest zit het volgens mij helemaal niet meer gekoppelt.
Nou, niet helemaal. Er staat wel degelijk een referentie naar het object zelf in de ListItem.Value, hij roept dus niet eenmalig bij de .Add de ToString () aan om die in de ListItem.Value te stoppen, als dat is wat je bedoelt.
Je zou natuurlijk eventueel zelf een subClass van ListBox kunnen maken die dat allemaal afhandeld zodat die code niet in Widget hoeft te komen.
Ik heb stilletjes de hoop dat er een of andere functie is die ik over het hoofd heb gezien, aangezien hij dus wel verandert als ik van tabblad wissel. Het leek mij dat Invalidate() de truuk zou doen, maar dat is het niet. Er móet iets anders zijn...

Een listbox subclassen is inderdaad ook een optie die ik in het achterhoofd houd, maar ik ben benieuwd hoe de tabblad-wissel de listbox aanroept.

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:29
Een ListBox ondersteunt DataBinding dacht ik, misschien kan je daarmee bereiken wat je wilt.

code:
1
2
3
listBox1.DataSource = listOfMyObjects;
listBox1.DataMember = "blaat";
listBox1.DisplayMember = "bliep";

Waarbij blaat en bliep properties zijn van de objecten die je in listOfMyObjects zitten hebt.

Je zult dus je Widgets aan een ArrayList moeten toevoegen, die arraylist gebruiken als datasource voor je listbox en dan de datamember en displaymember properties van je listbox zetten.

[ Voor 28% gewijzigd door whoami op 12-10-2004 12:15 ]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:29
rollebol schreef op 12 oktober 2004 @ 12:12:
[...]


Een listbox subclassen is inderdaad ook een optie die ik in het achterhoofd houd, maar ik ben benieuwd hoe de tabblad-wissel de listbox aanroept.
Bij het laden van een tabblad heb je misschien code geschreven die je listbox populated ?

https://fgheysels.github.io/


  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 22-08-2025
whoami schreef op 12 oktober 2004 @ 12:13:
[...]

Bij het laden van een tabblad heb je misschien code geschreven die je listbox populated ?
Nee hoor, dat tabblad komt zo nieuw uit de doos, niets aan veranderd. Het populaten van de listbox gebeurt vanuit Form1_Load (je begrijpt wat ik bedoel).

Ik heb het op jouw aanraden nu ook in een ArrayList gestopt en die als DataSource gebruikt. Het werkt. Exact hetzelfde fenomeen doet zich echter voor. DataMember en DisplayMember heb ik niet ingesteld, waar zou je dat in mijn voorbeeld-widget op instellen? DisplayMember lijkt me misschien "foo", maar DataMember?

In http://www.dotnet247.com/247reference/msgs/2/11924.aspx komen in de laatste alinea van de reply de woorden BindingContext en TabControl voor, en ik heb het gevoel dat ik er iets mee kan, maar wat weet ik nog niet. :?

[ Voor 8% gewijzigd door rollebol op 12-10-2004 13:40 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:29
Hmm, ik heb net ff een testprojectje gemaakt.
Je zal, als je de waarde van een widget veranderd, het juiste listitem ook moeten aanpassen.

https://fgheysels.github.io/


  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 22-08-2025
Het juiste listitem aanpassen? Je bedoelt inderdaad zoals in het laatste [code]-blok van de startpost? Of bedoel je iets anders...
Pagina: 1