使用父级作为事件发送方
本文关键字:事件 | 更新日期: 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
}