C# 树视图控制问题

C# 树视图控制问题,c#,asp.net,treeview,controls,C#,Asp.net,Treeview,Controls,我在服务器上有一个公用文件夹,其中包含递归嵌套的子文件夹。 在各个叶文件夹中包含图像。 我想创建一个服务器端文件浏览器,向用户显示图像。 我正在使用ASP.NETTreeView控件。 我使用PopulateOnDemand创建树节点。 如果用户单击叶目录,我希望该文件夹中的图像显示在DataList控件中 问题是,当我单击一个子树节点时(在我将其展开为父节点后) 所有展开的子树将消失,并且仅显示父节点,旁边没有+符号 (我已将TreeView的PopulateNodesFromClient属性

我在服务器上有一个公用文件夹,其中包含递归嵌套的子文件夹。 在各个叶文件夹中包含图像。 我想创建一个服务器端文件浏览器,向用户显示图像。 我正在使用ASP.NETTreeView控件。 我使用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 
}

受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!Page.IsPostBack)
{
字符串路径=Server.MapPath(“.”);
PopulateTopNodes(路径);
}
}
私有void PopulateTopNodes(字符串路径文件夹)
{
DirectoryInfo dirInfo=新的DirectoryInfo(pathToRootFolder);
DirectoryInfo[]dirs=dirInfo.GetDirectories();
foreach(目录中的目录信息目录)
{
TreeNode folderNode=新的TreeNode(dir.Name,dir.FullName);
如果(dir.GetDirectories().Length>0)
{
folderNode.PopulateOnDemand=true;
folderNode.Collapse();
}
TreeView1.Nodes.Add(folderNode);
}
}
受保护的无效树视图1_TreeNodePopulate(对象发送器,TreeNodeEventArgs e)
{
如果(IsCallback==true)
{
if(e.Node.ChildNodes.Count==0)
{
LoadChildNode(e.Node);
}
}
}
私有void LoadChildNode(TreeNode TreeNode)
{
DirectoryInfo dirInfo=新的DirectoryInfo(treeNode.Value);
DirectoryInfo[]dirs=dirInfo.GetDirectories();
foreach(目录中的目录信息目录)
{
TreeNode folderNode=新的TreeNode(dir.Name,dir.FullName);
如果(dir.GetDirectories().Length>0){
folderNode.PopulateOnDemand=true;
folderNode.Collapse();
}
treeNode.ChildNodes.Add(folderNode);
}
}
受保护的无效树视图1_SelectedNodeChanged(对象发送方,事件参数e)
{
//在这里检索图像
}

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


不过,在我看来,你已经很接近了。我将删除页面加载,然后查看此页面的最后一个示例:。

我遇到了同样的问题,设置PopulateNodesFromClient=“false”属性解决了这个问题


编辑:TreeView控件的属性。

亲爱的Jan,感谢您的回答。当TreeView.PopulateNodesFromClient属性为true(默认值)时,TreeView将执行客户端回调以从给定节点检索所需的节点,并且只按需填充一次。之后,这些值在客户机上保持可用,如果同一节点折叠和展开,则不会执行回调。这就是控件的行为方式。(可能是将SelectedNodeChanged事件与PopulateNodesFromClient等一起使用导致了该错误?)。谢谢,我把我的示例从一个到另一个,您的代码和示例之间的区别似乎在于,它们在Page_Load中所做的一切都是在根节点上设置的,其他一切都由客户端调用填充。您正在加载Page_Load中的所有节点。我第一次在PageLoad事件处理程序中创建顶级节点并将其添加到树中的方式没有问题。在《ASP.NET 3.5释放》一书中,它们使用了与我相同的方式。亲爱的Jan,谢谢你今天的帮助:)我找到了导致问题的原因,行:if(IsCallback==true)一旦我注释掉这行,就没有消失节点的问题