你需要自己做,而另一方面不是很难:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这需要检查和取消选中所有子项(无论子节点可能有多少级别).
更新
扩展的代码示例,如果手动检查或取消选中所有子节点,也会检查/取消选中父节点(未经过全面测试,可能更优雅地完成):
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在SetChildrenChecked方法中添加的if-block 将阻止StackOverflowException在检查具有子节点的节点的情况下,检查它们,并且在检查最后一个节点时,父节点(您单击的节点)将被中断并触发AfterCheck再次发生事件(这让我感到惊讶;我不希望在Checked属性值没有改变的情况下引发事件,而只是为它分配了它已经拥有的相同值,但是事件再次被称为AfterCheck,而不是AfterCheckedChanged).
| 归档时间: |
|
| 查看次数: |
3048 次 |
| 最近记录: |