在线程之间同步winform控件

时间:2014-02-04 21:38:13

标签: c# .net vb.net multithreading winforms

这是设置。

1。)我有一个名为“CallingForm”的表单,在这个表单上我有一个名为“originalControl”的用户控件

2。)我有一个名为“FormLauncher”的类,在类中我有一个与“CallingForm”上的usercontrol类型相同的公共属性。我还有“ShowForm”方法创建一个新的STA线程,在ThreadStart中我有一个委托,它打开一个名为“ViewData”的表单的新实例。

3。)我有一个名为“ViewData”的表单,在这个表单上我有一个名为“finalControl”的公共用户控件,它与“CallingForm”和“FormLauncher”类上的usercontrol类型相同。

我希望用户在“CallingForm”上编辑usercontrol的属性,点击按钮调用“FormLauncher”中的“ShowForm”方法,然后使用usercontrol启动“ViewData”表单,以便“ ViewData / usercontrol“看起来就像”CallingForm“上的那个。

这是一个“基本”示例,而不是代码的真实形式。我有一个第三方控件,我需要在启动第三方控件之前“包装”在中间类中,但我需要通过“包装器”类公开第三方控件的所有属性。

我得到的“跨线程操作无效:控制”是从创建它的线程以外的线程访问的。“

我已经开始在“ViewData”表单上创建一个委托回调并将第三方控件传回给它,但后来我得到“在窗口句柄已经被调用之前无法调用Invoke或BeginInvoke创建“。所以我在调用之前添加了对“ViewData”句柄的调用,但之后只是将我引回原始错误。

- 编辑更好的例子。

我有一个“主要”的形式,我们完成了大部分工作。我有一个“报告”winform,其中包含连接到SQL Server存储过程的自定义第三方报表控件。当我显示“报告”表单时,需要很长时间“几分钟”来提取数据。有人告诉我,我需要在另一个线程上运行“报告”表单,这样用户仍然可以在“主要”winform上工作。

这是真的吗?是否有某种方法可以启动“报告”表单而不会让用户等待表单加载?

我需要在第三方控件加载时显示“报告”表单。第三方控件已经有自己的进度条。

我们正在尝试创建一个通用的报表包装器,用户可以从“Main”表单中选择一个报表列表,然后代码将根据从“Main”菜单中选择的内容设置“Report”表单源。 ”

我愿意接受建议。

0 个答案:

没有答案