TreeView控件。复选框。然后点击

时间:2010-01-26 17:07:18

标签: c# winforms

我在树视图中添加了复选框,并使用了AfterSelect事件(也尝试过AfterChecked)。

我的树视图就像这样

1州 1.1城市1 1.2城市2 1.3城市3 2国家
2.1城市1 2.2城市2 2.3 City3

我正在尝试运行一个事件,因此当单击一个复选框时,标记会添加到一个阵列中,以备日后处理。我还需要使用它,所以如果单击一个状态,它会选择该叶子下的所有城市。

treeSections.AfterSelect += node_AfterCheck;

private void node_AfterCheck(object sender, TreeViewEventArgs e)
{
    MessageBox.Show("testing");
}

如果没有层次结构,上面的代码可以在树视图上运行。但除非双击每个叶子的文本/标签,否则不要使用州和城市的树视图。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

我建议使用TreeView.NodeMouseClick和TreeView.KeyUp事件的组合... click事件将通过事件args为您提供单击的节点,并且您可以使用当前所选节点的keyup。请按照以下示例...

//This is basic - you may need to modify logically to fit your needs
void ManageTreeChecked(TreeNode node)
{
   foreach(TreeNode n in node.Nodes)
   {
      n.Checked = node.Checked;
   }
}

private void convTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
   ManageTreeChecked(e.Node);
}
private void convTreeView_KeyUp(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.Space)
   {
      ManageTreeChecked(convTreeView.SelectedNode);
   }
}

使用给定每个事件的节点,您现在可以循环遍历该节点上的节点集合,并根据您所执行节点的已检查状态的状态对其进行修改以取消选中/取消选中。

当取消选中所有子节点时,您甚至可以非常想要取消选中父节点。如果你想要一个3状态的treenode(All Checked,Some Checked和None Checked),你必须创建它或找到一个已创建的。(/ p>

享受,祝你好运。

答案 1 :(得分:1)

您需要考虑一些代码:

此处不予考虑:

  1. 在检查时,当子节点选择强制选择父节点时(因为选择了所有其他子节点),选择了哪个节点。

  2. 可能是与此处未考虑的选择相关的其他案例。

  3. 假设:

    1. 您使用的是单节点选择模式的TreeView

    2. 只有两个深度级别,如OP的样本(不需要“重型”递归)

    3. 仅使用鼠标完成所有操作:不需要额外的操作,如键盘按键。

    4. 如果选中所有子节点,则自动检查父节点

    5. 取消选中任何子节点将取消选中已检查的父节点

    6. 检查或取消选中父节点会将所有子节点设置为相同的检查状态

    7. ...

          // the current Node in AfterSelect
          private TreeNode currentNode;
      
          // flag to prevent recursion
          private bool dontRecurse;
      
          // boolean used in testing if all child nodes are checked
          private bool isChecked;
      
          private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
          {
              // prevent recursion here
              if (dontRecurse) return;
      
              // set the currentNode
              currentNode = e.Node;
      
              // for debugging
              //Console.WriteLine("after check node = " + currentNode.Text);
      
              // select or unselect the current node depending on checkstate
              if (currentNode.Checked)
              {
                  treeView1.SelectedNode = currentNode;
              }
              else
              {
                  treeView1.SelectedNode = null;
              }
      
              if(currentNode.Nodes.Count > 0)
              {
                  // node with children : make the child nodes
                  // checked state match the parents
                  foreach (TreeNode theNode in currentNode.Nodes)
                  {
                      theNode.Checked = currentNode.Checked;
                  }
              }
              else
              {
                  // assume a child node is selected here
                  // i.e., we assume no root level nodes without children
      
                  if (!currentNode.Checked)
                  {
                      // the child node is unchecked : uncheck the parent node
                      dontRecurse = true;
      
                          currentNode.Parent.Checked = false;
      
                      dontRecurse = false;
                  }
                  else
                  {
                      // the child node is checked : check the parent node 
                      // if all other siblings are checked
                      // check the parent node
                      dontRecurse = true;
      
                          isChecked = true;
      
                          foreach(TreeNode theNode in currentNode.Parent.Nodes)
                          {
                             if(theNode != currentNode)
                             {
                                 if (!theNode.Checked) isChecked = false;
                             }
                          }
      
                          if (isChecked) currentNode.Parent.Checked = true;
      
                      dontRecurse = false;
                  }
      
              }
          }