各位好:
我用的是服务器控件,我想要实现的是:页面第一次加载时只显示根节点,在点击展开根节点时再加载其中的子节点。我该如何实现?现在我遇到的问题是:我第一次只加载了根节点,所以节点左边没有加号,因此不能触发tvTree_TreeNodeExpanded事件。希望各位给我指点一下,不一定按照我的思路来。谢谢

解决方案 »

  1.   

    此时应使用TreeView.SelectedNodeChanged 事件
      

  2.   

    http://www.google.com.hk/search?q=asp.net+treeview+OnTreeNodePopulate&hl=zh-CN&newwindow=1&safe=strict&tbo=d&lr=lang_zh-CN
      

  3.   

    我写过的一个例子,贴出来请参考:<%@ Page Language="C#" %><%@ Import Namespace="System.Collections.Generic" %>
    <script runat="server">
        protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            switch (e.Node.Value)
            {
                case "N1":
                    e.Node.ChildNodes.Add(new TreeNode { Text = "张三", Value = "a" });
                    e.Node.ChildNodes.Add(new TreeNode { Text = "李四", Value = "b" });
                    e.Node.ChildNodes.Add(new TreeNode { Text = "王五", Value = "c", PopulateOnDemand = true });
                    break;
                case "N2":
                    e.Node.ChildNodes.Add(new TreeNode { Text = "1" });
                    e.Node.ChildNodes.Add(new TreeNode { Text = "2" });
                    e.Node.ChildNodes.Add(new TreeNode { Text = "3" });
                    break;
                case "N3":
                    e.Node.ChildNodes.Add(new TreeNode { Text = "A" });
                    e.Node.ChildNodes.Add(new TreeNode { Text = "B" });
                    e.Node.ChildNodes.Add(new TreeNode { Text = "C" });
                    break;
                case "c":
                    e.Node.ChildNodes.Add(new TreeNode { Text = "张三他爸" });
                    e.Node.ChildNodes.Add(new TreeNode { Text = "张三他妈" });
                    e.Node.ChildNodes.Add(new TreeNode { Text = "张三他弟" });
                    break;
            }
        }    private List<string> 选中过的节点
        {
            get
            {
                var x = ViewState["selected"];
                if (x == null)
                {
                    x = new List<string>();
                    ViewState["selected"] = x;
                }
                return (List<string>)x;
            }
        }    private void ShowLabel1()
        {
            var s = string.Empty;
            foreach (string node in 选中过的节点)
                s = node + "&nbsp;&nbsp;&nbsp;" + s;
            this.Label1.Text = s;
            UpdatePanel2.Update();
        }    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
            选中过的节点.Add(TreeView1.SelectedNode.Value);
            ShowLabel1();
        }
    </script>
    <!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">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:TreeView ID="TreeView1" runat="server" ExpandDepth="0" OnTreeNodePopulate="TreeView1_TreeNodePopulate"
                    EnableClientScript="False" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged">
                    <Nodes>
                        <asp:TreeNode Text="N1" Value="N1" PopulateOnDemand="true"></asp:TreeNode>
                        <asp:TreeNode Text="N2" Value="N2" PopulateOnDemand="true"></asp:TreeNode>
                        <asp:TreeNode Text="N3" Value="N3" PopulateOnDemand="true"></asp:TreeNode>
                    </Nodes>
                </asp:TreeView>
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                你点击的节点:
                <asp:Label ID="Label1" runat="server" EnableViewState="False"></asp:Label>
            </ContentTemplate>
        </asp:UpdatePanel>
        </form>
    </body>
    </html>
    你可以看到“王五”这个数据里设置了属性 PopulateOnDemand = true,也就是说你在动态绑定一层节点的时候,只需要判断每一个节点是否 exists 下一层数据(只要存在一个)就够了,就可以用来设置这个属性了,这个属性就能控制是否显示加号!
      

  4.   

    i have made a demo, you can see if it is what is you want;
    first: put a treeview control whose ID is "TreeView1"
    second: the codes below is in file ".aspx.cs"
    show up:
    1. run 2. click the first root node3. click the second root nodeusing 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 (!IsPostBack)
            {
                LoadRoots();
            }
        }
        //这里多个root 节点
        private void LoadRoots()
        {
            for (int i = 0; i <= 3; i++)
            {
                string nodeString = string.Format("Root Node {0}",i+1);
                TreeView1.Nodes.Add(new TreeNode(nodeString));
                TreeView1.Nodes[i].Value = i + "";
            }
        }    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
            TreeView node = (TreeView)sender;
            string selectedValue = node.SelectedValue;
            int i = 0;
            switch (selectedValue)
            {
                case "0":
                    if (TreeView1.Nodes[0].ChildNodes.Count==0)
                    {
                        //这里 根据需求 从数据库 加载
                        for (i = 0; i <= 3; i++)
                        {
                            string child = string.Format("child node {0}", i + 1);
                            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode(child));
                        }
                    }
                    break;
                case "1":
                    if (TreeView1.Nodes[1].ChildNodes.Count == 0)
                    {
                        //这里 根据需求 从数据库 加载
                        for (i = 0; i <= 3; i++)
                        {
                            string child = string.Format("child node {0}", i + 1);
                            TreeView1.Nodes[1].ChildNodes.Add(new TreeNode(child));
                        }
                    }
                    break;
                case "2":
                    if (TreeView1.Nodes[2].ChildNodes.Count == 0)
                    {
                        //这里 根据需求 从数据库 加载
                        for (i = 0; i <= 3; i++)
                        {
                            string child = string.Format("child node {0}", i + 1);
                            TreeView1.Nodes[2].ChildNodes.Add(new TreeNode(child));
                        }
                    }
                    break;
                case "3":
                    if (TreeView1.Nodes[3].ChildNodes.Count == 0)
                    {
                        //这里 根据需求 从数据库 加载
                        for (i = 0; i <= 3; i++)
                        {
                            string child = string.Format("child node {0}", i + 1);
                            TreeView1.Nodes[3].ChildNodes.Add(new TreeNode(child));
                        }
                    }
                    break;
            }
        }
    }