Shen
Shen

Reputation: 644

Trouble with raising custom event handling between 2 forms

New to C#. Like the title, I'm having difficulty trying to raise an event. It will eventually then be consumed on another form.

What I'm trying to do is have many instances of a custom user control (my event raising form(s)) that creates a tcp client, connects, and then closes. When this tcp client has an "error", be it a catch exception, I want an event to be raised. I'm forcing the error right now by having my internet turned off to test. My first problem is I can't even get the event to be raised at all. I'll show the event code I'm working with on my custom user control:

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

This is my method that processes the exception and ideally would raise the event and allow the host form to print the string and exception accordingly.

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();
    }

The error is Object reference not set to an instance of an object. Here's the Watch screen of my TaskComplete(this, args)

watchscreen

I can't seem to debug this... I'm just not strong enough yet to know what I've done wrong. How is it causing side effects?

I'm sure I'm going to have more issues on my main form when I get this going... Does anyone have a clue what's causing this? Thanks in advance.


EDIT: On my main form:

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

Upvotes: 0

Views: 67

Answers (1)

Yuval Itzchakov
Yuval Itzchakov

Reputation: 149626

You are getting a NullReferenceException because you're invoking an empty event, meaning no delegate has been registered to it. You need to make sure TaskComplete isn't null before invoking it.

Add a null check before invoking to make sure someone did register to your event:

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

From MSDN Event Tutorial:

Invoking an event

Once a class has declared an event, it can treat that event just like a field of the indicated delegate type. The field will either be null, if no client has hooked up a delegate to the event, or else it refers to a delegate that should be called when the event is invoked. Thus, invoking an event is generally done by first checking for null and then calling the event

Upvotes: 3

Related Questions