子元素事件监听器

时间:2013-01-30 17:07:14

标签: c# winforms events

在C#Winform应用程序上。想象一下,我的Panel里面有一些标签。

如何在面板点击事件中收听此标签中的所有点击事件?

3 个答案:

答案 0 :(得分:1)

您可以通过在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");
}

答案 1 :(得分:0)

为什么不在Panel中的所有Control of Type按钮中添加额外的事件处理程序?

示例代码:

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

答案 2 :(得分:0)

如果您的标签是该小组的子级,则面板上的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

    }