Laden...

Verzögertes Laden von Daten im TreeView

Erstellt von Programmierhans vor 18 Jahren Letzter Beitrag vor 17 Jahren 9.348 Views
Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 18 Jahren
Verzögertes Laden von Daten im TreeView

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

Hinweis von herbivore vor 10 Jahren

Siehe auch FileTreeView

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

140 Beiträge seit 2005
vor 18 Jahren

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!
👍

139 Beiträge seit 2006
vor 17 Jahren

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