最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】如何获得C#中右击弹出菜单时对应的当前所右击那个TreeNode

C# crifan 5215浏览 0评论

【问题】

之前已经实现了,给TreeNode中添加右键菜单:

【已解决】C#中给TreeNode添加右键(Context Menu)

此处,遇到一个问题:

当前选择一个TreeNode时,另外右击别的节点,此时,根据当前所选节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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();
}

中的:

1
TreeNode curSelTreeNode = trvCategoryTree.SelectedNode;

 

所得到的TreeNode,不是真正的被右击的那个节点:

right click real choose another treenode

即SelectedNode得到的只是Classical,

而实际上右击的TreeNode是另外这个:

HealthPersonalCare

 

现在要去获得当前鼠标右击所选择的TreeNode节点。

 

【解决过程】

1.参考之前就看到的:

C# winform treeview node添加右键菜单并选中节点

去试试:

1
2
System.Drawing.Point currentClickPoint = new System.Drawing.Point(e.X, e.Y);
TreeNode currentClickedNode = trvCategoryTree.GetNodeAt(currentClickPoint);

结果不行。因为此处的e是:

1
private void cmsSelection_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

而不是人家的:

1
treeView1_MouseDown(object sender, MouseEventArgs e)

 

2.然后就想办法在

1
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事件:

1
2
3
4
5
6
7
8
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了。

转载请注明:在路上 » 【已解决】如何获得C#中右击弹出菜单时对应的当前所右击那个TreeNode

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.340 seconds, using 22.16MB memory