[C#]Winform记录TreeView的checked_change事件
401 Views
对treeView操作时发现一个有趣的事情。
想要实现点击treeView某一个节点,或者点击该节点的复选框时,将其所有子节点设为与该节点相同的check状态。
1.如果是点击,则触发MouseClick()事件,此时需要遍历该节点的所有子节点,递归设置所有子节点的check状态。
public void SetChildCheckState(TreeNode tnParent,bool b)
{
for (int i = 0; i < tnParent.Nodes.Count; i++)
{
tnParent.Nodes[i].Checked = b;
SetChildCheckState(tnParent.Nodes[i],b);
}
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
TreeNode tmp = e.Node;
if (tmp.Checked)
SetChildCheckState(tmp, false);
else
SetChildCheckState(tmp, true);
}
2.如果是选择复选框,则只需要遍历其子节点改变状态即可
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
TreeNode tmp = e.Node;
foreach (TreeNode t in tmp.Nodes)
{
t.Checked = tmp.Checked;
}
}
这是因为,选中复选框,在改变其子节点的check状态时,又一次触发了treeView1_AfterCheck事件,相当于自身在执行递归,所以不用再手动写。
而且,如果两个方法一起使用,treeView1_NodeMouseClick会屏蔽treeView1_AfterCheck。因为点击复选框会优先触发treeView1_AfterCheck,treeView1_AfterCheck执行完后再次调用treeView1_NodeMouseClick。所以两个事件只能保留一个。