Программно щелкнуть узел в дереве?

Мне действительно нужно было бы программно щелкнуть все узлы в коллекции, но я не вижу, как это сделать. В итоге я пытаюсь вызвать событие Node_Click, но не знаю, как использовать аргументы.

foreach (TreeNode node in treeView1.Nodes)
{
    //here I would need to "click" on each node
}

EDITED: мне нужно поднять TreeNode_After select. Это потому, что древовидная структура представляет структуру БД, и если вы нажмете на узел, он может иметь или не иметь дочерние элементы (зависит от того, что извлекает БД). Этот цикл должен служить ExpandAll.


person Petr    schedule 30.10.2009    source источник
comment
Я думаю, что у меня есть ответ для вас, но сначала я должен спросить, зачем вам это нужно? Вам нужно программно инициировать событие, чтобы запустить код в обработчике событий?   -  person David    schedule 30.10.2009
comment
Я отредактировал свой ответ, чтобы он срабатывал после выбора для каждого узла в дереве.   -  person Neil N    schedule 30.10.2009


Ответы (4)


Чтобы выделить каждый узел в дереве, сделайте следующее:

 void SelectAllNodes(TreeNodeCollection tnc)
 {
     foreach(TreeNode t in tnc)
     {
        treeView1.SelectedNode = t;
        SelectAllNodes(t.Nodes);
     }
 }

EDIT:
Стоит также отметить, что ваш код:

 foreach (TreeNode node in treeView1.Nodes)
 {
      //here I would need to "click" on each node
 }

Не будет срабатывать на каждом узле в дереве, он будет возвращать только узлы на самом верхнем уровне. Поэтому, если у кого-то из них есть дочерние узлы, они не будут видны вашему foreach выше. Если вы хотите получить КАЖДЫЙ узел во всем дереве, вам нужно будет пройти через них, как я сделал в моем примере выше.

person Neil N    schedule 30.10.2009

Вы можете «подделать» щелчок, просто передав узел в «подобную обработчику» функцию:

foreach (TreeNode node in treeView1.Nodes)
{
   node_click(node, null)
}

protected void node_click(object sender, System.EventArgs e )
{
    //...Your code here

}
person Dave Swersky    schedule 30.10.2009

Достигнет ли это того, что вы ищете?

        foreach (TreeNode node in this.treeView1.Nodes)
        {
            this.treeView1.SelectedNode = node;
        }
person Philip Wallace    schedule 30.10.2009

Итак, у вас есть определенный и подключенный метод обработчика событий TreeView.NodeMouseClick? Если у вас есть этот метод, вы можете просто вызвать его в цикле foreach следующим образом:

foreach (TreeNode node in treeView1.Nodes)
{
    treeView1_NodeMouseClick(node, null);
}

выше этого утверждения, например, в моем конструкторе, у меня есть этот код

treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);

И у меня есть неаккуратный обработчик событий, например:

public void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    TreeNode node = sender as TreeNode;
    if (node != null)
        MessageBox.Show(node.Text);
}

Отправка null для TreeNodeMouseClickEventArgs должна быть безопасной, если вы не планируете фактически использовать аргументы события.

РЕДАКТИРОВАНИЕ в ответ на редактирование вопроса:

Похоже, вам нужно просто вызвать метод AfterSelect(...) с помощью прямого вызова, когда ваш пользователь нажимает кнопку Expand All. Итак, если я правильно понимаю вашу архитектуру, вы хотите добавить вызов AfterSelect в обработчик щелчка кнопки Раскрыть все.

person Matthew Ruston    schedule 30.10.2009