PopulateOnDemand不适用于数据绑定的ASP.Net TreeView

时间:2010-03-01 10:37:41

标签: asp.net data-binding treeview

我有一个绑定到XmlDataSource控件的TreeView。我添加了一些TreeNodeBinding元素来定义我希望如何显示XML数据。

我还在这些TreeNodeBindings中添加了PopulateOnDemand = true。但是,这样做并没有改变一件事,并且显示了整个XML树。此外,TreeNodePopulate事件也不会在节点展开时触发。

重要信息:我正在使用ASP.NET 4。

这是一个重现问题的例子(非常简单):

<%@ Page Language="C#" AutoEventWireup="true" %>

<script type="text/C#" runat="server">
  protected void TreeView1_TreeNodePopulate(Object sender, TreeNodeEventArgs e)
  {
    // This method is never called...
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:TreeView ID="TreeView1" runat="server" DataSourceID="XmlDataSource1" OnTreeNodePopulate="TreeView1_TreeNodePopulate" ExpandDepth="0">
        <DataBindings>           
          <asp:TreeNodeBinding DataMember="#" TextField="#" ValueField="#" PopulateOnDemand="true" />          
        </DataBindings>       
      </asp:TreeView>
      <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="Sample.xml" />
    </div>
    </form>
</body>
</html>

Sample.xml可以是您想要的任何xml文件,但这并不重要。

我试图在TreeView1_TreeNodePopulate方法中放置一个断点,它从未被击中。

我也试过:

  • 使用PopulateOnDemand =“true”为每个可能的数据成员设置TreeNodeBinding。
  • 通过代码,浏览所有树节点并将其PopulateOnDemand属性设置为true

没有任何效果。

按需填充功能的唯一方法是手动将节点添加到节点而不是将其绑定到数据源。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

将每个节点的TreeNode.PopulateOnDemand属性设置为 True

TreeView.TreeNodePopulate活动 在PopulateOnDemand控件中展开TreeView属性设置为true的节点时发生。

答案 1 :(得分:2)

嗯,事实证明你不能同时使用数据绑定和PopulateOnDemand。 如果要按需填充节点,则必须从数据源读取并通过代码创建节点,而不是通过数据绑定。

答案 2 :(得分:0)

将PopulateonDemand命令移至顶部!

        bool Expanded = Convert.ToBoolean(Convert.ToInt16(dr["Expand"].ToString().Trim()));
        TreeNode tn = new TreeNode();

        tn.PopulateOnDemand = true;
        tn.Expanded = Expanded;
        tn.Text = dr["Menu"].ToString();
        tn.Value = dr["ItemOrder"].ToString();
        tn.NavigateUrl = "";

        if (!string.IsNullOrEmpty(dr["Page"].ToString()))
        {
            tn.NavigateUrl = dr["Page"].ToString();
        }

        nodes.Add(tn);