使用委托发送串
问题描述:
我'有我的代码中一个非常恼人的问题,当我尝试发送从表格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);
我'使用完全相同的代码,从另一个类的主要形式发送一个字节数组,工作正常,但是这一次给我的错误。
任何任何想法?
在此先感谢!
答
的委托可以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);
}
答
你不检查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);
};
答
你必须检查,如果事件有委托或不
if(ClocknameReceived != null)
ClocknameReceived(this, e);
我已经尝试过,问题是,它永远不会执行,我怎样才能得到ClocknameReceived如此充满它不会变为空? – Max 2013-02-15 14:09:37
您是否订阅了事件处理程序?参见:如何从事件订阅和退订(C#编程指南)(http://msdn.microsoft.com/en-us/library/ms366768.aspx) – dtb 2013-02-15 14:10:15
是的,我这样做的主要形式,并那一个不给我任何问题 – Max 2013-02-15 14:11:54