TreeView控件问题

时间:2010-04-04 12:02:23

标签: c# asp.net treeview controls

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

问题是当我点击子树节点时(在我扩展父节点之后) 所有展开的子树消失只显示父节点,旁边没有+号!!

(我已将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 
}

2 个答案:

答案 0 :(得分:1)

我没有一个直接的答案,但你做错了,因为你只是在Page_Load中加载节点,甚至只在第一次加载时。这意味着你依靠ViewState来保存回发之间的所有节点,这不是正确的方法。

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

答案 1 :(得分:0)

我遇到了同样的问题并设置了属性PopulateNodesFromClient =&#34; false&#34;解决了它。

编辑:TreeView控件的属性。