这与大多数应用程序的行为方式相同。我认为 TreeView 默认情况下是这样工作的。
有没有办法做到这一点,或者我是否必须获取已检查的 TreeNode 的所有子节点并自己检查它们?
这是winform。
你需要自己做,但另一方面这并不难:
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;
}
}
这负责检查和取消检查所有子节点(无论下面可能有多少层子节点)。
Update
扩展的代码示例,如果手动检查或取消选中所有子节点,还将检查/取消选中父节点(未经过彻底测试,可能可以做得更优雅):
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;
}
}
}
添加到的 if 块SetChildrenChecked
方法将防止StackOverflowException
在您检查带有子节点的节点的情况下,它们会被检查,并且当检查最后一个节点时,父节点(您单击的那个)会被检查并触发AfterCheck
再次发生事件(这让我有点惊讶;我不希望在Checked
属性值不会改变,而只是被分配与已有的相同值,但随后该事件再次被调用检查后, not 选中后更改).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)