这与大多数应用的行为方式相同。我认为默认情况下TreeView就像那样。
有没有办法做到这一点,或者我是否必须让所有已检查过的TreeNode的子项自行检查?
这是winforms。
答案 0 :(得分:7)
你需要自己做,而另一方面不是很难:
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
在您检查具有子节点的节点,检查它们以及检查最后一个节点时parent(你点击的那个)被中断并再次触发AfterCheck
事件(这让我感到惊讶;当Checked
属性值没有改变时我不希望引发事件而是只是获得了它已经拥有的相同值,但是事件再次被称为 AfterCheck ,而不是 AfterCheckedChanged )。