6

我的用户控件中有不同的控件。并以我的形式动态加载用户控件

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
}

当我单击用户控件中的控件时,单击事件未触发。它仅在我单击用户控件的空白区域时触发。

4

5 回答 5

17

递归所有控件并将每个控件的 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); 
    }

}
于 2013-06-05T15:53:45.000 回答
1

这应该可以解决您的问题。

//Event Handler for dynamic controls
usercontrol.Click += new EventHandler(usercontrol_Click); 
于 2013-06-05T12:46:35.793 回答
0

拿着这个:

this.btnApply.Click += new System.EventHandler(this.btnApply_Click);

于 2013-06-05T12:46:12.730 回答
0

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

于 2013-06-05T12:46:20.583 回答
0

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

public delegate void NavigationClick(int Code, string Title);

2-在 UserControl 类中从您的委托定义一个事件:

        public  event NavigationClick navigationClick;

3-在 UserControl 中为您的控件事件编写此代码:

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);
    }
于 2016-11-05T09:05:36.527 回答