带有CheckBoxes的TreeView在c#中

RRR*_*RRR 7 c# treeview

我有一个带有c#复选框的树视图,我希望当用户检查一个节点时,自动检查下面级别上的所有节点.每次用户检查某个节点时,是否有人知道如何在没有在所有树上运行recorsive fnction的情况下执行此操作?

谢谢

//这个函数返回treeView.

   public TreeView GetTreeView()
    {

        getSubject();
        // fill the treeview with all subjects.
        foreach (Subject subject in subjects)
        {
            //for each root subject fill all the his children.
            if (subject.subjestId == subject.parentSubject)
            {
                TreeNode node = new TreeNode(subject.subjectString, subject.subjestId, subject.subjestId);
                addChild(node, subject.subjestId);
                tv.Nodes.Add(node);
            }
        }
        return tv;
    }
   // for each subject return sub subjects.
   private void addChild(TreeNode node, int parentId)
    {
        foreach (Subject subject in subjects)
        {
            if (subject.parentSubject == parentId && subject.parentSubject != subject.subjestId)
            {
                TreeNode childNode = new TreeNode(subject.subjectString, subject.subjestId, subject.subjestId);
                addChild(childNode, subject.subjestId);
                node.Nodes.Add(childNode);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 17

递归.像这样:

    bool busy = false;

    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) {
        if (busy) return;
        busy = true;
        try {
            checkNodes(e.Node, e.Node.Checked);
        }
        finally {
            busy = false;
        }
    }

    private void checkNodes(TreeNode node, bool check) {
        foreach (TreeNode child in node.Nodes) {
            child.Checked = check;
            checkNodes(child, check);
        }
Run Code Online (Sandbox Code Playgroud)

  • @dig,因为分配child.Checked将导致AfterCheck事件再次运行。那不会很好。 (2认同)