C# 单击dynamic usercontrol中的控件时,单击事件未触发

C# 单击dynamic usercontrol中的控件时,单击事件未触发,c#,winforms,event-handling,click,dynamic-usercontrols,C#,Winforms,Event Handling,Click,Dynamic Usercontrols,我的usercontrols中有不同的控件。并在我的表单中动态加载用户控件 UserControl2 usercontrol = new UserControl2(); usercontrol.Tag = i; usercontrol.Click += usercontrol_Click; flowLayoutPanel1.Controls.Add(usercontrol); private void usercontrol_Click(object sender, EventArgs e)

我的usercontrols中有不同的控件。并在我的表单中动态加载用户控件

UserControl2 usercontrol = new UserControl2();
usercontrol.Tag = i;
usercontrol.Click += usercontrol_Click;
flowLayoutPanel1.Controls.Add(usercontrol);

private void usercontrol_Click(object sender, EventArgs e)
{
   // handle event
}
单击usercontrol中的控件时,不会触发click事件。它仅在我单击usercontrol的空白区域时才会触发。

请执行以下操作:


this.btnApply.Click+=新建System.EventHandler(this.btnApply\u Click)

因为来自
ChildControls
的事件不会传播到父级。因此,您必须处理添加到
UserControl

的每个子控件上的
单击事件,这应该可以解决您的问题

//Event Handler for dynamic controls
usercontrol.Click += new EventHandler(usercontrol_Click); 

递归所有控件,并将每个控件的Click()事件关联到同一个处理程序。从那里调用InvokeOnClick()。现在,单击任何内容都将触发主UserControl的Click()事件:

public partial class UserControl2 : UserControl
{

    public UserControl2()
    {
        InitializeComponent();
        WireAllControls(this);
    }

    private void WireAllControls(Control cont)
    {
        foreach (Control ctl in cont.Controls)
        {
            ctl.Click += ctl_Click;
            if (ctl.HasChildren)
            {
                WireAllControls(ctl);
            }
        }
    }

    private void ctl_Click(object sender, EventArgs e)
    {
        this.InvokeOnClick(this, EventArgs.Empty); 
    }

}
private void btn_first_Click(object sender, EventArgs e)
    {
        navigationClick(101, "First");
    }

1-在名称空间定义一个委托

public delegate void NavigationClick(int Code, string Title);
2-从UserControl类中的委托定义事件:

        public  event NavigationClick navigationClick;
3-在UserControl中为控件事件编写以下代码:

public partial class UserControl2 : UserControl
{

    public UserControl2()
    {
        InitializeComponent();
        WireAllControls(this);
    }

    private void WireAllControls(Control cont)
    {
        foreach (Control ctl in cont.Controls)
        {
            ctl.Click += ctl_Click;
            if (ctl.HasChildren)
            {
                WireAllControls(ctl);
            }
        }
    }

    private void ctl_Click(object sender, EventArgs e)
    {
        this.InvokeOnClick(this, EventArgs.Empty); 
    }

}
private void btn_first_Click(object sender, EventArgs e)
    {
        navigationClick(101, "First");
    }
4-在Windows窗体中,而不是在事件添加时从用户控件中使用:

private void dataBaseNavigation1_navigationClick(int Code, string Title)
    {
        MessageBox.Show(Code + " " + Title);
    }

UserControl中有什么类型的控件?是否只需单击UserControl中的任何内容即可触发主控件单击事件?picturebox和textBox。是单击usercontrol中的任意位置。:)原因是什么?为什么事件不是自然触发的?@Flaudre,因为子控件都有自己的触发点击事件。在这里,我们告诉那些单击处理程序为主usercontrol引发单击事件,以便(大概)主usercontrol的容器/父容器可以做一些事情。这会让用户控件看起来像是一个“可点击的单元”。但是,如果单击单个控件可以做一些不同的事情,你就不会希望这样做了。@Idle_Mind谢谢,事实上,仔细考虑之后,这是非常明显的。当你有很多控件时,这是非常缓慢的controls@andypopa但是,在实例化UserControl时,它只会将它们连接一次。您有多少个控件可以注意到这是“慢”?!。。。你的备选答案是什么?