自定义控件的事件发送器

3
我有一个扩展了UserControl的控件。该控件包含两个ComboBox控件。我创建了一个事件处理程序,当其中一个组合框更改时触发:

public event EventHandler ComboChanged
{
add { cmbA.SelectedIndexChanged += value; cmbB.SelectedIndexChanged += value; }
remove {...}
}

当我将事件处理程序添加到此事件中时,是否有任何方法可以将sender报告为自定义控件(即ComboBox的父控件),而不是ComboBox本身?或者我在这里尝试做一些我不应该做的事情吗?
2个回答

3
你应该拥有类似这样的东西:
public event EventHandler MyControlChanged

接下来在您的用户控件中为每个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
}

这将会引用到用户控件而不是触发您用户控件事件的组合框。

3

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);
}

你的更加优雅 ;) - Arthis
谢谢,拥有另一种选择总是很有用的。 - Chris Cooper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接