【问题标题】:One checked node at a time in TreeView在 TreeView 中一次检查一个节点
【发布时间】:2013-01-12 08:54:43
【问题描述】:

我有一个从数据库填充的TreeView 有很多节点,每个节点可能有一些子节点,并且没有像 2 深度这样的固定角色,它可能非常深。

假设TreeView CheckBoxes 是RadioButtons,我希望我的TreeView 一次只检查一个节点。我尝试了AfterCheck 和BeforeCheck 事件,但它们陷入了永远循环,我该怎么办?

我想保持我选中的节点 CHECKED 并取消选中所有其他节点,但我不能。等待你的聪明点。谢谢。

这是我尝试过但以StackOverFlow 异常结束的代码,我想也许是说去StackOverflow 上检查一下:D

private void tvDepartments_AfterCheck(object sender, TreeViewEventArgs) 
{
   List<TreeNode> nodes = new List<TreeNode>();
   if (rdSubDepartments.Checked)
       CheckSubNodes(e.Node, e.Node.Checked);
   else if (rdSingleDepartment.Checked)
   {
       foreach (TreeNode node in tvDepartments.Nodes)
       {
           if (node != e.Node)
               node.Checked = false;
       }
   }
}


public void CheckSubNodes(TreeNode root, bool checkState)
{
    foreach (TreeNode node in root.Nodes)
    {
        node.Checked = checkState;
        if (node.Nodes.Count > 0)
            CheckSubNodes(node, checkState);
    }
}

【问题讨论】:

  • Mahdi 如果您发布您当前拥有的与您手头的问题相关的代码,它会更好地为您服务..
  • 我认为你的方向是正确的。发布您的代码。
  • 请显示您的private void node_AfterCheck(object sender, TreeViewEventArgs e),您需要 2 个事件,我刚刚突出显示的一个,一个具有类似 private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked) 的方法签名的事件,还检查父节点是否有 ChildNodes。检查您需要做一个foreach{ } 循环仍在等待您发布代码..
  • 好的伙计们,等一下,我会发布代码。
  • @DJKRAZE 我用代码更新了我的问题。

标签: c# winforms treeview treenode oncheckedchanged


【解决方案1】:

Mahdi 应该是这个样子 Ref from TreeView.AfterCheck Event

// Updates all child tree nodes recursively. 
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 CheckAllChildsNodes method recursively. 
         this.CheckAllChildNodes(node, nodeChecked);
      }
   }
}

// NOTE   This code can be added to the BeforeCheck event handler instead of the AfterCheck event. 
// After a tree node's Checked property is changed, all its child nodes are updated to the same value. 
private void node_AfterCheck(object sender, TreeViewEventArgs e)
{
   // The code only executes if the user caused the checked state to change. 
   if(e.Action != TreeViewAction.Unknown)
   {
      if(e.Node.Nodes.Count > 0)
      {
         /* Calls the CheckAllChildNodes method, passing in the current 
         Checked value of the TreeNode whose checked state changed. */ 
         this.CheckAllChildNodes(e.Node, e.Node.Checked);
      }
   }
}

【讨论】:

  • +1。谢谢 DJ KRAZE,我只需要e.Action != TreeViewAction.Unknown。再做一点改变,它就起作用了。祝你好运。
  • Mahdi 很高兴我能够为您指出正确的参考 也祝您好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
相关资源
最近更新 更多