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