2013-02-15 89 views
3

我'有我的代码中一个非常恼人的问题,当我尝试发送从表格B字符串形成。我得到的错误信息:使用委托发送串

Object reference not set to an instance of an object. 

我'熟悉这个错误,通常我知道如何解决这个问题,但是这一次是不同的。

我需要从一种形式发送Clockname的主要形式,我'想实现这个使用下面的代码:

delegate void ClockClocknameReceivedEventHandler(object sender, Clock.ClocknameReceivedEventArgs e); 

    internal class ClocknameReceivedEventArgs : EventArgs 
    { 
     string _clockname; 

     public string Clockname 
     { 
      get { return _clockname; } 
     } 

     public ClocknameReceivedEventArgs(string clockname) 
     { 
      _clockname = clockname; 
     } 
    } 

    // An event that clients can use to be notified whenever the 
    // elements of the list change. 
    public event ClockClocknameReceivedEventHandler ClocknameReceived; 

    // Invoke the Changed event; called whenever list changes 
    protected void OnClocknameReceived(Clock.ClocknameReceivedEventArgs e) 
    { 
     ClocknameReceived(this, e); 
    } 

并按下一个按钮时,下面的代码被炒鱿鱼,形式之后将关闭:(对象引用不设置为一个对象的一个​​实例)

OnClocknameReceived(new Clock.ClocknameReceivedEventArgs(ClockName)); 

错误我接收发生在

ClocknameReceived(this, e); 

我'使用完全相同的代码,从另一个类的主要形式发送一个字节数组,工作正常,但是这一次给我的错误。

任何任何想法?

在此先感谢!

回答

4

的委托可以null。调用它,只有当它不是null

protected void OnClocknameReceived(Clock.ClocknameReceivedEventArgs e) 
{ 
    ClockClocknameReceivedEventHandler handler = ClocknameReceived; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

的代表是null当你还没有订阅的事件处理程序的事件还。订阅事件处理程序:

formB.ClocknameReceived += FormB_ClocknameReceived; 

void FormB_ClocknameReceived(object sender, Clock.ClocknameReceivedEventArgs e) 
{ 
    MessageBox.Show(e.Clockname); 
} 
+0

我已经尝试过,问题是,它永远不会执行,我怎样才能得到ClocknameReceived如此充满它不会变为空? – Max 2013-02-15 14:09:37

+1

您是否订阅了事件处理程序?参见:如何从事件订阅和退订(C#编程指南)(http://msdn.microsoft.com/en-us/library/ms366768.aspx) – dtb 2013-02-15 14:10:15

+0

是的,我这样做的主要形式,并那一个不给我任何问题 – Max 2013-02-15 14:11:54

1

你不检查ClocknameReceived事件是否已经被分配(即有任何用户)。典型的事件处理代码通常是这样的:

var handler = ClocknameReceived; 
if (handler != null) 
{ 
    handler(this, e); 
} 

这种类型的方法也缓解(在某种程度上)的竞争条件与事件处理程序,因为它可以在未分配时你去触发它。在你的代码

看你能肯定这整理了一下。首先,你EventArgs类可以重写用更少的代码:

internal class ClocknameEventArgs : EventArgs 
{ 
    public ClockNameEventArgs(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; private set; } 
} 
在窗体

然后,就没有必要为一个委托,如果你有一个特定类型的EventArgs,您的活动可以声明为:

public event EventHandler<Clock.ClocknameEventArgs> ClocknameReceived; 

然后你在某处连接到这个事件(也许在FormCreate事件?):

ClocknameReceived += (sender, args) { 
    FormB.PassName(args.Name); 
}; 
0

你必须检查,如果事件有委托或不

if(ClocknameReceived != null) 
    ClocknameReceived(this, e); 
+0

问题是,我怎么写些不等于空的东西,这并未”不能解决问题 – Max 2013-02-15 14:13:52

+0

@Mobstaa如果正确安装到事件处理程序的委托将不能为空。类似formVariable.ClocknameReceived + =新ClockClocknameReceivedEventHandler(处理程序);和私人无效处理程序(对象发件人,Clock.ClocknameReceivedEventArgs e) – alfoks 2013-02-15 14:24:00