关于treeview控件

时间:2011-04-15 08:00:05

标签: c# winforms treeview

我使用了treeview控件的鼠标按下事件。我想将所选节点设置为发生鼠标按下事件的节点。如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

在选择节点之前触发MouseDown事件。请尝试处理AfterSelect事件。如果e.Action设置为TreeViewAction.ByMouse,则鼠标会引发事件。

答案 1 :(得分:0)

这里有几种选择。两者都可能是矫枉过正,但他们仍然可以解决问题。

  1. 处理MouseDown事件并使用HitTest method确定用户点击的节点。如果他们点击了有效节点,请通过SelectedNode property手动将焦点设置到该节点。

    private void myTreeView_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            myTreeView.SelectedNode = myTreeView.HitTest(e.Location).Node;
        }
    }
    
  2. bazooka式解决方案是覆盖WndProc方法并侦听WM_RBUTTONDOWN条消息。我在我自己的TreeView控件的扩展版本中完成了这个,因为它允许我修复一些非常小的东西,正常的,非强迫性的人可能不会注意到。我进入excruciating detail in my answer here

    基本上,你正在做与上面代码相​​同的事情,但是在较低的层次上,这会阻止本机控制以焦点拉动一些恶作剧。我不记得他们是否真的适用于此(因此潜在的矫枉过正),但我太懒了,无法启动Visual Studio以确定。

    public class FixedTreeView : System.Windows.Forms.TreeView
    {
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            const int WM_RBUTTONDOWN = 0x204;
            if (m.Msg == WM_RBUTTONDOWN)
            {
                Point mousePos = this.PointToClient(Control.MousePosition);
                this.SelectedNode = this.GetNodeAt(mousePos);
            }
            base.WndProc(ref m);
        }   
    }
    
  3. 第一种方法应该适合您。在打破更大的武器之前尝试一下。