在两个表单之间提高自定义事件处理的麻烦

时间:2014-07-08 20:16:14

标签: c# .net winforms

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)

的观看屏幕

watchscreen

我似乎无法调试这个......我还不够强大,不知道我做错了什么。它是如何引起副作用的?

我确信当我开始这样做时,我的主要表格上会有更多问题......有没有人知道是什么导致了这个问题?提前谢谢。


编辑:在我的主要表格上:

    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
        }
    }

1 个答案:

答案 0 :(得分:3)

您正在获取NullReferenceException,因为您正在调用空事件,这意味着没有注册任何委托。在调用它之前,您需要确保TaskComplete不为空。

在调用之前添加空检查以确保有人注册了您的事件:

if (TaskComplete != null)
{ 
    TaskComplete(this, args);
}

来自MSDN Event Tutorial

  

调用活动

     

一旦类声明了一个事件,它就可以像处理指定的委托类型的字段一样处理该事件。如果没有客户端将事件连接到事件,则该字段将为null,否则它将引用在调用事件时应调用的委托。因此,通常首先检查null然后调用事件

来调用事件