动态地创建一个TreeView [英] Dynamically create a treeview

查看:159
本文介绍了动态地创建一个TreeView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图动态地创建一个TreeView使用C#和asp.net。

我已经创建使用填充按需属性的延迟加载树视图。

 > < ASP:TreeView的ID =为TreeView1=服务器
> OnTreeNodePopulate =treeview1_TreeNodePopulate>< / ASP:TreeView的>

code后面我已加载我的数据,但最初我填充父节点。我想实现的是,当我父节点上单击我然后做回发,然后填充它的孩子,那么它的孩子,因此现在再填充。我有成千上万的数据,所以我不希望所有的数据由于性能进行填充。所以,这就是为什么我只希望根据选定节点上填充节点孩子的原因。见下面的例子:

 >彼得
     - - >的user1
     - - >用户2
     - - >用户3
        - - >的userPassword
        - - >用户id
>约翰
>大卫
>杰克
     - - >的user1
     - - >用户2
        - - >的userPassword
        - - >用户id
        - - >权限
>劳拉
     - - >管理员
     - - >权限
        - > USER1
        - >用户2
          - - >的userPassword
              - - >用户id
              - - >权限
> ...
> ...
> ...

正如你可以看到,可以有多个父节点和多层。这些将dynically基于什么我传递到数据库进行填充。每次我在节点点击它就会展开该节点,并使用填充回传其子,然后当你点击它的孩子再会做回传,再填充其子等,所以我想就如何创建一个动态的TreeView帮助。

C#:

 私人无效LoadTreeview()
{
 //加载数据
 //从数据库获取数据。
 //遍历目录,并建立它的父节点。
  的foreach(在列表VAR DXM)
  {
                树节点tnParent = CheckNodeExist(dxm.Node); //我检查,看看是否存在。
                如果(tnParent == NULL)
                {
                    TreeNode的TN =新的TreeNode();
                    tn.Text = dxm.Node;
                    tn.Value = dxm.Id.ToString();
                    tn.SelectAction = TreeNodeSelectAction.None;
                    tn.Collapse();
                    treeView1.Nodes.Add(TN);
                    tn.PopulateOnDemand = TRUE; //延迟加载
                    tnParent = TN;
                }}

这上面的方法被调用在页面加载。

在TreeNodePopulateEvent:(当一个节点被点击)

 保护无效treeview1_TreeNodePopulate(对象发件人,TreeNodeEventArgs E)
        {
            ICollection的<项目内容及GT;名单=新的收集和LT;项>();            表=的GetData(e.Node.Text); //传递你选择了此会,并在数据库检查点没有任何子节点的节点。如果是的话将与子节点返回。            的foreach(在列表VAR DXM)
            {                树节点tnChild = CheckNodeExist(dxm.Node);
                如果(tnChild == NULL)
                {
                    TreeNode的TN =新的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);                }
            }
        }


解决方案

我相信你正在寻找SelectedNodeChanged事件。你应该能够加载你的子节点在此事件。基本上这个事件将被解雇每次你通过点击它选择一个节点。

您的aspx

 <%@页面语言=C#AutoEventWireup =真codeFILE =Default.aspx.cs继承=_默认%GT;!< D​​OCTYPE HTML PUBLIC -  // W3C // DTD XHTML 1.0过渡// ENhttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">< HTML的xmlns =htt​​p://www.w3.org/1999/xhtml>
<头=服务器>
    <标题>< /标题>
< /头>
<身体GT;
    <表ID =form1的=服务器>
    < D​​IV ID =DIV1=服务器>    < / DIV>    < ASP:TreeView的ID =为TreeView1=服务器
        onselectednodechanged =TreeView1_SelectedNodeChanged>    < / ASP:TreeView的>    < /表及GT;
< /身体GT;
< / HTML>

您codebehind

 使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用的System.Web;
使用System.Web.UI程序;
使用System.Web.UI.WebControls;公共部分类_Default:System.Web.UI.Page
{
    保护无效的Page_Load(对象发件人,EventArgs的发送)
    {
        如果(!Page.IsPostBack)
        {
            TreeView1.Nodes.Add(新的TreeNode(节点1));
            TreeView1.Nodes [0] .ChildNodes.Add(新树节点(ChildNode));
        }    }
    保护无效TreeView1_SelectedNodeChanged(对象发件人,EventArgs的发送)
    {
        的Response.Write(TreeView1.SelectedNode.Text);
    }
}

I am trying to create a treeview dynamically using c# and asp.net.

I have created a lazy load treeview using the populate ondemand attribute.

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

Behind code I have loaded my data but initially I populate the parent nodes. What I want to achieve is when i click on parent node I then do a postback and then populate its child and then again populate its child's and so now. I have thousands of data so i dont want all data to be populated due to performance. So thats the reason why I only want to populate the node childs based on selected node. See example below:

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

As you can see there can be multiple parent nodes and multiple layers. These will be populated dynically based on what i pass in to DB. Everytime i click on node it will expand the node and populate its child using postback and then when you click on its child again it will do a postback and populate its child again etc. So i wanted help on how to create a dynamic treeview.

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

}

This method above is called on page load.

On TreeNodePopulateEvent: (when a node is clicked on)

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

                }
            }
        }

解决方案

I believe you are looking for the SelectedNodeChanged event. You should be able to load your child nodes in this event. Basically this event will be fired everytime you select a node by clicking on it.

Your 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>

Your codebehind

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

这篇关于动态地创建一个TreeView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆