winforms 在c#中选中和取消选中树视图的所有节点

tpgth1q7  于 2022-12-14  发布在  C#
关注(0)|答案(6)|浏览(321)

我在我的windows应用程序中有一个树视图,在树视图中有复选框,我有一些“父节点”和一些“子节点”,我想在单击“全部选中”和“全部取消选中”按钮时一次选中和取消选中父节点和子节点...我应该如何做?

lf3rwulv

lf3rwulv1#

请尝试以下操作:

public void CheckAllNodes(TreeNodeCollection nodes)
{
    foreach (TreeNode node in nodes)
    {
        node.Checked = true;
        CheckChildren(node, true);
    }
}

public void UncheckAllNodes(TreeNodeCollection nodes)
{
    foreach (TreeNode node in nodes)
    {
        node.Checked = false;
        CheckChildren(node, false);
    }
}

private void CheckChildren(TreeNode rootNode, bool isChecked)
{
    foreach (TreeNode node in rootNode.Nodes)
    {
        CheckChildren(node, isChecked);
        node.Checked = isChecked;
    }
}

编辑:选中分支以勾选/取消勾选所有子节点:

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    CheckChildren(e.Node, e.Node.Checked);
}
5jdjgkvh

5jdjgkvh2#

尝试

private void CheckUncheckTreeNode(TreeNodeCollection trNodeCollection, bool isCheck)
        {
            foreach (TreeNode trNode in trNodeCollection)
            {
                trNode.Checked = isCheck;
                if (trNode.Nodes.Count > 0)
                    CheckUncheckTreeNode(trNode.Nodes, isCheck);
            }
        }

treeView.Nodes传递给这个函数,就像在button click事件中传递CheckUncheckTreeNode(trView.Nodes, true);一样,以检查所有节点。要取消选中所有节点,请执行CheckUncheckTreeNode(trView.Nodes, false);

3yhwsihp

3yhwsihp3#

对于ASP.NET WEB应用程序:

Button_Click() {
    CheckUncheckTreeNode(YourTreeView.Nodes, false);
}

private void CheckUncheckTreeNode(TreeNodeCollection trNodeCollection, bool isCheck) {
    foreach (TreeNode trNode in trNodeCollection) {
        trNode.Checked = isCheck;
        if (trNode.ChildNodes.Count > 0)
            CheckUncheckTreeNode(trNode.ChildNodes, isCheck);
    }
}
m1m5dgzv

m1m5dgzv4#

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        if (e.Node.Checked)
        {
            UncheckNodes(treeView1.Nodes,e.Node);
        }

    }

    private void UncheckNodes(TreeNodeCollection nodes, TreeNode except)
    {
        foreach (TreeNode node in nodes)
        {
            if (node != except) node.Checked = false;
            UncheckNodes(node.Nodes, except);
        }
    }
pb3skfrl

pb3skfrl5#

您可以在不使用递归情况下使用此代码。

foreach (TreeNode Node in TreeNodeInUI.Nodes)
{
    Node.Checked = false;
}
3okqufwl

3okqufwl6#

当我偶然发现一个类似的问题时,我找到了一个简洁的解决方案。是的,这是8年后的事了,但也许有人可以利用这个。
每当选中TreeNode时,将此TreeNode存储在List中。当需要取消选中所有节点时,循环List并取消选中节点。这样,您可以只迭代受影响的节点。
示例:

检查后将TreeNodes存储在列表中

public List<TreeNode> checkedNodes;

private void treeView1_afterCheck(object sender, TreeViewEventArgs e)
{
    foreach(TreeNode node in treeView1.Nodes)
    {
    if(node.checked) {
        checkedNodes.Add(node);
    }
}

仅迭代选中的节点以取消选中所有节点

public void UncheckAllNodes()
{
    foreach (TreeNode node in checkedNodes)
    {
        node.Checked = false;
    }
}

当取消选中一个复选框时,这仍然缺少一个删除,但你得到了这个想法。

相关问题