views:

338

answers:

2

Hi,

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"&gt;
<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>

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?

+4  A: 

Set the 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.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treenode.populateondemand.aspx

RJ1516
I should go through the tree nodes programmatically and do that? shouldn't the DataBinding declaration do exactly that?
Shay Friedman
It seems to me that PopulateOnDemand is useful when adding nodes via code to avoid loading everything until needed - the xml data binding seems to load everything anyway
CRice
A: 

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.

Shay Friedman