C# 将父级用作事件发送方

C# 将父级用作事件发送方,c#,events,C#,Events,我有一个面板,面板上有一个图片盒和一个标签。我想做的是,当我点击标签或图片盒时,事件会显示发送者在面板上。 示例代码: Panel panel1 = new Panel(); Label label1 = new Label(); PictureBox pb = new PictureBox(); panel1.Size = new Size(500,500); this.Controls.Add(panel1); label1.Text = "Some text"; panel1.Contro

我有一个面板,面板上有一个图片盒和一个标签。我想做的是,当我点击标签或图片盒时,事件会显示发送者在面板上。 示例代码:

Panel panel1 = new Panel();
Label label1 = new Label();
PictureBox pb = new PictureBox();
panel1.Size = new Size(500,500);
this.Controls.Add(panel1);
label1.Text = "Some text";
panel1.Controls.Add(label1);
pb.Image = somePath;
panel1.Controls.add(pb);
panel1.Click += onClick;
label1.Click += onClick;
pb.Click += onClick;
面板和所有内容都添加到一个循环中

private void onClick(object sender, EventArgs e)
{
    if(sender == panel1)
    {
        //do something
    }
}
这是事件方法。

:使用is操作符检查对象的运行时类型是否与给定类型兼容

您需要检查发送方控件是否在面板中,然后执行以下操作

   if(sender is Panel )

我想做的是,当我点击标签或图片盒时,事件会显示发送者在面板上

发送方是什么完全取决于调用事件的代码。如果实际调用它的不是面板,那么它不太可能以这样的形式出现。在某些情况下(按钮等),有一个公开的方法可以直接调用事件,但这里没有。坦率地说,我认为你最好的选择可能是:

panel1.Click += onClick;
label1.Click += (sender,args) => onClick(panel1,args);
pb.Click += (sender,args) => onClick(panel1,args);
i、 e.手动转发,欺骗发件人

更好的方法可能是使用
.Tag
,或者只是针对不同的行为使用不同的处理程序,而不是在单个处理程序内切换。

使用

if(sender is Panel) 
{
    //Do Something     
} 
else if (sender is Label)
{
    //Do something
}
else if (sender is PictureBox)
{
    //Do somethin
}

那么问题出在哪里?@NikhilAgrawal和vaibhav的问题是发送方元素是Op想要的面板或其他控件check@PranayRana,
sender==panel1
执行相同的工作。要实现这一点,
panel1
对象应该是全局的variable@vaibhav-您需要检查,因为发件人是您转换的对象,或者您可以检查您不能直接执行…@Grega Menih,请以我阅读的方式对您的问题给出更清晰的观点,OP没有试图测试发送者是什么-他希望它是
panel1
,即使来自另一个控件。@marcgravel-可能是,但不清楚我是否提出了这个解决方案…@marcgravel这就是问题所在。。。!!!问的问题不够精确,我们无法得出询问者想要什么的结论。!按照我的理解,OP并没有试图测试什么是
sender
——他希望它是
panel1
,即使来自另一个控件。
if(sender is Panel) 
{
    //Do Something     
} 
else if (sender is Label)
{
    //Do something
}
else if (sender is PictureBox)
{
    //Do somethin
}