C#的新手。就像标题一样,我很难尝试举办活动。它最终会以另一种形式消费。
我要做的是有许多自定义用户控件(我的事件提升表单)的实例,它创建一个tcp客户端,连接,然后关闭。当这个tcp客户端有一个“错误”时,无论是catch异常,我都希望引发一个事件。我正在通过关闭我的互联网来测试错误。我的第一个问题是我甚至无法举起活动。我将在我的自定义用户控件上显示我正在使用的事件代码:
public delegate void TaskCompleteEventHandler(object sender, TaskCompleteEventArgs e);
public event TaskCompleteEventHandler TaskComplete;
public class TaskCompleteEventArgs : System.EventArgs
{
// add local member variables to hold text
private string errorString;
// class constructor
public TaskCompleteEventArgs(string ErrorString)
{
this.errorString = ErrorString;
}
// Property
public string ErrorString
{
get
{
return errorString;
}
set
{
errorString = value;
}
}
}
这是我处理异常的方法,理想情况下会引发事件并允许主机表单相应地打印字符串和异常。
private void ErrorLogging(string ex)
{
errorString = String.Format(/*...errorString formatting...*/);
// instance the event args and pass it the errorString value
TaskCompleteEventArgs args = new TaskCompleteEventArgs(errorString);
// raise the event with the updated arguments
TaskComplete(this, args); //----> THIS IS WHERE I GET AN ERROR!! <----
this.Dispose();
}
错误为 Object reference not set to an instance of an object.
这是我的TaskComplete(this, args)
我似乎无法调试这个......我还不够强大,不知道我做错了什么。它是如何引起副作用的?
我确信当我开始这样做时,我的主要表格上会有更多问题......有没有人知道是什么导致了这个问题?提前谢谢。
编辑:在我的主要表格上:
public Form1()
{
InitializeComponent();
// Start control disabled and subscribe each control the event
foreach (var control in controlList)
{
control.Enabled = false;
control.TaskComplete += new dev_emu_project.dev_emu_widget.TaskCompleteEventHandler(OnTaskComplete);
}
}
List<dev_emu_project.dev_emu_widget> controlList = new List<dev_emu_project.dev_emu_widget>();
public void OnTaskComplete(object sender, dev_emu_project.TaskCompleteEventArgs e)
{
//.... work for processing
}
}
答案 0 :(得分:3)
您正在获取NullReferenceException
,因为您正在调用空事件,这意味着没有注册任何委托。在调用它之前,您需要确保TaskComplete
不为空。
在调用之前添加空检查以确保有人注册了您的事件:
if (TaskComplete != null)
{
TaskComplete(this, args);
}
来自MSDN Event Tutorial
:
调用活动
一旦类声明了一个事件,它就可以像处理指定的委托类型的字段一样处理该事件。如果没有客户端将事件连接到事件,则该字段将为null,否则它将引用在调用事件时应调用的委托。因此,通常首先检查null然后调用事件
来调用事件