Da sitzt man grade und entwickelt an der Next-Gen Game-Engine, bastelt sich ein Tool zur automatische Verwaltung und Code-Generierung von Netzwerkpaketen, und wird dann wieder von so Kleinigkeiten ausgebremst, ala ListBox. ...

Man stelle sich vor, man hat ein eigene Klasse mit überschriebener ToString()-Methode, die man als Items zu einer ListBox hinzufügen möchte. - Die ToString()-Methode ist also überschrieben um den Namen, der später in der ListBox für das jeweilige Item auftaucht, zu ändern.

So in etwa wie die Klasse TestObjekt:

   1: public class TestObjekt
   2: {
   3:     public string Name;
   4:     public string Vorname;
   5:  
   6:     public override string ToString()
   7:     {
   8:         return Vorname + " " + Nachname;
   9:     }
  10: }

Sollte man später jetzt aber ein Item der Liste ändern wollen, wie z.B. den Vornamen, dann wird der Text des Items in der Listbox nicht aktualisiert.

Refresh() hilft leider (zum Glück) nicht.

Zeit mal etwas aus der neuen C# 3.0 Trick-Kiste auszuprobieren:

C#3.0 Extension Methods

Man erstellt sich einfach eine statische, nicht generische Klasse, und baut eine Extension Method, die das gewünschte leistet:

   1: public static class ListBoxExtension
   2: {
   3:     public static void RefreshItem(this ListBox listbox, int index)
   4:     {
   5:         if (listbox.Items.Count <= index) return;
   6:         if (listbox.Items[index] == null) return;
   7:  
   8:         // Selektion der Listbox merken:
   9:         int selection = listbox.SelectedIndex;
  10:  
  11:         // Item einfach erneut einfügen und danach das alte löschen.
  12:         // Beim Einfügen ruft die ListBox nämlich ToString() auf.
  13:         listbox.Items.Insert(index, listbox.Items[index]);
  14:         listbox.Items.RemoveAt(index + 1);
  15:  
  16:         // Verlorengegangene Selektion wiederherstellen:
  17:         listbox.SelectedIndex = selection;
  18:     }
  19: }

Danach kann man die neue Methode in jeder ListBox wie folgt nutzen:

   1: // Selektiertes Item aktualisieren:
   2: myList.RefreshItem(myList.SelectedIndex);

Falls Probleme auftreten, oder jemand eine bessere Lösung hat lasst es mich wissen! ;)

Btw: Extension Methods haben den Vorteil, wenn man mal einen Fehler in der Programmierung gemacht hat, kann man diesen später an einer zentralen Stelle ganz leicht ausbügeln. Ging mir hierbei jedenfalls so ;)

 

Grüße,

Euer Resharper Padawan


 
Thursday, October 23, 2008 6:29:26 PM (W. Europe Standard Time, UTC+01:00)
Vielen Dank, genau das habe ich gesucht.
michael
Name
E-mail
Home page

Comment (HTML not allowed)  

Enter the code shown (prevents robots):

Live Comment Preview