Sae*_*eed 25 c# events user-controls winforms
我有一个包含3个标签的UserControl.我想为它添加一个事件,当其中一个标签的文本发生变化时会发生这种事件.
我正在使用Visual Studio 2010
Zac*_*son 52
首先,您需要在类中声明事件(与方法和构造函数一起):
public event EventHandler LabelsTextChanged;
然后,您需要创建一个方法来处理各个标签的TextChanged事件.
private void HandleLabelTextChanged(object sender, EventArgs e)
{
    // we'll explain this in a minute
    this.OnLabelsTextChanged(EventArgs.Empty);
}
某处,可能在您的控件的构造函数中,您需要订阅标签的TextChanged事件.
myLabel1.TextChanged += this.HandleLabelTextChanged;
myLabel2.TextChanged += this.HandleLabelTextChanged;
myLabel3.TextChanged += this.HandleLabelTextChanged;
现在为HandleLabelsTextChanged方法.我们可以LabelsTextChanged直接筹集; 但是,.NET框架设计指南说,创建OnEventName受保护的虚拟方法以便为我们引发事件是最佳实践.这样,继承类可以通过重写OnEventName方法来"处理"事件,结果表明它比订阅事件具有更好的性能.即使你认为你永远不会覆盖这个OnEventName方法,但最好还是养成这样做的习惯,因为它简化了事件提升过程.
这是我们的OnLabelsTextChanged:
protected virtual void OnLabelsTextChanged(EventArgs e)
{
    EventHandler handler = this.LabelsTextChanged;
    if (handler != null)
    {
        handler(this, e);
    }
}
我们必须检查null,因为没有订阅者的事件是null.如果我们试图提出一个null事件,我们会得到一个NullReferenceException.请注意,在将事件EventHandler检查为null并引发事件之前,我们将事件复制到局部变量.如果我们这样做了:
if (this.LabelsTextChanged != null)
{
    this.LabelsTextChanged(this, e);
}
我们会在无效性检查和事件提升之间存在竞争条件.如果碰巧事件的订阅者在我们提出事件之前取消订阅,但在我们检查了null之后,将抛出异常.你通常不会遇到这个问题,但最好养成以安全的方式编写它的习惯.
编辑:以下是该public event EventHandler LabelsTextChanged;行的放置方式:
namespace YourNamespace
{
    class MyUserControl : UserControl
    {
        // it needs to be here:
        public event EventHandler LabelsTextChanged;
        ...
    }
}
以下是有关事件设计的框架设计指南,供进一步阅读.
| 归档时间: | 
 | 
| 查看次数: | 49696 次 | 
| 最近记录: |