C#在自定义控件中获取控件的事件

时间:2010-06-17 15:44:34

标签: c# events controls

我在自定义控件中有一个列表框。我将此自定义控件用于表单。我希望能够在我处理表单时获取列表框索引更改事件。我怎么能这样做?

4 个答案:

答案 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事件中。