0

我正在使用一个 Windows 窗体应用程序,我有树视图来显示文件夹列表,并且我已经附加了NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)事件。并单击节点,我调用服务器方法来填充树视图。在这里,我可以看到我的一个树节点的 NodeMouseClick 根本没有被触发。但是对于其余节点,它可以正常工作,没有任何问题。谁能告诉我它没有被触发的确切原因是什么。而且我不想使用 After_Select 事件。

public Form1()
    {
        InitializeComponent();
        Init();
    }

    private void Init()
    {
        treeView1.Nodes.Add("root");

        for (int i = 0; i < 23; i++)
        {
            treeView1.Nodes[0].Nodes.Add(i.ToString());
            treeView1.Nodes[0].Nodes[i].Nodes.Add("child" + i.ToString());
        }

        treeView1.Nodes[0].Expand();
    }

使用大小 = 280,369 的树视图

4

2 回答 2

1

正如我之前在评论中提到的,解决方法是下拉到 Windows API 的级别,拦截鼠标消息,并自己引发节点单击事件。代码很丑,但是很实用。

将以下代码添加到项目中的新类(我称之为CustomTreeView):

class CustomTreeView : System.Windows.Forms.TreeView
{
    public event EventHandler<TreeNodeMouseClickEventArgs> CustomNodeClick;

    private const int WM_LBUTTONDOWN = 0x201;

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if (m.Msg == WM_LBUTTONDOWN)  // left mouse button down
        {
            // get the current position of the mouse pointer
            Point mousePos = Control.MousePosition;

            // get the node the user clicked on
            TreeNode testNode = GetNodeAt(PointToClient(mousePos));

            // see if the clicked area contained an actual node
            if (testNode != null)
            {
                // A node was clicked, so raise our custom event
                var e = new TreeNodeMouseClickEventArgs(testNode,
                                 MouseButtons.Left, 1, mousePos.X, mousePos.Y);
                if (CustomNodeClick != null)
                    CustomNodeClick(this, e);
            }
        }

        // call through to let the base class process the message
        base.WndProc(ref m);
    }
}

System.Windows.Forms.TreeView然后将代码中对控件的所有引用更改为CustomTreeView刚刚创建的新类。这是您要改用的现有控件的子类。TreeView如果您不熟悉子类化,这是我们修改现有功能或将新功能附加到现有控件的方式。在这种情况下,我们对原始TreeView控件进行了子类化,以添加CustomNodeClick我们将在检测到用户单击节点时自行引发的事件。

最后,更改表单类中的事件处理程序方法以侦听CustomNodeClick我们正在引发的事件,而不是NodeMouseClick您之前尝试使用的错误事件。

编译并运行。一切都应该按预期工作。

于 2011-02-01T14:38:03.733 回答
0

尝试使用AfterSelectEvent 它必须在任何节点选择后触发。

于 2011-01-30T07:08:40.157 回答