有没有办法知道在左键单击其 ContextMenuStrip 项目之一并且该项目

orhtej2 建议我的问题可能是确定在 ContextMenuStrip 上使用了什么控件。这几乎是一个重复,但我的场景有一个显着差异。有关详细信息,请参阅我修改后的问题和我的答案。


请参阅下面的我的代码。我的目标是更清楚地确定在左键单击其 ContextMenuItems 之一后右键单击哪个 TreeNode。


现在,当我右键单击两个子节点之一时, 中的if语句TreeView1_NodeMouseClick会将单击TreeNode的treeViewClickedNode TreeNode对象加载到全局对象中。然后,当我左键单击两者之一时contextMenuStripChildNode ToolStripMenuItem,该DocumentActionToolStripMenuItem_CheckStateChanged方法被触发。然后我可以检查检查状态。如果它被选中,我可以对treeViewClickedNode TreeNode.


我的问题:是否有一种更清晰的方法来确定在左键单击其 ContextMenuStrip 项目之一后右键单击哪个 TreeNode,即,是否有办法取消全局变量treeViewClickedNode?


注意:我在设计器中所做的唯一一件事就是放置treeview1在 上Form1,将其停靠到Form1并将“treeview1”设置NodeMouseClick为TreeView1_NodeMouseClick


using System;

using System.Windows.Forms;


namespace WindowsFormsApp_Scratch

{

    public partial class Form1 : Form

    {

        TreeNode treeViewClickedNode;

        ContextMenu mnu = new ContextMenu();


        public Form1()        

        {

            InitializeComponent();


            // Create the root node.

            TreeNode treeNodeRoot = new TreeNode("Documents");


            // Add the root node to the TreeView.

            treeView1.Nodes.Add(treeNodeRoot);


            //Create and add child 2 nodes each with a two item ContextMenuStrip.

            string[] childNodeLabels = { "document1.docx", "document2.docx"};

            string[] contextItemLabels = { "Action A", "Action B" };


            foreach (String childNodeLabel in childNodeLabels)

            {

                TreeNode treeNode = treeNodeRoot.Nodes.Add(childNodeLabel);


                // Create a ContextMenuStrip for this child node.

                ContextMenuStrip contextMenuStripChildNode = new ContextMenuStrip

                {

                    ShowCheckMargin = true,

                    ShowImageMargin = false

                };

一只萌萌小番薯
浏览 158回答 1
1回答

千巷猫影

该For a ContextMenuStrip答案为SO问题的部分确定哪些控制的ContextMenuStrip被使用上 几乎回答我的问题。但是,在我的情况下,我想处理ContextMenuStrip项目右键单击并在更改时访问ContextMenuStrip项目,因此我的代码使用项目事件方法而不是项目事件方法。因此,我需要将发件人强制转换为 a而不是 。除此之外,我使用SO 问题中的部分答案确定在我的事件方法中使用了 ContextMenuStrip 的哪个控件:CheckStateCheckStateContextMenuStrip_CheckStateChangedContextMenuStrip_ClickToolStripMenuItemToolStripItemFor a ContextMenuStripDocumentActionToolStripMenuItem_CheckStateChangedprivate void DocumentActionToolStripMenuItem_CheckStateChanged(object sender, EventArgs e){    Control treeNodeControl;    ToolStripMenuItem toolStripMenuItem = (ToolStripMenuItem)sender;    // if the ToolStripMenuItem item is owned by a ContextMenuStrip ...    if (toolStripMenuItem.Owner is ContextMenuStrip contextMenuStrip)    {        // Get the TreeNode that is displaying this context menu        treeNodeControl = contextMenuStrip.SourceControl;        if (toolStripMenuItem.CheckState == CheckState.Checked)        {            //Do something with treeNodeControl.SelectedNode treeView node        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP