Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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
C# 如何确定哪个控件激活了上下文菜单?_C#_Winforms_Contextmenu - Fatal编程技术网

C# 如何确定哪个控件激活了上下文菜单?

C# 如何确定哪个控件激活了上下文菜单?,c#,winforms,contextmenu,C#,Winforms,Contextmenu,在WinC窗体应用程序中,我为四个PictureBox控件指定了相同的上下文菜单 我想确定哪个用于激活上下文菜单 在给定菜单项的单击事件中,我执行了以下操作,这看起来很尴尬: MenuItem_Click(object sender, EventArgs e) { PictureBox Origin = (PictureBox)sender; switch (Origin.Name) { case "pbOne": // do so

在WinC窗体应用程序中,我为四个PictureBox控件指定了相同的上下文菜单

我想确定哪个用于激活上下文菜单

在给定菜单项的单击事件中,我执行了以下操作,这看起来很尴尬:

MenuItem_Click(object sender, EventArgs e)
{
    PictureBox Origin = (PictureBox)sender;
    switch (Origin.Name)
    {
        case "pbOne":
            // do something with #1
            break;
        case "pbTwo":
            // do something with #2
            break;
    }
}
使用控件名是令人感到尴尬的部分

你能建议一个更好的方法吗

编辑:


将发件人强制转换为PictureBox不起作用,因为我忘记了菜单项将是发件人,而不是PictureBox。因此,我将不得不进一步回溯。

不太确定您是如何做到这一点的。发件人是菜单项,而不是图片框。如果这确实有效,那么您已经有了要修补的图片框的引用。这是它的起源。不需要switch语句

另一种有效的方法是使用开幕式:

    private PictureBox currentBox;

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

现在,您可以在任何菜单项Click事件处理程序中使用currentBox。它之所以有效,是因为同一时间只能打开一个菜单。

不太清楚您是如何做到这一点的。发件人是菜单项,而不是图片框。如果这确实有效,那么您已经有了要修补的图片框的引用。这是它的起源。不需要switch语句

另一种有效的方法是使用开幕式:

    private PictureBox currentBox;

    private void allContextMenuStrips_Opening(object sender, CancelEventArgs e) {
        currentBox = (sender as ContextMenuStrip).SourceControl as PictureBox;
    }
现在,您可以在任何菜单项Click事件处理程序中使用currentBox。它之所以有效,是因为同时只能打开一个菜单。

只需使用属性:

var pictureBox = contextMenuStrip1.SourceControl as PictureBox;
简单使用属性:

var pictureBox = contextMenuStrip1.SourceControl as PictureBox;

当你发布此回复时,我刚刚了解了此物业。这似乎是我的谜题中缺少的元素。当你发布这个回复时,我刚刚发现了这个属性。它似乎是我的谜题中缺少的元素。这同样适用于我缺少的SourceControl属性。这同样适用于我缺少的SourceControl属性。