[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。所以两个事件只能保留一个。

留下回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据