Checkbox选中子节点状态

Checkbox checked state of child node

我正在使用 VS 2005 (.NET 2.0) C# 在具有 XML 解析为 TreeView 功能的 Winform 上工作。

我打算启用树视图列表的复选框。实际上,我已经启用了它们。我在寻找 TreeView 和 TreeNode 的一些可能有用的属性时发现了这段代码 here。我找到 TreeNode.Checked 属性 和 TreeView.CheckBoxes 属性.

public void HighlightCheckedNodes()
{
   int countIndex = 0;
   string selectedNode = "Selected customer nodes are : ";
   foreach (TreeNode myNode in myTreeView.Nodes[0].Nodes)
   {
      // Check whether the tree node is checked.
      if(myNode.Checked)
      {
         // Set the node's backColor.
         myNode.BackColor = Color.Yellow;
         selectedNode += myNode.Text+" ";
         countIndex++;
      }
      else
         myNode.BackColor = Color.White;
   }

   if(countIndex > 0)
      MessageBox.Show(selectedNode);
   else
      MessageBox.Show("No nodes are selected");
}

所以我在我的测试项目上试了一下,它只对父节点起作用,对子节点不起作用。我想要做的和发生的是我还必须确定子节点的检查状态。我正在从事一个需要选择单个到多个子节点并在检查后执行一次外部程序的项目。对于子节点,这可能吗?或者有没有其他的选择。

如果我有任何不清楚的地方,请告诉我。提前谢谢你。

我认为您需要将代码更改为以下内容(在我看来您刚刚使用了 MSDN 中的代码)。给定的代码提供了一个您可以采用的示例答案。

   // Start from Root type node ; Loop them all
   foreach (TreeNode rootNodes in treeView1.Nodes)
   {
       // Sub note set of current  root
       foreach (TreeNode childs in rootNodes.Nodes)
       {
          childs.Text = "Checked";    // Testing for validity : First level of child

          /*
           * Needs to go further down if we have childs of childs
          foreach (TreeNode child_child in childs.Nodes)
          {
              child_child.Text = "Checked";  // Testing for validity : Second level of child
           }
         */ 
       }
  }

解释:

给出的示例将更改以下结构的文本(选中的文本应用于子项)

  ROOT
     |-> Child
     |-> Child
  ROOT
     |-> Child
     |-> Child

如果您取消注释最里面的 foreach 您可以将其应用于如下结构((文本已选中应用于子项))

  ROOT
     |-> Child
          |-> Child
          |-> Child
     |-> Child
  ROOT
     |-> Child
     |-> Child

在您的代码中,您不会进一步向下 TreeNode 并且您忘记了每个 TreeNode 都可以包含它自己的子节点集合。

简单的说,

    myTreeView.Nodes[0].Nodes // <- This is wrong for what you want