C# 单击dynamic usercontrol中的控件时,单击事件未触发
我的usercontrols中有不同的控件。并在我的表单中动态加载用户控件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)
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时,它只会将它们连接一次。您有多少个控件可以注意到这是“慢”?!。。。你的备选答案是什么?