Динамически создать дерево - PullRequest
5 голосов
/ 01 февраля 2012

Я пытаюсь создать древовидное представление динамически, используя c # и asp.net.

Я создал дерево отложенной загрузки с использованием атрибута populate ondemand.

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

За кодом я загрузил свои данные, но первоначально я заполняю родительские узлы. Чего я хочу добиться, так это когда я нажимаю на родительский узел, затем делаю обратную передачу, затем заполняю его дочерний узел, а затем снова заполняю его дочерний узел, и теперь. У меня есть тысячи данных, поэтому я не хочу, чтобы все данные были заполнены из-за производительности. Вот почему я хочу заполнить только дочерние узлы на основе выбранного узла. Смотрите пример ниже:

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

Как видите, может быть несколько родительских узлов и несколько слоев. Они будут заполнены в зависимости от того, что я передаю в БД. Каждый раз, когда я щелкаю по узлу, он расширяет узел и заполняет его дочерний элемент с помощью обратной передачи, а затем, когда вы снова нажимаете на его дочерний элемент, он выполняет обратную передачу и снова заполняет свой дочерний элемент и т. Д. Поэтому мне нужна помощь в создании динамического древовидного представления.

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;
                }

}

Этот метод выше вызывается при загрузке страницы.

On TreeNodePopulateEvent: (при нажатии на узел)

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);                  

                }
            }
        }

1 Ответ

4 голосов
/ 01 февраля 2012

Полагаю, вы ищете событие SelectedNodeChanged. Вы должны быть в состоянии загрузить ваши дочерние узлы в этом событии. В основном это событие будет вызываться каждый раз, когда вы выбираете узел, щелкая по нему.

Ваш aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div id="div1" runat="server">

    </div>

    <asp:TreeView ID="TreeView1" runat="server" 
        onselectednodechanged="TreeView1_SelectedNodeChanged">

    </asp:TreeView>

    </form>
</body>
</html>

Ваш код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            TreeView1.Nodes.Add(new TreeNode("Node1"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("ChildNode"));
        }

    }


    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
        Response.Write(TreeView1.SelectedNode.Text);
    }
}
...