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

3

我在一个自定义控件中有一个列表框。我将这个自定义控件用于表单中。我希望能够在表单工作时获得列表框索引更改事件。我该怎么做?

4个回答

4
您可以在自定义控件中添加代理事件。
public event EventHandler<WhatEverEventArgs> IndexChanged { 
    add { listBox.IndexChanged += value; }
    remove { listBox.IndexChanged -= value; } 
}

+1 事件属性似乎是一个鲜为人知的功能。除此之外,它们还有用于将事件处理程序委托存储在EventHandlerList中(这通常是内置控件所做的)而不是在您的类中为每个事件拥有一个实际的事件处理委托作为字段。如果您的类包含许多不总是具有订阅者的事件,那么这有助于减少类的占用空间。(http://msdn.microsoft.com/en-us/library/8843a9ch.aspx)(http://msdn.microsoft.com/en-us/library/system.componentmodel.component.events.aspx) - Dr. Wily's Apprentice

4

如果您正在使用WinForms,则需要手动连接此事件。在自定义控件上创建具有相同签名的事件,在自定义控件内部的原始列表框上创建处理程序,并在此处理程序中触发新创建的事件。(如果您正在使用WPF,则忽略所有内容)


是的,我使用WinForm,能给个例子吗? - Wildhorn

3
这可能是使用UserControl的一个缺点。您需要重新发布一个或多个嵌入控件的事件和属性。考虑另一种选择:如果此UserControl仅包含一个ListBox,则最好直接从ListBox继承,而不是从UserControl继承。

无论如何,您都需要重新触发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; }
    }
}

我认为这种方法更好,因为它看起来像事件是从this触发的,而不是在您的用户控件中的某个其他控件中的“未知”控件触发,如果您只是在listBox1.SelectedIndexChanged += value中执行。 - Patrick

0

查看Ninject的扩展程序MessageBroker,在索引更改时引发一个发布事件,并在表单侧订阅该事件。

在大多数情况下,MessageBroker非常有用。

另一个想法是实现观察者模式,并将表单作为观察者添加到控件事件中。


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