动态创建树形视图

6
我正在尝试使用C#和ASP.NET动态创建一个树形视图。我已经使用"populate ondemand"属性创建了懒加载的树形视图。
>  <asp:TreeView ID="treeView1"  runat="server" 
>              OnTreeNodePopulate="treeview1_TreeNodePopulate"></asp:TreeView>

在代码后面,我已经加载了我的数据,但最初我填充了父节点。 我想要实现的是,当我点击父节点时,然后进行postback,然后填充其子级,然后再次填充其子级,以此类推。 我有成千上万条数据,所以我不希望由于性能问题而填充所有数据。 因此,这就是为什么我只想基于所选节点填充节点子项的原因。请参见下面的示例:

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

}

这个方法在页面加载时被调用。

在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个回答

6

我相信您正在寻找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>

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

谢谢。我如何将内容添加到现有的树视图中? - user929153
顺便提一下,“LinksTreeView”应替换为您的树视图的ID,我从一些旧代码中复制并粘贴,这是我特定示例中使用的ID。 - Jeff Turner
1
好的,试着这样做,进入包含树形视图的页面的设计视图,选择树形视图控件。然后转到属性选项卡,属性选项卡应该包含您的树形视图属性。在顶部,应该有一个闪电粗体图标,请单击该图标。从下面的列表中选择“SelectedNodeChanged”,并双击它。这将带您进入代码后台。然后尝试我上面发布的获取所选节点文本的代码。我刚在测试项目中尝试了一下,它完美地工作了。 - Jeff Turner
是的,我尝试过了,但没有运气。 <asp:TreeView ID =“treeView1” runat =“server” onselectednodechanged =“treeView1_SelectedNodeChanged”> </ asp:TreeView> protected void treeView1_SelectedNodeChanged(object sender,EventArgs e) { } 我在此事件上设置断点,但没有任何反应? - user929153
我刚刚更新了我的答案,以反映我在测试样本中正在运行的内容。 - Jeff Turner
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接