【问题标题】:How to determine which control was Clicked and contextMenuStrp appeared?如何确定哪个控件被单击并出现了 contextMenuStrp?
【发布时间】:2012-02-23 09:58:31
【问题描述】:

我已将 contextMenuStrip 分配给两个 ListBox 控件的相同上下文菜单属性。 我想确定其中哪些激活了上下文菜单。 因为我必须根据运行时单击的控件来更改一些条目。

        private void copyNotesToClipboardStripMenu_Click(object sender, EventArgs e)
        {
            ListBox cntrl = conMenuNotes.SourceControl as ListBox;
            //cntrl does not contain info about which ListBox was clicked :((

            //check which ListBox was clicked
            if (/*oneListBox*/)
            {
                 //do something                    
            }
            if(/*anotherLiskBox*/)
            {    
                //do something
            }              
        }

当我阅读另​​一篇文章时,它应该是 Label 属性中单击的控件的名称。

我看到 cntrl.Labelnull

我做错了什么? 建议我如何解决这种歧义。 谢谢!

【问题讨论】:

  • 也许应该以另一种方式实现,以便能够确定哪个控件激活了 contextMenu ...
  • 只是比较,if (ctrl == listBox1)。或者使用列表框控件上的 Tag 属性为它们提供自定义数据,您可以稍后再找到。

标签: c# controls click


【解决方案1】:

不是将菜单分配给两个控件,而是使用控件上的右键单击事件来执行这样的功能

  • 设置一个全局变量指向刚刚被点击的控件
  • 在鼠标坐标处显示您想要的菜单
  • 现在在您的 copyNotesToClipboardStripMenu_Click 方法中,您可以访问存储单击控件的全局变量

完成后不要忘记将全局设置为null,并确保在使用时使用lock

【讨论】:

  • 感谢您的建议,但我认为这不是一个好习惯。很容易我可以为每个 ListBox 添加两个 contextMenuStrip,但也不是一个好习惯......
【解决方案2】:

我找到了一个适合我的结果

        private void copyNotesToClipboardStripMenu_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
            if (menuItem != null)
            {
                ContextMenuStrip calendarMenu = menuItem.Owner as ContextMenuStrip;
                if (calendarMenu != null)
                {
                    Control controlSelected = calendarMenu.SourceControl;
                }
            }
        }

controlSelected 对象的Name 属性包含激活上下文菜单的控件的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2014-10-28
    • 2011-06-15
    相关资源
    最近更新 更多