C#: String as parameter to event?

.net, c#, event-handling, events, multithreading

Solution

Like this

public class NewListEntryEventArgs : EventArgs
{
    private readonly string test;

    public NewListEntryEventArgs(string test)
    {
        this.test = test;
    }

    public string Test
    {
        get { return this.test; }
    }
}

then you declare your class like this

class MyClass
{
    public delegate void NewListEntryEventHandler(
        object sender,
        NewListEntryEventArgs args);

    public event NewListEntryEventHandler NewListEntry;

    protected virtual void OnNewListEntry(string test)
    {
        if (NewListEntry != null)
        {
            NewListEntry(this, new NewListEntryEventArgs(test));
        }
    }
}

and in the subscribing `Form`

private void btn_myClass_Click(object sender, EventArgs e)
{
    MyClass myClass = new MyClass();
    myClass.NewListEntry += NewListEntryEventHandler;
    ...
}

private void NewListEntryEventHandler(
    object sender,
    NewListEntryEventArgs e)
{
    if (richTextBox1.InvokeRequired)
    {
        this.Invoke((MethodInvoker)delegate
            {             
                this.NewListEntryEventHandler(sender, e);
            });
        return;
    }

    richTextBox1.Text += e.Test;
}

I've taken the liberty of making the `NewListEntryEventArgs` class immutable, since that makes sense. I've also partially corrected your naming conventions, simplified and corrected where expedient.

Problem

I have a GUI-thread for my form and another thread that computes things. The form has a richtTextBox. I want the worker-thread to pass strings to the form, so that every string is displayed in the textbox. Everytime a new string is generated in the worker thread I call an event, and this should now display the string. But I don't know how to pass the string! This is what I tried so far: ``` ///// Form1 private void btn_myClass_Click(object sender, EventArgs e) { myClass myObj = new myClass(); myObj.NewListEntry += myObj_NewListEntry; Thread thrmyClass = new Thread(new ThreadStart(myObj.ThreadMethod)); thrmyClass.Start(); } private void myObj_NewListEntry(Object objSender, EventArgs e) { this.BeginInvoke((MethodInvoker)delegate { // Here I want to add my string from the worker-thread to the textbox! richTextBox1.Text += "TEXT"; // I want: richTextBox1.Text += myStringFromWorkerThread; }); } ``` ``` ///// myClass (working thread...) class myClass { public event EventHandler NewListEntry; public void ThreadMethod() { DoSomething(); } protected virtual void OnNewListEntry(EventArgs e) { EventHandler newListEntry = NewListEntry; if (newListEntry != null) { newListEntry(this, e); } } private void DoSomething() { ///// Do some things and generate strings, such as "test"... string test = "test"; // Here I want to pass the "test"-string! But how to do that?? OnNewListEntry(EventArgs.Empty); // I want: OnNewListEntry(test); } } ```

Original source

Related problems