【问题】
之前已经实现了,给TreeNode中添加右键菜单:
【已解决】C#中给TreeNode添加右键(Context Menu)
此处,遇到一个问题:
当前选择一个TreeNode时,另外右击别的节点,此时,根据当前所选节点:
private void cmsSelection_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { TreeNode curSelTreeNode = trvCategoryTree.SelectedNode; if (e.ClickedItem == tsmiAddToSelection) { if (!curSelTreeNodeList.Contains(curSelTreeNode)) { // add to selection curSelTreeNodeList.Add(curSelTreeNode); //hightlight node crl.highlightNode(trvCategoryTree, curSelTreeNode); } } else if (e.ClickedItem == tsmiRemoveFromSelection) { if (curSelTreeNodeList.Contains(curSelTreeNode)) { //remove selection curSelTreeNodeList.Remove(curSelTreeNode); //unhightlight node crl.unHighlightNode(trvCategoryTree, curSelTreeNode); } } updateSelectionNotice(); }
中的:
TreeNode curSelTreeNode = trvCategoryTree.SelectedNode;
所得到的TreeNode,不是真正的被右击的那个节点:
即SelectedNode得到的只是Classical,
而实际上右击的TreeNode是另外这个:
HealthPersonalCare
现在要去获得当前鼠标右击所选择的TreeNode节点。
【解决过程】
1.参考之前就看到的:
C# winform treeview node添加右键菜单并选中节点
去试试:
System.Drawing.Point currentClickPoint = new System.Drawing.Point(e.X, e.Y); TreeNode currentClickedNode = trvCategoryTree.GetNodeAt(currentClickPoint);
结果不行。因为此处的e是:
private void cmsSelection_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
而不是人家的:
treeView1_MouseDown(object sender, MouseEventArgs e)
2.然后就想办法在
private void cmsSelection_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
中通过e去获得对应的,当前右击Item时对应的TreeNode是哪个。
结果却没法获得。
3.后来发现,别人也遇到类似问题了:
How do I get the TreeNode that a context menu is called from?
当然,后来自己想到了,先通过MouseUp之类的事件中,获得对应的TreeNode,然后弄个全局变量传进来,也是可以的,但是明显不是好做法。
4.这人:
Get treenode from contextmenu-item eventHandler
也遇到类似的问题,结果是其自己实现了个已wrap类。
暂时先不用。
5.参考:
Find node clicked under context menu
去试试添加MouseUp事件:
private void trvCategoryTree_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { // Select the clicked node trvCategoryTree.SelectedNode = trvCategoryTree.GetNodeAt(e.X, e.Y); } }
然后的确就可以了:
因为此处在TreeView的MouseUp,是先于ContextMenuStrip的ItemClicked的,
所以,在此处,通过判断是右键的话,就去赋值当前的选择的TreeNode
后期在:
cmsSelection_ItemClicked
也就可以通过SelectedNode得到当前右击的那个TreeNode了。
至此,算是真正解决问题了。
但是,为何感觉还是不是足够完美呢。。。
【总结】
给TreeView的MouseUp事件中,通过获得点击位置所在的TreeNode,赋值给SelectedNode;
之后,ContextMenuStrip的ItemClicked事件中,即可通过SelectedNode,获得当前右击的那个TreeNode了。