Проблема управления TreeView - PullRequest
2 голосов
/ 04 апреля 2010

У меня есть общая папка на сервере, которая содержит вложенные вложенные папки. В различных папках Leaf содержатся изображения. Я хотел создать файловый браузер на стороне сервера, который будет отображать изображения для пользователя. Я использую ASP.NET TreeView Control. Я создаю узлы дерева, используя 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 ]

1 голос
/ 04 апреля 2010

У меня нет прямого ответа для вас, но вы делаете что-то не так, поскольку загружаете только узлы в Page_Load и даже только при первой загрузке.Это означает, что вы полагаетесь на ViewState, чтобы сохранить все узлы между постбэками и, ну, это просто неправильный способ сделать это.Я бы удалил Page_Load, а затем взглянул на последний пример этой страницы: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treeview(VS.80).aspx.

0 голосов
/ 22 сентября 2014

У меня была точно такая же проблема, и решение свойства PopulateNodesFromClient = "false" решило ее.

edit: свойство элемента управления TreeView.

...