Repaint unterdrücken

kahuna

Erfahrenes Mitglied
Hallo,

Wie kann ich auf meinem TreeView unterdrücken, dass nachdem ich einen Node hinzugefügt habe, der Baum neu gezeichnet wird?

Hintergrund:
Ich lade grosse Baum-Strukturen in einem separaten Thread aus der Datenbank und generiere so die TreeNodes. Wenn nun bei jedem TreeView.Nodes.Add(...) der Baum neu gezeichnet wird, macht das den Ladeprozess langsamer. Ich möchte nun bis alle Daten generiert sind, das Neuzeichnen unterdrücken und erst nach Ladeende den Baum zeichnen.

Gruss Alexander
 
Hallo,

Hab ich eben auch versucht, der Ladeprozess bei knapp 2000 verlinkten Nodes kommt von 23 auf 21 Sekunden runter =D Nicht gerade der Hammer =D Naja vielleicht liegts ja doch an was anderem.

Gruss Alexander
 
Vielleicht geht es auch schneller wenn Du sie nicht permanent mit "Add" hinzufügst,
sondern die ChildNodes in TreeNode[] Arrays vorbereitest.
Und zwar so:
Code:
TreeChilds[] = ... // Vorbereiten
TreeNode[0] = new TreeNode( "Neuer Knoten", 0,0 , TreeChilds);
Ich nehme mal an das bei "Add" ein kleiner/großer Mechanismus in Gang gesetzt wird, der intern:
zwischenspeichert; ein neues Array erstellt das 1 größer ist;
das alte Array in das neue kopiert und das Neue Element anfügt.

Somit solltest Du der Sache unter die Arme greifen können.
Und ich hoffe ich liege richtig. War ja nur eine Idee. :)

MfG cosmo
 
Hi.

Probier mal folgendes:

Code:
private void LoadTree()
{
  myTreeView.SuspendLayout();

  // benötigter Code zum Erstellen und Hinzufügen der Nodes ..

  myTreeView.ResumeLayout();
}

MfG,
Alex
 
@Alexander: Danke erstmal, bist ein echter Kumpel ( PN )

Kannst Du mir trotzdem sagen, ob ich mit meiner Theorie richtig liege?
Gibt es Performanceverlust wenn ich sie mit "Add" anfüge? Ich meine wenn man sie vorbereitet.
Hab jetzt nicht die Zeit zum Testen. Wollt es einfach mal wissen.

MfG cosmo
 
Zuletzt bearbeitet:
Es dürfte ein Unterschied sein wenn man sich im Hintergrund zuerst die Struktur zusammenbaut, und dann den Root dem TreeView hinzufügt, muss aber nicht. Wird ja trotzdem viel gezeichnet. ;)

Habe jetzt übrigens was gesehen.
Statt dem Suspend-/ResumeLayout gibts beim TreeView die Methoden "BeginUpdate" und "EndUpdate".

To maintain performance while items are added one at a time to the TreeView, call the BeginUpdate method. The BeginUpdate method prevents the control from painting until the EndUpdate method is called.
 
Okay, ich hab nun alle Methoden ausprobiert. Eindeutig am schnellsten ist, das Ganze zwischen BeginUpdate und EndUpdate zu packen. Leider dauert der Aufbau immer noch 14 Sekunden. Ich werde nun mal ein wenig am Multithreading arbeiten, vielleicht lässt sich da noch das Eine oder Andere werkeln. Habt ihr in diesem Bereich Erfahrung, was sich so auszahlt?

Gruss Alexander
 
Begin-/EndUpdate sind auch dafür gedacht.

Das befüllen kannst natürlich in einem neuen Thread machen, nur was meinst mit "Habt ihr in diesem Bereich Erfahrung, was sich so auszahlt?"?
Thread ist Thread, oder meinst irgendwas spezielles?
 
Ne ich meine konzeptmässig, z.B. lohnt es sich pro Root node einen Füllen-Thread zu machen, sollte man Thread-Pool verwenden, usw.

Mir geht es vorallem um Performance Tipps.
Das Füllen läuft schon in einem anderen Thread.

Gruss Alexander
 
Zurück