当在 TreeView 中单击节点时,我使用 TreeView 上的单击事件来执行一些操作。我通过使用鼠标坐标调用 GetNodeAt() 获取单击的节点来实现此目的,如下所示:

private void TreeView_Click(object sender, System.EventArgs e)
{
    MouseEventArgs mouseEventArgs = e as MouseEventArgs;

    if (mouseEventArgs == null)
        return;

    // Get the node that is being clicked.                  
    TreeNode node = this.GetNodeAt(mouseEventArgs.X, mouseEventArgs.Y);

    // Do other stuff...
}

但是,GetNodeAt() 方法仅在单击节点标签时有效,单击节点图像时 GetNodeAt() 返回 null。这有点烦人,因为单击图像时实际上选择了节点,但我无法找出它是什么节点。

有人有什么建议吗?

更新:我收到了一些使用 SelectedNode 的建议。我不能,因为它是在 Click 事件触发后设置的。这实际上是在继承 TreeView 的控件中,它的作用是触发它自己的 Clicked 事件,但使用 TreeNode 代表的底层数据而不是 TreeNode 本身。

更新:事实证明,有人重写了我们代码中的 GetNodeAt() 方法,从而引入了这种行为,但我没有意识到。所以这个问题是无效的,GetNodeAt()方法没有问题。为什么有人会这样做仍然是个谜。:)

有帮助吗?

解决方案

您是否尝试过BeforeSelect或AfterSelect活动?你可以选择的节点直接从TreeViewCancelEventArgs,然后在点击事件中使用它。

编辑:其他思想:我可以用这个看到的唯一问题是,BeforeSelect事件实际上触发之后的点击鼠标点击和活动

另一个编辑:如果你需要一个事件,点击之前触发,你可以使用NodeMouseClick - TreeNodeMouseClickEventArgs有一个节点属性

其他提示

为什么不直接使用 TreeView.SelectedNode?

尝试:

TreeNode node = this.SelectedNode;

编辑:由Sean殴打冲头

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top