如何获取TreeNodes的TreeView行为,当您检查一个时,它会检查其所有子TreeNodes?

这与大多数应用程序的行为方式相同。 我认为TreeView默认工作就像那样。

有没有办法做到这一点,或者我必须得到一个已检查过的TreeNode的所有子项并自行检查它们?

这是winforms。

你需要自己做,另一方面不是很难:

private void TreeView_AfterCheck(object sender, TreeViewEventArgs e) { SetChildrenChecked(e.Node, e.Node.Checked); } private void SetChildrenChecked(TreeNode treeNode, bool checkedState) { foreach (TreeNode item in treeNode.Nodes) { item.Checked = checkedState; } } 

这需要检查和取消选中所有子项(无论子节点可能有多少级别)。

更新
扩展的代码示例,如果手动检查或取消选中所有子节点,也会检查/取消选中父节点(未经过全面测试,可能会更优雅地完成):

 private void TreeView_AfterCheck(object sender, TreeViewEventArgs e) { SetChildrenChecked(e.Node, e.Node.Checked); if (e.Node.Parent != null) { bool setParentChecked = true; foreach (TreeNode node in e.Node.Parent.Nodes) { if (node.Checked != e.Node.Checked) { setParentChecked = false; break; } } if (setParentChecked) { e.Node.Parent.Checked = e.Node.Checked; } } } private void SetChildrenChecked(TreeNode treeNode, bool checkedState) { foreach (TreeNode item in treeNode.Nodes) { if (item.Checked != checkedState) { item.Checked = checkedState; } } } 

SetChildrenChecked方法中添加的if-block将阻止StackOverflowException在这种情况下,您检查具有子节点的节点,检查它们,并在检查最后一个节点时,父节点(您单击的节点)将被中断并且再次触发AfterCheck事件(这让我感到惊讶;当Checked属性值没有改变时,我不希望引发事件,而只是被分配了它已经拥有的相同值,但是事件再次被称为AfterCheck ,不是AfterCheckedChanged )。