Crear dinámicamente una vista de árbol

Estoy tratando de crear una vista de árbol dinámicamente usando c # y asp.net.

He creado una vista de árbol de carga diferida utilizando el atributo poblar ondemand.

>  <asp:TreeView ID="treeView1"  runat="server" 
>              OnTreeNodePopulate="treeview1_TreeNodePopulate"></asp:TreeView>

Detrás del código he cargado mis datos pero inicialmente lleno los nodos principales. Lo que quiero lograr es que cuando haga clic en el nodo primario, luego haga una devolución de datos y luego complete su hijo y luego vuelva a llenar su hijo y así ahora. Tengo miles de datos, así que no quiero que todos los datos se llenen debido al rendimiento. Esa es la razón por la que solo quiero poblar los hijos del nodo en función del nodo seleccionado. Vea el ejemplo a continuación:

>Peter
    - - >user1
    - - >user2
    - - >user3
       - - >userPassword
       - - >userId
>john
>david
>Jack
    - - >user1
    - - >user2
       - - >userpassword
       - - >userId
       - - >Permissions
>Laura 
    - - > admin
    - - > permissions
       -- > user1
       -- > user2
         - - >userpassword
             - - >userId
             - - >Permissions           
>...
>...
>...

Como puede ver, puede haber múltiples nodos principales y varias capas. Estos se completarán dinámicamente en función de lo que pase a DB. Cada vez que haga clic en el nodo, expandirá el nodo y completará su elemento secundario utilizando la devolución de datos y luego, cuando haga clic en su elemento secundario nuevamente, realizará una devolución de datos y rellenará su elemento secundario nuevamente, etc. Así que quería ayuda sobre cómo crear una vista de árbol dinámica.

C#

private void LoadTreeview()
{
 //Load data
 // Get data from DB.
 //loop through the list and build its parent nodes.
  foreach (var dxm in list)
  {
                TreeNode tnParent = CheckNodeExist(dxm.Node); //I check to see if exists.
                if (tnParent== null)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dxm.Node;
                    tn.Value = dxm.Id.ToString();
                    tn.SelectAction = TreeNodeSelectAction.None;
                    tn.Collapse();
                    treeView1.Nodes.Add(tn);
                    tn.PopulateOnDemand = true; //lazy load
                    tnParent= tn;
                }

}

Este método anterior se llama en la carga de la página.

On TreeNodePopulateEvent: (cuando se hace clic en un nodo)

protected void treeview1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            ICollection<ITEMS> list = new Collection<ITEMS>();           

            list = GetData(e.Node.Text); //pass in the node you have selected  this will go and check in DB if the node does have any child nodes. If so will return with child nodes.

            foreach (var dxm in list)
            {

                TreeNode tnChild = CheckNodeExist(dxm.Node);
                if (tnChild == null)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dxm.Node;
                    tn.Value = dxm.Id.ToString();
                    tn.SelectAction = TreeNodeSelectAction.None;
                    tn.Collapse();

                    tn.PopulateOnDemand = true;
                    tnChild = tn;
                    tnChild.ChildNodes.Add(tnChild);                  

                }
            }
        }

Respuestas a la pregunta(2)

Su respuesta a la pregunta