使用parent作为事件发件人

时间:2012-05-25 07:01:01

标签: c# events

我有一个面板,在该面板上有一个pictureBox和一个标签。我要做的是当我点击标签或pictureBox时,事件将显示发件人是面板。 示例代码:

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

这是事件方法。

3 个答案:

答案 0 :(得分:1)

Read about is keyword on MSDN运算符用于检查对象的运行时类型是否与给定类型兼容。

您需要检查发件人控件是否为面板,而不是通过执行以下操作来执行此操作....

   if(sender is Panel )

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

答案 1 :(得分:1)

  

我要做的是当我点击标签或pictureBox时,事件将显示发件人是面板。

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

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

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

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

答案 2 :(得分:0)

使用

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