【问题标题】:About treeview control关于树形视图控件
【发布时间】:2011-04-24 07:09:49
【问题描述】:

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

【问题讨论】:

  • TreeView 控件自动选择用户用鼠标点击的节点。
  • @Cody Gray:在我的应用程序中,当我单击鼠标右键时,它没有选择该节点作为选定节点,它选择先前选择的节点进行进一步操作。但我想要用户右键单击但用户可能选择也可能不选择的节点。那有可能吗?
  • 您尝试过 Bradley 的解决方案吗?如果需要,您可以在比这更低的级别实现它,但他是迄今为止最简单的解决方案。
  • @Cody 他是对的,无论出于何种原因,鼠标右键都不会选择TreeView 中的节点。看起来不像传统的 Windows 行为,一定是 WinForms 的怪癖。
  • @Bradley:是的,这很可能是 WinForms 实现中的一个错误。很久以前,我创建了自己的自定义 TreeView 控件,修复了大量一次性错误,因此我忘记了大部分可能潜伏的问题。我可以想到几个不同的解决方案,它们可能有点矫枉过正,但我​​想我还是会发布它们。

标签: c# winforms treeview


【解决方案1】:

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

【讨论】:

  • 但我想检查是否单击了鼠标右键,因为我想根据单击的鼠标按钮进行一些进一步的操作。那我该怎么办呢?
  • 如果你真的想要这样做,你必须使用MouseDown事件并调用HitTest方法来获取鼠标指针下的节点。然后,您可以将该节点(如果有)分配给 SelectedNode 属性。
  • 非常感谢。我使用 HitTest 方法得到了我的确切结果。
【解决方案2】:

这里想到了几个选项。两者都可能有点矫枉过正,但它们仍然可以解决问题。

  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. 火箭筒式的解决方案是覆盖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);
        }   
    }
    

第一种方法对你来说应该很好用。在使用更大的武器之前尝试一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多