【问题标题】:Event sender from custom control来自自定义控件的事件发送者
【发布时间】:2010-11-04 10:08:29
【问题描述】:
我有一个扩展UserControl 的控件。此控件包含两个 ComboBox 控件。我创建了一个事件处理程序,当任何一个组合发生变化时都会触发:
public event EventHandler ComboChanged
{
add { cmbA.SelectedIndexChanged += value; cmbB.SelectedIndexChanged += value; }
remove {...}
}
当我向此事件添加事件处理程序时,有什么方法可以将 sender 报告为自定义控件(即 ComboBox 的父控件)而不是 ComboBox 本身?还是我正在尝试做一些我不应该在这里做的事情?
【问题讨论】:
标签:
c#
winforms
events
custom-controls
【解决方案1】:
你应该有这样的东西:
public event EventHandler MyControlChanged
然后在您的 userControl 中为每个 ComboBox 提供两个函数
protected void oncmbA_SelectedIndexChanged(object sender, EventArgs e)
{
if (MyControlChanged!=null)
MyControlChanged(this, e);//or some new Eventagrs that you wish to communicate
}
protected void oncmbB_SelectedIndexChanged(object sender, EventArgs e)
{
if (MyControlChanged!=null)
MyControlChanged(this, e);//or some new Eventagrs that you wish to communicate
}
这将引用 UserControl 而不是触发 UserControl 事件的组合框。
【解决方案2】:
Yoann 的回答是要走的路。这是一个类似的模式,但有一些细微的差别。
// Default listener makes null-check unnecessary when raising event.
// Note that no custom implementations are provided for add, remove.
public event EventHandler ComboChanged = delegate { };
...
foreach(var comboxBox in new[] {cmbA, cmbA})
{
// Attach listener to combo-box's event that raises our own event.
// Lambda-expression is ok since we don't intend to ever unsubscribe.
comboBox.SelectedIndexChanged += (sender, args) => ComboChanged(this, args);
}