【问题标题】:Winform TreeView with checkboxes - only visible nodes are updated带有复选框的 Winform TreeView - 仅更新可见节点
【发布时间】:2012-06-19 23:44:08
【问题描述】:

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

我有一个 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.胡梅尔

【问题讨论】:

    标签: c# winforms treeview checkbox


    【解决方案1】:

    两件事。一,你也不需要“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?

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

         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);
                            }
                        }
        
                    }
        

        将此行放在表单加载事件或按钮单击事件中

        PopulateFolderTreeView(@"C:\Program Files\", null);
        

        【讨论】:

        • 我认为 OP 首先填充树视图没有任何问题。
        • 您好,感谢您的建议。我尝试实现您描述的方法,但是当我运行应用程序并尝试执行该行时,我收到以下运行时错误:“UnauthorizedAccessException 未处理”“访问路径 'C:\Program Files\Common Files\ ' 被拒绝。”我检查了凭据,它们似乎无处不在。
        • 对不起,我说的那一行是"string[] commandsArray = Directory.GetDirectories(directories);"
        猜你喜欢
        • 2017-07-04
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 2019-02-22
        • 1970-01-01
        相关资源
        最近更新 更多