【问题标题】:How to automatically select or deselect the all child nodes whenever its parent Node is selected or deselected?How to automatically select or deselect the all child nodes whenever its parent Node is selected or deselected?
【发布时间】:2011-04-21 06:52:03
【问题描述】:

我的 Windows 窗体应用程序中有一个带有复选框的树视图控件。如何在选择或取消选择其父节点时自动选择或取消选择所有子节点?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    如果我没记错的话,AfterCheck 事件文档中的示例代码正是您想要的。

    【讨论】:

    • @Sourav,你的意思是,因为我没有复制文档中的代码?它可以在我提供的链接中找到。也就是说,你是对的,我可能不应该回答这个问题,但由于缺乏研究工作而投票关闭它。早在 2011 年,我还在学习绳索……
    【解决方案2】:
        private void HandleOnTreeViewAfterCheck(Object sender,
           TreeViewEventArgs e)
        {
            CheckTreeViewNode(e.Node, e.Node.Checked);
        }
    
        private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
        {
            foreach (TreeNode item in node.Nodes)
            {
                item.Checked = isChecked;
    
                if (item.Nodes.Count > 0)
                {
                    this.CheckTreeViewNode(item, isChecked);
                }
            }
        }
    

    【讨论】:

    • foreach 循环是否递归遍历树?即e.Node.Nodes是走分支吗?
    • 没有。就一层。假设他的要求只有一个级别。我添加了代码来进行递归检查。感谢您指出。
    • @VijaySirigiri 这个逻辑有点冒险,因为当你检查 foreach 中的子项时,你也会触发他的 AfterCheck 事件,因此级联效果变得不可预测
    • 我对改进上述代码的建议是在调用 CheckTreeViewNode 方法之前执行此检查:if(e.Action != TreeViewAction.Unknown)
    【解决方案3】:

    请在下面找到工作代码。我在我的应用程序中使用它。希望这能解决问题。

    private void tree_Documents_AfterCheck(object sender, TreeViewEventArgs e)
        {
            TreeNode checkedNode = e.Node;
            foreach (TreeNode node in checkedNode.Nodes)
            {
                node.Checked = checkedNode.Checked;
            }
        }
    

    【讨论】:

    • 这不会选中/取消选中checkedNode 的孙子。
    【解决方案4】:
        private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
        {
            foreach (TreeNode node in treeNode.Nodes)
            {
                node.Checked = nodeChecked;
                if (node.Nodes.Count > 0)
                {
                    this.CheckAllChildNodes(node, nodeChecked);
                }
            }
        }
        private void treeView_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
            {
                if (e.Node.Nodes.Count > 0)
                {
                    if (!e.Node.Checked)
                    {
                        this.CheckAllChildNodes(e.Node, e.Node.Checked);
                    }
                }
            }
    
            if (e.Node.Parent != null)
            {
                TreeNode n = e.Node;
                while (n.Parent != null)
                {
                    if (n.Checked)
                    {
                        n.Parent.Checked = true;
                    }
                    n = n.Parent;
                }
            }
    
        }
    

    【讨论】:

    • 请在您的代码中添加一些 cmets 并解释一下!
    【解决方案5】:
                //TreeView - myTreeview;
                myTreeview.BeginUpdate();
                //Loop through all the nodes of tree
                foreach (TreeNode node in myTreeview.Nodes)
                {
                    //If node has child nodes
                    if (HasChildNodes(node))
                    {
                        if (node.Checked == true)
                        {
                            //Check all the child nodes.
                            foreach (TreeNode childNode in node.Nodes)
                            {
                                childNode.Checked = true;
                            }
                        }
                    }
                }
                myTreeview.EndUpdate();
    
    Hope this helps....
    

    【讨论】:

    • 您可以创建一个方法并从 treeviewbeforecheck 事件中调用它,以便检查所有树节点
    • 以上帖子帮助你或你卡在某个地方
    • @Tech Giant:如何创建treeviewbeforecheck事件?
    【解决方案6】:

    使用树视图的 AfterCheck 事件对树视图内的子节点应该发生的情况进行编码。

    将树视图节点的相同状态也传递给其子节点,并将其“checked”属性设置为树视图节点的相同状态。

    【讨论】:

    • 如何在c#.net中创建AfterCheck事件?
    • 只需右键单击表单中的树视图,转到属性。在该选择事件选项卡中。在这里,您将找到与此控件关联的事件列表。双击“AfterCheck”事件,它会为您生成。
    【解决方案7】:

    这个简单的代码对我有用

    private void treeView_AfterCheck(object sender, TreeViewEventArgs e) {
            try {
                e.Node.TreeView.BeginUpdate();
                if (e.Node.Nodes.Count > 0) {
                    var parentNode = e.Node;
                    var nodes = e.Node.Nodes;
                    CheckedOrUnCheckedNodes(parentNode, nodes);
                }
            } finally {
                e.Node.TreeView.EndUpdate();
            }
        }
    
    private void CheckedOrUnCheckedNodes(TreeNode parentNode, TreeNodeCollection nodes) {
            if (nodes.Count > 0) {
                foreach (TreeNode node in nodes) {
                    node.Checked = parentNode.Checked;
                    CheckedOrUnCheckedNodes(parentNode, node.Nodes);
                }
            }
        }
    

    【讨论】:

      【解决方案8】:
      If Not TreeView1.Nodes(e.Node.Text) Is Nothing Then
          For Each node As TreeNode In TreeView1.Nodes(e.Node.Text).Nodes
                  If node.Parent.Checked = True Then
                      node.Checked = True
                  End If
                  If node.Parent.Checked = False Then
                      node.Checked = False
                  End If
      
              Next
          End If
      

      【讨论】:

        【解决方案9】:
        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Nodes.Count != 0)
            {
                if (e.Node.Checked)
                {
                    CheckAllChildNodes1(e.Node);
                }
                else
                {
                    UncheckChildNodes1(e.Node);
                }
            }
        }
        
        private void CheckAllChildNodes1(TreeNode treeNodeAdv)
        {
            foreach (TreeNode nd in treeNodeAdv.Nodes)
            {
                nd.Checked = treeNodeAdv.Checked;
            }
        }
        
        private void UncheckChildNodes1(TreeNode treeNodeAdv)
        {
            foreach (TreeNode nd in treeNodeAdv.Nodes)
            {
                nd.Checked = treeNodeAdv.Checked;
            }
        }
        

        【讨论】:

          【解决方案10】:

          试试这个代码,这用于检查和取消选中父节点以及点击子节点。

              private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
              {
                  foreach (TreeNode item in node.Nodes)
                  {
                      item.Checked = isChecked;
          
                      if (item.Nodes.Count > 0)
                      {
                          this.CheckTreeViewNode(item, isChecked);
                      }
                  }
          
                  if (isChecked && node.Parent != null)
                  {
                      treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
                      node.Parent.Checked = true;
                      treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
                  }
          
          
                  if (!isChecked && node.Parent != null)
                  {
                      bool unchk = true;
                      treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
                      foreach (TreeNode item in node.Parent.Nodes)
                      {
                          if (item.Checked)
                          {
                              unchk = false;
                              break;
                          }
                      }
                      if (unchk)
                          node.Parent.Checked = false;
          
                      treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
                  }
          
              }
          

          【讨论】:

            猜你喜欢
            • 2022-12-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-01
            • 2022-12-02
            • 2022-08-11
            • 2021-12-10
            • 1970-01-01
            相关资源
            最近更新 更多