在 C# Winform 应用程序上。想象一下,我有一个面板,里面有一些标签。
如何在面板点击事件中侦听此标签的所有点击事件?
您可以通过在Form_Load
事件处理程序或任何其他合适的事件处理程序中调用以下代码以编程方式执行此操作。
foreach (Label label in panel1.Controls.OfType<Label>())
{
label.Click += LabelOnClick;
}
然后在事件处理程序中执行您的操作:
private void LabelOnClick(object sender, EventArgs eventArgs)
{
MessageBox.Show("Label In Panel Clicked");
}
为什么不向面板中的所有类型按钮控件添加额外的事件处理程序?
示例代码:
private void SetupButtonClickListenerForPanel1()
{
panel1.Click += ListenForAllButtonClickOnPanel1;
foreach (Control control in panel1.Controls)
{
var tb = control as Button;
if (tb != null)
{
tb.Click += ListenForAllButtonClickOnPanel1;
}
}
}
private void ListenForAllButtonClickOnPanel1(object sender, EventArgs eventArgs)
{
//
Button tb = (Button) sender; // casting will fail if click is on Panel1 itself!
MessageBox.Show(tb.Name);
}
Linq 添加 Handler 的方式:
private void SetupButtonClickListenerForPanel1()
{
panel1.Click += ListenForAllButtonClickOnPanel1;
foreach (var tb in panel1.Controls.OfType<Button>())
{
tb.Click += ListenForAllButtonClickOnPanel1;
}
}
如果您的标签是面板的子级,则面板上 Click 事件的侦听器将侦听其子级的所有未重新定义的侦听器。
示例代码:
{
//Form init
panel1.Click += new System.EventHandler(this.panel1_Click);
....
}
private void panel1_Click(object sender, EventArgs e)
{
//The clicked label will be sender.
Label l = (Label) sender; //Should be a safe cast. Will crash if sender is not a label
}