C#: String as parameter to event?

前端 未结 4 1540
独厮守ぢ
独厮守ぢ 2021-01-04 17:22

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 e

相关标签:
4条回答
  • 2021-01-04 17:54

    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.

    0 讨论(0)
  • 2021-01-04 17:59

    You need to create a new class by inheriting off EventArgs.

    0 讨论(0)
  • 2021-01-04 18:07

    In general you need to inherit EventArgs and add a string property, and then make your event of type EventHandler<YourEventArgs>, but that is a classic case for the BackgroundWorker.

    Sample here: http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

    and here: C# backgroundWorker reports string?

    0 讨论(0)
  • 2021-01-04 18:15

    Create your own version of the EventArgs.

    Do it like this:

    public class MyEventArgs : EventArgs
    {
       public string MyEventString {get; set; }
    
       public MyEventArgs(string myString)
       {
           this.MyEventString = myString;
       }
    }
    

    Then in your code replace the EventArgs with MyEventArgs and create an MyEventArgs object with your string in it.

    Then you can access it by using the MyEventArgs instance .MyEventString.

    So you would do something like this:

    ///// myClass (working thread...)
    class myClass
    {
        public event EventHandler NewListEntry;
    
        public void ThreadMethod()
        {
            DoSomething();
        }
    
        protected virtual void OnNewListEntry(MyEventArgs 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";
    
            OnNewListEntry(new MyEventArgs(test));
        }
    }
    

    And in your form:

    private void myObj_NewListEntry(Object objSender, MyEventArgs e)
    {
        this.BeginInvoke((MethodInvoker)delegate
        {
            // Here I want to add my string from the worker-thread to the textbox!
            richTextBox1.Text += e.MyEventString;
        });
    }
    
    0 讨论(0)
提交回复
热议问题