表格之间的沟通

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

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

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

 public static FormProcess2 frmProcess2 = null; 

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

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

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

 XMLParser.Start(); 

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

但我无法访问Program.frmProcess2控件,所有我可以访问的只是它的默认值…

那么你可以使用委托来表达窗体之间的通信。 检查http://www.c-sharpcorner.com/uploadfile/mosessaur/winformsdelegates09042006094826am/winformsdelegates.aspx

代表团

编辑

检查代表(C#编程指南)

http://msdn.microsoft.com/en-us/library/ms173171%28VS.80%29.aspx

在C#中创建自定义委托和事件

http://www.csharphelp.com/2007/02/creating-custom-delegates-and-events-in-c/

代表和活动简介

http://www.csharp-station.com/Tutorials/lesson14.aspx

使用BackgroundWorker类更新进度。

替代文字

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

  //sample delegate function //this function is to request ie 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

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

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

Joseph Albahari 在C#中的线程有一个很好的例子