我必须做类似的事情,如果点击一个孩子,就会自动选择父母。所以我想这可能会有所帮助,因为它会首先选择所有父母,然后您可以通过查找已选择(从顶部)来清理:
private void RecursiveCheckNodesDown(TreeNodeCollection tree, bool checkedFlag)
{
if (tree != null)
foreach (TreeNode node in tree)
RecursiveCheckNodesDown(node.Nodes, node.Checked = checkedFlag);
}
private void RecursiveCheckNodesUp(TreeNode node, bool checkedFlag)
{
if( node != null )
RecursiveCheckNodesUp(node.Parent, node.Checked = checkedFlag);
}
private void SomeTreeBeginUpdate()
{
SomeTree.BeginUpdate();
SomeTree.AfterCheck -= SomeTree_AfterCheck;
}
private void SomeTreeEndUpdate()
{
SomeTree.AfterCheck += SomeTree_AfterCheck;
SomeTree.EndUpdate();
}
private void SomeTree_AfterCheck(object sender, TreeViewEventArgs e)
{
SomeTreeBeginUpdate();
RecursiveCheckNodesDown(e.Node.Nodes, e.Node.Checked);
if( e.Node.Checked )
RecursiveCheckNodesUp(e.Node.Parent, e.Node.Checked);
SomeTreeEndUpdate();
}
this.SomeTree.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.SomeTree_AfterCheck);