我想知道如何使用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
控件,我只能访问它是默认设置...
答案 0 :(得分:3)
您可以使用委托来进行Windows窗体之间的通信。 查看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/
代表和活动简介
答案 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"
}
答案 2 :(得分:2)
使用BackgroundWorker
课程来更新进度。
答案 3 :(得分:1)
我不认为你需要它的内部通信。它的后台线程形成您需要的通信。
在你的frmProcess2中订阅BackgroundWorker.ProgressChanged事件。从您的doWork方法定期提出该事件。
第45页 Joseph Albahari的Threading in C#有一个很好的例子