Berechnungsergebnisse: Viele Bitmaps in der TreeView


Thomas Wölfer
Thomas Wölfer

12. August 2005


Ich hatte vor ein paar Tagen ein kleines Klassendiagramm gezeigt, das eine Untermenge der vom Faltwerksprogramm berechneten Ergebnisse darstellt. Wenn man die verwendeten Normen (wir unterstützen momentan 13 oder 14) mal auf die DIN 1045-1 und die 18800-90 einschränkt, und dann nur Berechnungen nach Theorie 1. Ordnung betrachtet, und obendrein nur die Ergebnisse für Balken und Knoten (nicht aber für räumliche Tragwerkselemente, eingebettete Unterzüge, etc.etc.) betrachtet, dann sind das immer noch knapp 700 unterschiedliche Ergebnistypen.

Klingt erschreckend, sieht aber dann im Programm ganz harmlos aus:

Für den Programmierer gibts dann aber eine ärgerliche Sache: Diese 700 Ergebnisse haben (fast) alle ein eigenes Icon in der Baumansicht - und das erzeugt ein Problem.

Ab hier wirds wohl nur noch Programmierer interessieren...

Das Problem: Die Bitmaps liegen alle einzeln vor, da sie auch an anderen Stellen im Programm verwendet werden. Die Dinger werden also mit treeView.ImageList.Add( img, Color.Teal) zur ImageList hinzugefügt. Die liefert dann einen Index, und der wird als ImageIndex für die TreeNodes verwendet.

Dummerweise ist das bei 700 Bitmaps relativ lahm: Auf meinem Rechner dauert das fast 5 Sekunden - und in der Zeit gibts keinerlei optisches Feedback. Noch ärgerlicher: Die komplette Berechnung die vorher stattgefunden hat dauert deutlich weniger lange... Der Anwender wartet also nicht auf die eigentlichen Daten, sondern nur auf die schöne Optik.

Es gibt aber eine einfache Möglichkeit den Aufbau der TreeView ganz erheblich zu beschleunigen, wenn man viele Bitmaps in der ImageList benötigt: Dazu muss man zunächst ein Array aus Bitmaps in der benötigten Größe für alle Bitmaps erzeugen, und dieses Bitmap stellt man dann mit AddRange() in die ImageList. Natürlich braucht es dann eine manuelle Verwaltung der Indizes - aber das lohnt sicht, denn der zeitliche Aufwand geht von 5 Sekunden fast auf 0 zurück.