-2

我有一个面板,在那个面板上有一个图片框和一个标签。我想要做的是当我点击标签或图片框时,事件会读取发件人是面板。示例代码:

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

这是事件方法。

4

3 回答 3

1

我想要做的是当我点击标签或图片框时,事件会读取发件人是面板。

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

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

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

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

于 2012-05-25T07:07:57.060 回答
1

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

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

   if(sender is Panel )

或者

  if(sender.GetType() == typeof(Panel)) 
  {
             //do something     
  } 
于 2012-05-25T07:03:17.537 回答
0

利用

if(sender is Panel) 
{
    //Do Something     
} 
else if (sender is Label)
{
    //Do something
}
else if (sender is PictureBox)
{
    //Do somethin
}
于 2012-05-25T07:09:00.350 回答