【发布时间】:2010-05-27 10:08:09
【问题描述】:
我创建了一个包含按钮的用户控件。 我在我的 winform 上使用这个控件,它将在从数据库中获取数据后在运行时加载。
现在我需要在该按钮的 Click 事件中从数据表中删除一行。
问题是我如何在我的表单中捕获该事件。目前它在该用户控件的 btn 点击事件定义中。
【问题讨论】:
标签: c# user-controls event-handling delegates custom-event
我创建了一个包含按钮的用户控件。 我在我的 winform 上使用这个控件,它将在从数据库中获取数据后在运行时加载。
现在我需要在该按钮的 Click 事件中从数据表中删除一行。
问题是我如何在我的表单中捕获该事件。目前它在该用户控件的 btn 点击事件定义中。
【问题讨论】:
标签: c# user-controls event-handling delegates custom-event
您可以通过在用户控件中执行以下操作来创建自己的委托事件:
public event UserControlClickHandler InnerButtonClick;
public delegate void UserControlClickHandler (object sender, EventArgs e);
您使用以下方法从您的处理程序中调用事件:
protected void YourButton_Click(object sender, EventArgs e)
{
if (this.InnerButtonClick != null)
{
this.InnerButtonClick(sender, e);
}
}
然后您可以使用以下方法挂钩事件
UserControl.InnerButtonClick+= // Etc.
【讨论】:
没有必要声明一个新的委托。在您的用户控件中:
public class MyControl : UserControl
{
public event EventHandler InnerButtonClick;
public MyControl()
{
InitializeComponent();
innerButton.Click += new EventHandler(innerButton_Click);
}
private void innerButton_Click(object sender, EventArgs e)
{
if (InnerButtonClick != null)
{
InnerButtonClick(this, e); // or possibly InnerButtonClick(innerButton, e); depending on what you want the sender to be
}
}
}
【讨论】:
只需现代化ChéDon 的答案,您可以在 2018 年做到这一点:
public class MyControl : UserControl
{
public event EventHandler InnerButtonClick;
public MyControl()
{
InitializeComponent();
innerButton.Click += innerButton_Click;
}
private void innerButton_Click(object sender, EventArgs e)
{
InnerButtonClick?.Invoke(this, e);
//or
InnerButtonClick?.Invoke(innerButton, e);
//depending on what you want the sender to be
}
}
【讨论】: