【问题标题】:Programmatically click on node in treeview?以编程方式单击树视图中的节点?
【发布时间】:2009-10-30 15:17:57
【问题描述】:

我确实需要以编程方式单击集合中的所有节点,但我看不到如何做到这一点。我最终尝试调用 Node_Click 事件,但我不知道如何使用参数。

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

编辑: 我需要提高 TreeNode_After 选择。这是因为树视图表示 DB 结构,如果您单击节点,它可能有也可能没有子级(取决于 DB 检索到的内容)。这个循环应该作为 ExpandAll。

【问题讨论】:

  • 我想我有一个答案给你,但首先,我需要问你为什么需要这样做?您是否需要以编程方式触发事件以触发事件处理程序中的代码?
  • 我编辑了我的答案,以便在选择树中的每个节点后触发它。

标签: c# winforms treeview


【解决方案1】:

要使树中的每个节点都被选中,请执行以下操作:

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

编辑:
还值得注意的是,您的代码:

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

不会在树中的每个节点上触发,它只会返回最上层的节点。因此,如果它们中的任何一个具有子节点,则上面的 foreach 将不会看到它们。如果您想获取整个树中的每个节点,则需要递归它们,就像我在上面的示例中所做的那样。

【讨论】:

    【解决方案2】:

    您可以简单地通过将节点传递给“类似处理程序”的函数来“伪造”点击:

    foreach (TreeNode node in treeView1.Nodes)
    {
       node_click(node, null)
    }
    
    protected void node_click(object sender, System.EventArgs e )
    {
        //...Your code here
    
    }
    

    【讨论】:

      【解决方案3】:

      这会实现您的目标吗?

              foreach (TreeNode node in this.treeView1.Nodes)
              {
                  this.treeView1.SelectedNode = node;
              }
      

      【讨论】:

        【解决方案4】:

        那么,您是否定义并连接了 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 的调用

        【讨论】:

          猜你喜欢
          • 2013-03-04
          • 1970-01-01
          • 2015-02-09
          • 2013-07-13
          • 1970-01-01
          • 2011-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多