Winform C#:扩展和折叠时的节点选择在Treeview底部发生变化

时间:2016-09-14 13:46:29

标签: c# winforms treeview

我在Windows窗体中使用Treeview但遇到了一些问题。扩展和折叠时我的节点选择在Treeview底部发生变化。我正在使用afterselect和MosueDown活动。我的问题是我必须在我的应用程序中处理AfterSelect和MouseDown事件,因为我正在使用右键单击上下文菜单。下面是我尝试使用的示例代码。有没有办法或建议来解决这个问题?

 private void trView_MouseDown(object sender, MouseEventArgs e)
 {
       if (e.Button == MouseButtons.Right)
       {
          trView.SelectedNode = trView.GetNodeAt(e.X, e.Y);
       }
      //trView.SelectedNode.EnsureVisible(); //tried this as well

      trView.SelectedNode.Toggle(); // on this toggle selection changes butonly at the bottom (more specifically for last 3 nodes)
 }

 private void trView_AfterSelect(object sender, TreeViewEventArgs e)
 {
    // Code to add child nodes to a selection.
 }

enter image description here

在上面的图片中,当我选择Project Beyond Node时,UAT数据被选中。这只发生在最后3个节点中。我被卡住了。请帮忙。

1 个答案:

答案 0 :(得分:1)

您可以使用以下任一选项:

  1. 使用MouseDown事件,在使用SelectedNode设置ToggleBeginInvoke之后:

    private void treeView1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);
            treeView1.BeginInvoke(new Action(() => { treeView1.SelectedNode.Toggle(); }));
        }
    }
    
  2. 使用NodeMouseClick事件:

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);
            treeView1.SelectedNode.Toggle();
        }
    }
    
  3. 注意

    通常,点击+/-后应执行切换操作,因为选择操作与单击+/-不同。但您可以简单地根据var node = treeView1.GetNodeAt(e.X, e.Y)var hti = treeView1.HitTest(e.Location);以及e.Button混合使用某些条件,以满足鼠标按下的任何要求。

    例如,在下面的代码中,左键单击和右键单击以相同的方式工作,它们都选择节点并且都切换所选节点。

    private void treeView1_MouseDown(object sender, MouseEventArgs e)
    {
        var node = treeView1.GetNodeAt(e.X, e.Y);
        var hti = treeView1.HitTest(e.Location);
        if (node == null)
            return;
        treeView1.BeginInvoke(new Action(() => treeView1.SelectedNode = node));
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            node.Toggle();
        }
        else if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            if (hti.Location != TreeViewHitTestLocations.PlusMinus)
                node.Toggle();
        }
    }