日期:2014-05-19  浏览次数:20768 次

模式窗体与主窗体之间的互操作
我有一个主MDI窗体A,A上有一个控件E,在整个业务操作过程中,都有可能对其进行点击等操作。窗体B是A的子窗体,窗体C是B创建出来的模式窗体(必须用模式,因为B要等待C关闭后传回来的数据)。现在的问题是:在C窗体显现后,也需要对控件E做操作,这时因为焦点强制在C上的关系,根本无法点击到控件E上。

后来考虑控件E通过异步线程来创建,但是通过创建简单的线程来创建,始终提示“当前线程不在单线程单元中,无法创建ActiveX控件”。如果用了BeginInvoke的方式,实际拥有控件E的句柄的线程还是窗体A的主体线程。

请问有什么别的解决方式?

------解决方案--------------------
你可以给你的窗体添加自定义的事件来达到这个目的,通过在另一个窗体里处理自定义的事件,可以很容易的操作那个窗体的控件,就像使用一般系统事件一样.可以参考如下:

public event EventHandler someEvent;

if (someEvent!=null)
{
someEvent(this, new EventArgs());
}
------解决方案--------------------
麻烦一点

c发事件b接收
b发事件a接收

或者把a传到c中
或者在c中得到a窗体,可以用OpenForms
------解决方案--------------------
LS两位好像没有清楚LZ的需求。
他是要模式窗口弹出后还能点击主窗口的控件。
LZ,是不是要这样的??
如果是的话,那么我可以告诉你,这是不可能的。此时主窗口的控件是无法被用户操作的。除非哪天微软把这个规则改了!
------解决方案--------------------
要模式窗口弹出后还能点击主窗口的控件
--〉
如果是这样的话,
那就把B窗体做成应用程序
然后再A中调用它
类似于动态加载~~~
------解决方案--------------------
两个简单方案:
一、不要把C做成模式窗体,在弹C的时候把B隐藏掉。
二、在弹C的时候让B不成为A的mdi窗体,关掉C后再让B加回来。
------解决方案--------------------
设计就不合理,
模式窗口本来就是让当前代码暂停执行的!你非要违背这个原则肯定行不能!
用非模式窗口,或用自定义控件都可!
------解决方案--------------------
很有意思,应该能够实现
个人认为只要把B和A放到不同线程就可以了
也就是在创建并显示B的时候开在另一个线程里
------解决方案--------------------
楼主可以参考一下我以前写的文章,
谈基于.net平台windows开发中的模式窗体
http://blog.csdn.net/zhzuo/archive/2006/05/05/708941.aspx