Один проверяемый узел за раз в TreeView

У меня есть TreeView, заполненный из базы данных с большим количеством узлов, и у каждого узла может быть несколько дочерних элементов, и нет фиксированной роли, такой как 2 глубины, она может быть очень глубокой.

Представьте, что TreeView CheckBoxes это RadioButtons, я хочу, чтобы мой TreeView проверял только один узел за раз. Я пробовал события AfterCheck и BeforeCheck, но они попадают в бесконечный цикл, что мне делать?

Я хочу оставить свой проверенный узел ПРОВЕРЕННЫМ и снять все остальные узлы, но я не могу. Жду ваших умных очков. Спасибо.

Вот код, который я попробовал, но в итоге получил исключение StackOverFlow, и я подумал, что, может быть, он говорит: «Иди и проверь его на StackOverflow: D

private void tvDepartments_AfterCheck(object sender, TreeViewEventArgs) 
{
   List<TreeNode> nodes = new List<TreeNode>();
   if (rdSubDepartments.Checked)
       CheckSubNodes(e.Node, e.Node.Checked);
   else if (rdSingleDepartment.Checked)
   {
       foreach (TreeNode node in tvDepartments.Nodes)
       {
           if (node != e.Node)
               node.Checked = false;
       }
   }
}


public void CheckSubNodes(TreeNode root, bool checkState)
{
    foreach (TreeNode node in root.Nodes)
    {
        node.Checked = checkState;
        if (node.Nodes.Count > 0)
            CheckSubNodes(node, checkState);
    }
}

person Mahdi Tahsildari    schedule 12.01.2013    source источник
comment
Махди, было бы лучше, если бы вы опубликовали код, который у вас есть в настоящее время, который относится к вашему вопросу.   -  person MethodMan    schedule 12.01.2013
comment
Я думаю, вы связываете в правильном направлении. Разместите свой код.   -  person Rafal    schedule 12.01.2013
comment
Пожалуйста, покажите свои private void node_AfterCheck(object sender, TreeViewEventArgs e), вам нужны 2 события, это одно, которое я только что выделил, и одно, у которого есть метод Signature, подобный этому private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked) также, чтобы проверить, есть ли у родительского узла дочерние узлы. Проверено, вам нужно выполнить цикл foreach { }, все еще ожидающий, пока вы опубликуете свой код ..   -  person MethodMan    schedule 12.01.2013
comment
хорошо, чуваки, подождите минутку, и я опубликую код.   -  person Mahdi Tahsildari    schedule 12.01.2013
comment
@DJKRAZE Я обновил свой вопрос кодом.   -  person Mahdi Tahsildari    schedule 12.01.2013


Ответы (1)


Махди, вот как это должно выглядеть Ссылка из TreeView .Событие после проверки

// Updates all child tree nodes recursively. 
private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
{
   foreach(TreeNode node in treeNode.Nodes)
   {
      node.Checked = nodeChecked;
      if(node.Nodes.Count > 0)
      {
         // If the current node has child nodes, call the CheckAllChildsNodes method recursively. 
         this.CheckAllChildNodes(node, nodeChecked);
      }
   }
}

// NOTE   This code can be added to the BeforeCheck event handler instead of the AfterCheck event. 
// After a tree node's Checked property is changed, all its child nodes are updated to the same value. 
private void node_AfterCheck(object sender, TreeViewEventArgs e)
{
   // The code only executes if the user caused the checked state to change. 
   if(e.Action != TreeViewAction.Unknown)
   {
      if(e.Node.Nodes.Count > 0)
      {
         /* Calls the CheckAllChildNodes method, passing in the current 
         Checked value of the TreeNode whose checked state changed. */ 
         this.CheckAllChildNodes(e.Node, e.Node.Checked);
      }
   }
}
person MethodMan    schedule 12.01.2013
comment
+1. Спасибо, DJ KRAZE, все, что мне было нужно, это e.Action != TreeViewAction.Unknown. С небольшими изменениями все заработало. Удачи чувак. - person Mahdi Tahsildari; 12.01.2013
comment
Махди рад, что смог указать вам правильную ссылку. Удачи вам - person MethodMan; 12.01.2013