Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确转换ContextMenuStrip C#_C#_Casting_Contextmenustrip - Fatal编程技术网

如何正确转换ContextMenuStrip C#

如何正确转换ContextMenuStrip C#,c#,casting,contextmenustrip,C#,Casting,Contextmenustrip,我已经阅读了好几个小时了,现在我想知道如何在VisualStudio2012中使用C#正确地转换上下文菜单条。我构建了一个小的测试应用程序,向您展示我正在努力实现的目标。这是一个屏幕截图 我已将关联菜单条指定给这两个控件。我可以返回引发MenuStrip的控件,但是如果我添加另一个菜单项,如本例(Test),我会得到“cantcast”错误。下面是我正在尝试使用的代码 private void testToolStripMenuItem_Click(object sender, EventAr

我已经阅读了好几个小时了,现在我想知道如何在VisualStudio2012中使用C#正确地转换上下文菜单条。我构建了一个小的测试应用程序,向您展示我正在努力实现的目标。这是一个屏幕截图

我已将关联菜单条指定给这两个控件。我可以返回引发MenuStrip的控件,但是如果我添加另一个菜单项,如本例(Test),我会得到“cantcast”错误。下面是我正在尝试使用的代码

private void testToolStripMenuItem_Click(object sender, EventArgs e)
{
    var item = (ToolStripMenuItem)sender;
    var menu = (ContextMenuStrip)item.Owner;

    MessageBox.Show(menu.SourceControl.Name);
}

根据顶部可能已经回答的问题链接,我终于能够找到答案。我相信这样做无论如何要干净和简单得多。我要做的是为ContextMenuStrip.Opening设置一个事件。在该事件上设置源代码管理。这是代码

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private PictureBox p;

    private void testToolStripMenuItem_Click(object sender, EventArgs e)
    {
        MessageBox.Show(p.Name);
    }

    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
    {
        p = ((ContextMenuStrip)sender).SourceControl as PictureBox;
    }
}

使用调试器查看对象的实际类型。在第一行设置断点,并准确检查
sender
是什么。我相信这一定是因为“Test”的所有者不是ContextMenuStrip,而是另一个MenuItem。它应该是
ToolStripItem
,可能是也可能不是
ToolStripMenuItem