2010-04-04 93 views
2

我在包含递归嵌套子文件夹的服务器上有一个公用文件夹。 在包含图像的各种Leaf文件夹中。 我想创建一个服务器端文件浏览器,将图像显示给用户。 我正在使用ASP.NET TreeView控件。 我使用PopulateOnDemand创建树节点。 如果用户点击叶子目录,我希望该文件夹中的图像显示在DataList控件中。TreeView控件问题

问题是,当我的子树节点上单击(后我扩大它的父节点) 所有扩展子树消失只有父节点表明没有+符号旁边!

(我已经设置TreeView的PopulateNodesFromClient属性为true)

有人能告诉我是什么问题?

感谢

下面是代码:

<asp:TreeView ID="TreeView1" runat="server" AutoGenerateDataBindings="False" 
        onselectednodechanged="TreeView1_SelectedNodeChanged" 
        ontreenodepopulate="TreeView1_TreeNodePopulate"> 
       </asp:TreeView> 




protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     string path = Server.MapPath("."); 
     PopulateTopNodes(path); 
    } 
} 

private void PopulateTopNodes(string pathToRootFolder) 
{ 
    DirectoryInfo dirInfo = new DirectoryInfo(pathToRootFolder); 
    DirectoryInfo[] dirs = dirInfo.GetDirectories(); 
    foreach (DirectoryInfo dir in dirs) 
    { 
     TreeNode folderNode = new TreeNode(dir.Name,dir.FullName); 

     if (dir.GetDirectories().Length > 0) 
     { 
      folderNode.PopulateOnDemand = true; 
      folderNode.Collapse(); 
     } 
     TreeView1.Nodes.Add(folderNode); 
    } 
} 


protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e) 
{ 

    if (IsCallback == true) 
    { 
     if (e.Node.ChildNodes.Count == 0) 
     { 
      LoadChildNode(e.Node); 
     } 
    } 


} 

private void LoadChildNode(TreeNode treeNode) 
{ 
    DirectoryInfo dirInfo = new DirectoryInfo(treeNode.Value); 
    DirectoryInfo[] dirs = dirInfo.GetDirectories(); 
    foreach (DirectoryInfo dir in dirs) 
    { 
     TreeNode folderNode = new TreeNode(dir.Name, dir.FullName); 
     if(dir.GetDirectories().Length>0){ 
      folderNode.PopulateOnDemand = true; 
      folderNode.Collapse(); 
     } 
     treeNode.ChildNodes.Add(folderNode); 
    } 
} 







protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) 
{ 
    // Retrieve the images here 
} 

回答

1

我没有给你一个直接的答案,但你正在做的事情错了,因为你只装载在Page_Load中的节点,甚至只在第一次加载。这意味着您依赖ViewState将所有节点之间的回传保存好,但这不是正确的方式。

虽然在我看来,你很亲密。我将删除Page_Load,然后查看此页面的最后一个示例:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treeview(VS.80).aspx

+0

亲爱的Jan, 谢谢您的回答。 当TreeView.PopulateNodesFromClient属性为 为true(默认值)时,TreeView执行客户端回调以检索它需要的节点 给定节点只根据需要填充一次。之后,这些值在客户端保持可用,如果同一个节点被折叠并展开,则不执行回调。 这就是控制应该表现的方式。 (也许使用SelectedNodeChanged事件与PopulateNodesFromClient等一起造成该错误?) 我会看看你推荐的例子。 谢谢 – ProgNet 2010-04-04 15:13:31

+0

我从我的例子 [Here](http://www.aspnettutorials.com/tutorials/controls/treeview-open-files-cs.aspx) – ProgNet 2010-04-04 15:24:06

+0

对我来说,似乎你的差异代码,并且示例是,他们在Page_Load中执行的所有操作都设置了根节点 - 其他所有内容都由客户端调用填充。您正在加载Page_Load中的所有节点。 – 2010-04-04 15:35:35

0

我有同样的确切问题,并设置属性PopulateNodesFromClient =“false”解决了它。

编辑:TreeView控件的属性。