查找节点在上下文菜单下单击

我怎样才能找出树列表中的哪个节点的上下文菜单已被激活? 例如,右键单击节点并从菜单中select一个选项。

我不能使用TreeViews的SelectedNode属性,因为节点只是被右键单击,没有被选中。

您可以添加一个鼠标单击事件到TreeView,然后使用GetNodeAtselect正确的节点给定由MouseEventArgs提供的鼠标坐标。

 void treeView1MouseUp(object sender, MouseEventArgs e) { if(e.Button == MouseButtons.Right) { // Select the clicked node treeView1.SelectedNode = treeView1.GetNodeAt(eX, eY); if(treeView1.SelectedNode != null) { myContextMenuStrip.Show(treeView1, e.Location); } } } 

这是我的解决scheme。 把这一行放到TreeView的NodeMouseClick事件中:

  ((TreeView)sender).SelectedNode = e.Node; 

我发现标准的Windows TreeView行为select行为是相当烦人的。 例如,如果您正在使用资源pipe理器并右键单击一个节点并点击属性,则会突出显示该节点并显示您单击的节点的属性对话框。 但是当您从对话框返回时,突出显示的节点是之前选中/突出显示的节点,然后再单击鼠标右键。 我发现这会导致可用性问题,因为我一直在困惑我是否在正确的节点上行事。

因此,在我们的许多GUI中,我们通过右键单击来更改所选的树节点,以免混淆。 这可能不像一个标准的iwndos应用程序,如资源pipe理器(我倾向于强烈build模我们的GUI行为之后出于可用性原因的标准窗口应用程序),我相信这一个例外情况导致更多的可用树。

以下是一些代码,可以在右键单击时更改select内容:

  private void tree_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { // only need to change selected note during right-click - otherwise tree does // fine by itself if ( e.Button == MouseButtons.Right ) { Point pt = new Point( eX, eY ); tree.PointToClient( pt ); TreeNode Node = tree.GetNodeAt( pt ); if ( Node != null ) { if ( Node.Bounds.Contains( pt ) ) { tree.SelectedNode = Node; ResetContextMenu(); contextMenuTree.Show( tree, pt ); } } } } 

振兴这个问题,因为我觉得这是一个更好的解决scheme。 我使用NodeMouseClick事件。

 void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if( e.Button == MouseButtons.Right ) { tree.SelectedNode = e.Node; } } 

这是一个非常古老的问题,但我仍然觉得它很有用。 我正在使用上面的一些答案的组合,因为我不希望右键单击的节点成为selectedNode。 如果我已经select了根节点并且想要删除它的一个子节点,我不希望子节点被选中,当我删除它的时候(我也在selectedNode上做了一些工作,我不想在右键菜单上发生,点击)。 这是我的贡献:

 // Global Private Variable to hold right-clicked Node private TreeNode _currentNode = new TreeNode(); // Set Global Variable to the Node that was right-clicked private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) _currentNode = e.Node; } // Do something when the Menu Item is clicked using the _currentNode private void toolStripMenuItem_Clicked(object sender, EventArgs e) { if (_currentNode != null) MessageBox.Show(_currentNode.Text); } 

与马库斯的回答类似,这是我find的解决scheme:

 private void treeView_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { treeView.SelectedNode = treeView.GetNodeAt(e.Location); } } 

如果将其设置为每个单独的节点,则无需亲自显示上下文菜单,如下所示:

 TreeNode node = new TreeNode(); node.ContextMenuStrip = contextMenu; 

然后在ContextMenu的Opening事件中,TreeView.SelectedNode属性将反映正确的节点。

如果你想要上下文菜单依赖于你最好的select项目,我想是使用Jonesinator的代码来select被点击的项目。 您的上下文菜单内容可以依赖于选定的项目。

首先select项目,而不是仅仅使用它作为上下文菜单,这带来了一些优点。 首先是用户具有关于他所点击的哪个视觉指示以及菜单与哪个项目相关联。 第二个是这种方式很容易保持与调用上下文菜单的其他方法(例如键盘快捷键)兼容。

这是我怎么做的。

 private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) e.Node.TreeView.SelectedNode = e.Node; } 

您可以运行的另一个选项是具有一个具有所选节点的全局variables。 你只需要使用TreeNodeMouseClickEventArgs

 public void treeNode_Click(object sender, TreeNodeMouseClickEventArgs e) { _globalVariable = e.Node; } 

现在你可以访问那个节点,它的属性。

 DECLARE @Item VARCHAR(8000) DECLARE @ItemList VARCHAR(8000) DECLARE @DelimIndex INT