表格之间的沟通

时间:2010-12-07 05:23:10

标签: c# winforms

我想知道如何使用C#在表单之间进行通信?

在Visual Basic中,它更容易,因为每个表单都有自己的实例,而C#则不同。

Program类中,我设置了一个保存表单的公共和静态变量:

public static FormProcess2 frmProcess2 = null;

然后在Main方法中创建表单并显示出来:

frmProcess2 = new FormProcess2();
frmProcess2.ShowDialog();

现在加载该表单时,它会加载一个处理XML文件的后台进程。 处理所有文件的方法是另一个类名XMLParser。 因此,在BackgroundWorker doWork中,我通过以下方式加载该方法:

XMLParser.Start();

现在问题是,如何修改frmProcess2类中的XMLParser控件? 我希望它通过更改标签文本以及在那里放置一些不错的进度条来显示正在更新的内容。

但是我无法访问Program.frmProcess2控件,我只能访问它是默认设置...

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

要访问在UI线程下运行的UI控件,您需要创建用于访问UI控件的委托函数,其他线程无法访问1个线程的becoz控件,在您的情况下您的后台线程想要访问UI线程控制,这可以通过创建委托函数来完成。

    //sample delegate function
    //this function is to request i.e invoke UI thread controls
    private void deleteGridRow()
    {
        if (autoGridView.InvokeRequired)
        {
            autoGridView.Invoke(new Action(delegate() { deleteGridRow(); }));
        }
        else
            autoGridView.Rows.RemoveAt(0);
    }

此功能需要在backgroundworker1_DoWork(){deleteGridRow();}内调用,您可以将其用于状态:

    private void backThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        lableStatus.Text = "your status"
    }

BACKGROUNDWORKER:MSDN

答案 2 :(得分:2)

使用BackgroundWorker课程来更新进度。

alt text

答案 3 :(得分:1)

我不认为你需要它的内部通信。它的后台线程形成您需要的通信。

在你的frmProcess2中订阅BackgroundWorker.ProgressChanged事件。从您的doWork方法定期提出该事件。

第45页 Joseph Albahari的Threading in C#有一个很好的例子