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

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

C# crifan 4855浏览 0评论

【问题】

之前已经实现了,给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,不是真正的被右击的那个节点:

right click real choose another 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了。

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

发表我的评论
取消评论

表情

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

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