首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#:字符串作为事件的参数?

C#:字符串作为事件的参数?
EN

Stack Overflow用户
提问于 2012-08-21 13:01:26
回答 4查看 40.6K关注 0票数 15

我的表单有一个GUI线程,还有一个用来计算事物的线程。

表单有一个richtTextBox。我希望工作线程将字符串传递给表单,以便每个字符串都显示在文本框中。

每次在工作线程中生成一个新字符串时,我都会调用一个事件,现在应该会显示该字符串。但我不知道怎么传递绳子!这就是我迄今为止尝试过的:

代码语言:javascript
复制
///// 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;
    });
}

代码语言:javascript
复制
///// 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);
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-21 13:20:07

像这样

代码语言:javascript
复制
public class NewListEntryEventArgs : EventArgs
{
    private readonly string test;

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

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

然后你像这样宣布你的班级

代码语言:javascript
复制
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));
        }
    }
}

在订阅的Form

代码语言:javascript
复制
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;
}

我冒昧地使NewListEntryEventArgs类不可变,因为这是有意义的。我也部分地修正了你的命名习惯,在合适的地方简化和修正了。

票数 25
EN

Stack Overflow用户

发布于 2012-08-21 13:02:58

您需要通过继承EventArgs来创建一个新的类。

票数 5
EN

Stack Overflow用户

发布于 2012-08-21 13:07:26

创建您自己的EventArgs版本。

这样做吧:

代码语言:javascript
复制
public class MyEventArgs : EventArgs
{
   public string MyEventString {get; set; }

   public MyEventArgs(string myString)
   {
       this.MyEventString = myString;
   }
}

然后在代码中将EventArgs替换为MyEventArgs,并创建一个包含字符串的MyEventArgs对象。

然后可以使用MyEventArgs实例.MyEventString访问它。

所以你会这样做:

代码语言:javascript
复制
///// 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));
    }
}

以你的形式:

代码语言:javascript
复制
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;
    });
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12055431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档