Вам необходимо реализовать обычно используемую технику, называемую Ленивая загрузка дерева .
Эта техника заключается в инициализации только самого первого уровня вашего дерева. Затем для каждого узла, который вы хотите расширить, вы добавляете подузел, называя его dummy subnode. Этот указанный c подузел содержит определенный c текст, который вы хотите отличить от всех других текстов.
public const string DUMMYNODETEXT = "__dummyNode!!!";
...
var node = new TreeNode("top level node");
node.Nodes.Add( DUMMYNODETEXT );
node.Tag = something_that_tags_this_node;
treeView.Nodes.Add( node );
Затем, когда узел дерева расширен , вы хотите проверьте, содержит ли узел этот специальный фиктивный узел, и если да, только тогда вы хотите инициализировать вложенный уровень.
public void TreeView_BeforeExpand( object sender, TreeViewCancelEventArgs e )
{
if ( e.Node != null &&
e.Node.Nodes.Count == 1 &&
e.Node.Nodes[0].Text == DUMMYNODETEXT
)
{
// if you get there, the node containing only the dummy node is being
// expanded
// first, remove the dummy node
e.Node.Nodes.Clear();
// then, determine which node is expanded
var tag = e.Node.Tag;
// depending on the tag value, create subnodes
// but remember to add dummy nodes to your newly created subnodes
var newNodes = CreateSubNodesForNode( tag );
foreach ( var newNode in newNodes )
{
e.Node.Nodes.Add( newNode );
}
}
}
public IEnumerable<TreeNode> CreateSubNodesForNode( object tag )
{
if ( tag is .... your type )
{
return ...
}
if ( tag is .... another type )
{
return ...
}
}
Следуя этому шаблону, вы всегда только инициализируете развернутый узел. Фактический запрос к базе данных выполняется только при необходимости. Кроме того, глубина дерева не представляет никаких трудностей.