3

我是新来的,几乎到处都在寻找我的问题的答案 - 无济于事。我希望这里有人可以提供帮助。

我有一个 WinForm 应用程序,我使用 TreeView 在选定的根文件夹下显示文件夹结构。树视图已启用复选框。当我选中或取消选中 TreeNode 上的复选框时,该 TreeNode 下方的任何可见节点也会发生变化 - 到目前为止一切都很好。

问题是,当我进一步扩展节点时,新的可见节点不会更新到正确的状态。

我使用以下递归例程来执行更新:

    private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
    {
        foreach (TreeNode node in treeNode.Nodes)
        {
            node.Checked = nodeChecked;
            if (node.Nodes.Count > 0)
            {
                // If the current node has child nodes, call the
                // CheckAllChildNodes method recursively.
                CheckAllChildNodes(node, nodeChecked);
            }
        }
    }

从此事件处理程序调用它:

    private void FileTreeView_AfterCheck(object sender, TreeViewCancelEventArgs e)
    {
        // The code only executes if the user caused the checked state to change.
        if (e.Action == TreeViewAction.ByMouse)
        {
            if (e.Node.Nodes.Count > 0)
            {
                // Calls the CheckAllChildNodes method, passing in the current
                // checked value of the TreeNode whose checked state changed.
                CheckAllChildNodes(e.Node, e.Node.Checked);
            }
        }
    }

似乎递归函数只关心在执行时可见的 TreeNodes。

如果任何人都可以提供错误的线索,以及可以采取哪些措施来纠正它,将不胜感激。

提前致谢。

此致,

L.胡梅尔

4

3 回答 3

2

两件事情。一,你也不需要“if (e.Node.Nodes.Count > 0)”。这有点多余,好像当您调用“foreach”时有 0 个节点,它会立即退出循环。

二,最简单的解决方案可能是只连接到 AfterExpand 方法,当节点展开时,然后设置子节点:

private void FileTreeView_AfterExpandobject sender, TreeViewEventArgs e)
{
    // Calls the CheckAllChildNodes method, passing in the current
    // checked value of the TreeNode whose checked state changed.
    CheckAllChildNodes(e.Node, e.Node.Checked);        
}

另外,您确定要在事件方法中使用 TreeViewCancelEventArgs,而不仅仅是 TreeViewEventArgs?

于 2012-06-18T01:55:30.413 回答
1

如果您使用数据绑定,则可能不是 TreeView 问题,而是数据绑定问题。它不会更新不可见的控件。有关 Winforms Tabcontrol 问题,请参阅此MSDN 线程

于 2012-06-18T00:44:32.073 回答
-1

我试图复制您在代码中可能正在做的事情,请您使用此代码并确认它是否有效或者您面临同样的问题。

 private void PopulateFolderTreeView(string directories, TreeNode parentNode)
            {
                string[] directoriesArray = Directory.GetDirectories(directories);
                string[] filesArrays = Directory.GetFiles(directories);
                if (directoriesArray.Length != 0)
                {
                    foreach (string currentDirectory in directoriesArray)
                    {
                        TreeNode myNode = new TreeNode(Path.GetFileNameWithoutExtension(currentDirectory));
                        if (parentNode == null)
                        {
                            treeView1.Nodes.Add(myNode);
                        }
                        else
                        {
                            parentNode.Nodes.Add(myNode);
                        }
                        PopulateFolderTreeView(currentDirectory, myNode);
                    }

                }
                if (filesArrays.Length != 0)
                {
                    foreach (string currentFile in filesArrays)
                    {
                        TreeNode myNode = new TreeNode(Path.GetFileName(currentFile));
                        if (parentNode == null)
                        {
                            treeView1.Nodes.Add(myNode);
                        }
                        else
                        {
                            parentNode.Nodes.Add(myNode);
                        }
                        //PopulateTreeView(currentDirectory, myNode);
                    }

                }
            }



     private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
            {
                foreach (TreeNode node in treeNode.Nodes)
                {
                    node.Checked = nodeChecked;
                    if (node.Nodes.Count > 0)
                    {
                        // If the current node has child nodes, call the
                        // CheckAllChildNodes method recursively.
                        CheckAllChildNodes(node, nodeChecked);
                    }
                }
            }

            private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                // The code only executes if the user caused the checked state to change.
                if (e.Action == TreeViewAction.ByMouse)
                {
                    if (e.Node.Nodes.Count > 0)
                    {
                        // Calls the CheckAllChildNodes method, passing in the current
                        // checked value of the TreeNode whose checked state changed.
                        CheckAllChildNodes(e.Node, e.Node.Checked);
                    }
                }

            }

将此行放在 Form Load 事件或 Button Click 事件中

PopulateFolderTreeView(@"C:\Program Files\", null);
于 2012-06-17T23:14:10.640 回答