2011-12-07 15 views
1

我正在创建一个类库,并在Windows窗体程序中使用它。 我想在程序中处理这个库的事件。 我使用这个代码:在类内部引发事件并在另一个类上使用处理函数

类的库中:

public class KSEDataServIO 
{ 
    public delegate void IsReadyForUseEventHandler(object sender, IsReadyForUseEventArgs e); 
    public event IsReadyForUseEventHandler IsReadyForUse; 
    public KSEDataServIO(){ 
     EvArg = new IsReadyForUseEventArgs("AuthOkay"); 
     IsReadyForUse(this, EvArg); //This is where i get the issue. 
    } 
} 

,并在窗口表我这样做:

private void button1_Click(object sender, EventArgs e) { 
      KSEDataServIO con = new KSEDataServIO(); 
      con.IsReadyForUse += new KSEDataServIO.IsReadyForUseEventHandler(con_IsReadyForUse); 
} 

void con_IsReadyForUse(object sender, IsReadyForUseEventArgs e) 
{ 
    MessageBox.Show(e.Etat); 
} 

我得到一个NullReferenceException到线'IsReadyForUse(this,EvArg);'在类库里面。 有什么想法?

回答

2

您的问题是您在KSEDataServIO的构造函数中引发事件。此时没有订阅该事件处理程序,因此引发空引用异常。

这么一件事是要适当提高事件处理这种模式常用于其中:

public delegate void IsReadyForUseEventHandler(object sender, IsReadyForUseEventArgs e); 
public event IsReadyForUseEventHandler IsReadyForUse; 

void OnIsReadyForUse(IsReadyForUseEventArgs e) 
{ 
    var handler = IsReadyForUse; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

然后使用它像这样引发事件:

OnIsReadyForUse(new IsReadyForUseEventArgs("AuthOkay")) 

其次引发事件在你的构造函数中没有多少意义,因为没有任何东西可能已经订阅了处理程序(除非你传递一个处理程序作为构造函数参数)。您将需要找到另一个触发器,以便稍后提出事件。

此外,你应该在你的课堂上暴露IsReady属性。因此,如果用户稍后出现,则可以查询该对象是否已准备就绪。如果IsReady事件在您开始在某处使用该对象时已引发,则您可能会错过该事件。

编辑:你可以通过一个处理程序的构造,如果你真的想这样做:

public KSEDataServIO(IsReadyForUseEventHandler handler) 
{ 
    IsReadyForUse += handler; 
    OnIsReadyForUse(new IsReadyForUseEventArgs("AuthOkay")); // see pattern above 
} 

然而,由于您的活动提供this为你传递一个对象的引用它之前发件人完成执行整个构造函数可能导致难以追踪的问题。如果您唯一要举办活动的地方是构造函数的结尾,那么您并不需要它。

0

在分配con_IsReadyForUse之前,您正在构造函数中引发事件。

相关问题