我有一个TreeView:  <asp:TreeView runat="server" ID="CodeTree" ShowLines="True" EnableClientScript=true   ExpandDepth="1" Target=_self    PopulateNodesFromClient="true" OnTreeNodePopulate="CodeTree_TreeNodePopulate" 
  >后台代码:protected void CodeTree_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
            if (e.Node.ChildNodes.Count == 0)
            {
                LoadNodeTree(e.Node, node.ChildNodeList);
                e.Node.Expand();
             }
        }现在跟踪发现,第一次点"+"号时,响应了Populate事件,并执行了其中的代码,进行了节点填充。此时,e.Node.ChildNodes.Count也大于0了。但是e.Node.Expand()方法没有反应。再点击第二次时,又进入了此方法,此时e.Node.ChildNodes.Count居然又是0了,再次填充后,e.Node.Expand()方法有了作用。
也就是说,一个节点总要点两次才能填充好子节点,不知是何故?

解决方案 »

  1.   

     在这个方法中,把节点添加后,调用每个节点的.Expand();
    LoadNodeTree(e.Node, node.ChildNodeList);
      

  2.   

     为什么一定要Expand()呢?我不想把所有节点都展开,现在,我把 EnableClientScript=true 改成
    EnableClientScript=false 就可以了。但是接着又有另一个问题,因为树的节点比较多,在节点多时,如果每选择一个节点,则会回发,这样会好慢。于是,又改成了在点击节点时不产生回发。但这样,就需要自己在客户端实现选择节点时样式的变化(因为已禁用了客户端脚本)。当自己实现了选择节点时样式的更换后,又发现,当在服务器端选择一个节点时(node.selected=true),在客户端根本无从知道,于是这时就会出现树上有两个节点都是在选中状态
      

  3.   

    找到问题所在了, EnableClientScript=true 依然是true,但PopulateNodesFromClient 应该为 false
      

  4.   

    楼主,我也在做个~第一次加载就没有了子项~不晓得怎么实现
    ~能把关于这个的前后台关键代码发给我不?[email protected] 谢谢!