我在自定义控件中有一个列表框。我将此自定义控件用于表单。我希望能够在我处理表单时获取列表框索引更改事件。我怎么能这样做?
答案 0 :(得分:4)
如果您使用的是WinForms,则需要手动连接此事件。在自定义控件上创建具有相同签名的事件,在自定义控件内的原始列表框上为偶数创建处理程序,并在此处理程序中触发新创建的事件。 (如果您使用的是WPF,请忽略所有这些)
答案 1 :(得分:3)
您可以将代理事件添加到自定义控件
public event EventHandler<WhatEverEventArgs> IndexChanged {
add { listBox.IndexChanged += value; }
remove { listBox.IndexChanged -= value; }
}
答案 2 :(得分:3)
这可能是UserControl的缺点。您必须重新发布一个或多个嵌入式控件的事件和属性。考虑另一种选择:如果这个UserControl只包含一个ListBox,那么你只需继承ListBox而不是UserControl就好了。
Anyhoo,您需要重新触发SelectedIndexChanged事件。当然,您需要能够让客户端代码读取当前选定的项目。因此:
public partial class UserControl1 : UserControl {
public event EventHandler SelectedIndexChanged;
public UserControl1() {
InitializeComponent();
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
EventHandler handler = SelectedIndexChanged;
if (handler != null) handler(this, e);
}
public object SelectedItem {
get { return listBox1.SelectedItem; }
}
}
答案 3 :(得分:0)
查看Ninjects Extension MessageBroker,并在更改的索引上引发已发布的事件,并在表单端订阅该事件。
在大多数情况下,消息经纪人非常有用。
另一个想法是实现一个观察者模式,并将该表单作为观察者添加到controls事件中。