Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Verzögertes Laden von Daten im TreeView
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

Themenstarter:

Verzögertes Laden von Daten im TreeView

beantworten | zitieren | melden

Mit ganz wenig Code kann man sich selber einen TreeView ableiten und diesem ganz neue Funktionalitäten einbauen.

Mal angenommen wir haben einen mehrstufigen Baum zur Navigation.

-Name
+-Meier
++-Hauptstrasse 17
++-Irgendwo

+-Huber
...
...
usw.

Dann wäre es doch praktisch wenn man von Meier nur den Namen holen muss ohne alle ChildNodes reinzuhauen obwohl gar nie jemand Meier expandet.

Zudem sind ja Daten eh nur kurzlebig.... also macht es eventuell Sinn die Daten beim Collapse wieder wegzuwerfen.

Kurzum: man will (braucht) ja das + vor dem Node.... also hängt man Fake-Nodes rein.

der Code des TreeView


using System;
using System.Windows.Forms;

namespace TreeTest
{
	
	public class LoadOnDemandTreeView:TreeView
	{
		private bool _blnFakeNodes=true;
		public LoadOnDemandTreeView()
		{
		}

		public bool FakeNodes
		{
			get{return this._blnFakeNodes;}
			set{this._blnFakeNodes=value;}
		}

		public bool FakeNode(TreeNode pTreeNodeToFake)
		{
			bool ret=false;

			if (pTreeNodeToFake!=null && !pTreeNodeToFake.IsExpanded && pTreeNodeToFake.Nodes.Count==0)
			{
				TreeNode ndFake=new TreeNode("fake");
				ndFake.Tag="fake";
				pTreeNodeToFake.Nodes.Add(ndFake);
				ret=true;
			}
			return ret;
		}

		protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
		{
			if(_blnFakeNodes && e.Node.Nodes.Count>0 && e.Node.Nodes[0].Tag!=null && e.Node.Nodes[0].Tag.ToString()=="fake"  )
			{
				e.Node.Nodes.Clear();
				this.OnLoadData(e);
			}
			base.OnBeforeExpand (e);
		}
		protected override void OnAfterCollapse(TreeViewEventArgs e)
		{
			base.OnAfterCollapse (e);
			if (_blnFakeNodes)
			{
				e.Node.Nodes.Clear();
				TreeNode ndFake=new TreeNode("fake");
				ndFake.Tag="fake";
				e.Node.Nodes.Add(ndFake);
			}
		}


		private void OnLoadData(TreeViewCancelEventArgs e)
		{
			if (this.LoadData!=null)
			{
				this.LoadData(this,e);
			}
		}
		public event TreeViewCancelEventHandler LoadData;
	}
}


Code auf dem TestForm:


private void treeView1_LoadData(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
		{
			e.Node.Nodes.Add(new TreeNode(DateTime.Now.ToShortTimeString()));
		}

		private void Form1_Load(object sender, System.EventArgs e)
		{
			TreeNode ndTest=new TreeNode("Test");
			this.treeView1.Nodes.Add(ndTest);
			this.treeView1.FakeNode(ndTest);
		}


-Beim Laden des TestForms wird ein Node reingehängt (Test)
-dieser wird gefaket mit this.treeView1.FakeNode(ndTest);
er erhält also einen fake Node (dadurch erscheint das +)

Wenn nun jemand den TestNode expanden will wird der LoadData Event geworfen. In diesem hängt man dann die nächste Stufe rein (und faket gegebenenfalls auch dessen ChildNodes)

Zudem ist es so angedacht, dass die Nodes beim Collapsen wieder gelöscht und dafür ein neues faking eingeleitet wird.

Beim nächsten LoadData sind die ChildNodes dann nicht mehr da und werden neu geladen... (Daten sind aktueller)

Die verwendeten Nodes-Klassen sind frei... man muss auch kein Interface implementieren...

Das ganze habe ich einfach mal so hingepinselt weil mich das Thema interessiert hat... was meint Ihr zu so einem Ansatz ?

Stichworte: lazy loading, on demand
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Moderationshinweis von herbivore (17.07.2013 - 16:54:55):

Siehe auch FileTreeView

private Nachricht | Beiträge des Benutzers
RIDI2oo5
myCSharp.de - Member

Avatar #avatar-1677.jpg


Dabei seit:
Beiträge: 140
Herkunft: Graubünden, Schweiz

beantworten | zitieren | melden

also ich finde die idee sehr gut, und vor allem bei treeview's mit sehr vielen nodes/subnodes ist auf diese weise sehr viel rauszuholen.
ich verwende im geschäft hauptsächlich den treeview der infragistic netAdvantage tools (componenten-library). dieses treeview hat diese funktion bereits eingebaut. ich hab' mal einen kleinen performance-test gemacht, und der unterschied ist beträchtlich. allerdings muss man gut abschätzen, ob es wirklich notwendig ist. wenn man natürlich einen treeview hat, der nicht sehr gross ist, macht es wenig sinn wenn bei jedem klick auf ein node wieder geladen werden muss.
aber grundsätzlich: TOP!
private Nachricht | Beiträge des Benutzers
TNDAri
myCSharp.de - Member

Avatar #avatar-2507.jpg


Dabei seit:
Beiträge: 139
Herkunft: Bremen

beantworten | zitieren | melden

Hab mal eine MP3 Datenabnk in Delphi (Ja ich weiss ) geschrieben und das gleiche prinzip benutzt. Es bringt echt extrem viel speed ab einer grossen anzahl von datensätzen.

Also
Gruss Ari
Wer lesen kann ist klar im vorteil!
MSDN
Dein Feund in allen fragen
private Nachricht | Beiträge des Benutzers