开发者

PopulateOnDemand does not work on data bound ASP.Net TreeView

开发者 https://www.devze.com 2022-12-21 08:36 出处:网络
I have a TreeView that is bound to a XmlDataSource control. I\'ve added some TreeNodeBinding elements to define how I want the XML data to be shown.

I have a TreeView that is bound to a XmlDataSource control. I've added some TreeNodeBinding elements to define how I want the XML data to be shown.

I have also added PopulateOnDemand=true to these TreeNodeBindings. However, doing so didn't change a thing and the entire XML tree is displayed. Moreover, the TreeNodePopulate event is not fired on node expand as well.

Important information: I'm using ASP.NET 4.

This is an example that reproduces the problem (very straight forward):

<%@ 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="XmlDataSou开发者_如何学Pythonrce1" runat="server" DataFile="Sample.xml" />
    </div>
    </form>
</body>
</html>

The Sample.xml can be any xml file you want, it doesn't really matter.

I tried to put a breakpoint within the TreeView1_TreeNodePopulate method and it was never hit.

I also tried to:

  • Set a TreeNodeBinding for each possible data member with PopulateOnDemand="true".
  • Via code, go through all tree nodes and set their PopulateOnDemand property to true.

Nothing worked.

The only way the populate-on-demand thing worked was when I added nodes manually to the nodes instead of binding it to a data source.

What am I doing wrong?


Well, it turns out you can't use data binding and PopulateOnDemand at the same time. If you want to populate nodes on demand, you will have to read from the data source and create the nodes via code and not via data binding.


Set the TreeNode.PopulateOnDemand property of each node to True

TreeView.TreeNodePopulate Event Occurs when a node with its PopulateOnDemand property set to true is expanded in the TreeView control.


Move PopulateonDemand command the top!

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号