使用父级作为事件发送方

本文关键字:事件 | 更新日期: 2023-09-27 18:35:21

我有一个面板,在该面板上有一个图片框和一个标签。我试图做的是,当我单击标签或图片框时,事件将读取发件人是面板。示例代码:

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
    }
}

这是事件方法。

使用父级作为事件发送方

我试图做的是,当我单击标签或图片框时,事件将读取发件人是面板。

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

panel1.Click += onClick;
label1.Click += (sender,args) => onClick(panel1,args);
pb.Click += (sender,args) => onClick(panel1,args);

即手动转发,欺骗发件人。

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

在 MSDN 上阅读 is 关键字: is 运算符用于检查对象的运行时类型是否与给定类型兼容。

您需要检查发件人控件是否为面板,然后您可以通过执行以下操作来做到这一点....

   if(sender is Panel )

  if(sender.GetType() == typeof(Panel)) 
  {
             //do something     
  } 

使用

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