TreeView с флажками в C # - PullRequest
       3

TreeView с флажками в C #

6 голосов
/ 30 марта 2011

У меня есть древовидное представление с флажками в c #, я хочу, чтобы, когда пользователь проверяет один узел, все узлы, которые находятся на уровнях ниже автоматического, также проверялись. Кто-нибудь знает о способе сделать это без запуска с рекурсивной функцией по всему дереву каждый раз, когда пользователь проверяет какой-то узел?

Спасибо

// эта функция возвращает 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);
            }
        }
    }

Ответы [ 5 ]

17 голосов
/ 30 марта 2011

рекурсия. Как это:

    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);
        }
1 голос
/ 08 мая 2012
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) {
  foreach (TreeNode child in e.Node.Nodes) {
    child.Checked = e.Node.Checked;
  }
}
0 голосов
/ 18 июля 2013

В качестве числа ответов укажите рекурсивную функцию 'set selected to children', а затем вызовите ее в дереве AfterCheck.

Платформа, к сожалению, возвращает вам вызов AfterCheck, даже если вы установилипроверочное значение в коде, и хотя это может быть незаметно в небольших деревьях, добавляет огромное количество экспоненциальной дополнительной работы для вашего приложения.Чтобы избежать этого, отфильтруйте AfterCheck, чтобы запустить новую функцию, только если она была запущена пользователем.

    private void tree_AfterCheck(object sender, TreeViewEventArgs e)
    {
        if (e.Action != TreeViewAction.Unknown)
        {
            SetChildrenChecked(e.Node);
        }
    }

    private void SetChildrenChecked(TreeNode treeNode)
    {
        foreach (TreeNode item in treeNode.Nodes)
        {
            if (item.Checked != treeNode.Checked)
            {
                item.Checked = treeNode.Checked;
            }

            if (item.Nodes.Count > 0)
            {
                SetChildrenChecked(item);
            }                
        }
    }
0 голосов
/ 08 ноября 2012

Это лучшее решение

private void trvMenuList_AfterCheck(object sender, TreeViewEventArgs e)
        {
            SetChildrenChecked(e.Node, e.Node.Checked);

        }

  private void SetChildrenChecked(TreeNode treeNode, bool checkedState)
        {
            foreach (TreeNode item in treeNode.Nodes)
            {
                if (item.Checked != checkedState)
                {
                    item.Checked = checkedState;
                }
                SetChildrenChecked(item, item.Checked);
            }
        }
0 голосов
/ 30 марта 2011

Если вы хотите сделать это в WinForms, то я думаю, что вы должны сделать это вручную с помощью рекурсии - лучшего способа я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...