我使用了treeview控件的鼠标按下事件。我想将所选节点设置为发生鼠标按下事件的节点。如何解决这个问题?
答案 0 :(得分:2)
在选择节点之前触发MouseDown
事件。请尝试处理AfterSelect
事件。如果e.Action
设置为TreeViewAction.ByMouse
,则鼠标会引发事件。
答案 1 :(得分:0)
这里有几种选择。两者都可能是矫枉过正,但他们仍然可以解决问题。
处理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;
}
}
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);
}
}
第一种方法应该适合您。在打破更大的武器之前尝试一下。