日期:2014-05-20  浏览次数:20940 次

关于模式窗口和非模式窗口的问题
我做了个小程序,譬如有三个窗体from1(MDI窗体)、from2(放置控件的窗体)、from3(提示窗体)
我在from1放一些控件然后当点击一个按钮进行大量数据操作时弹出提示窗口from3,(当然不是用的MessageBox的弹出窗口,因为用了这个窗口后程序就会停在那里等你确定或关闭了这个弹出窗口才能继续运行,这不是我需要的提示窗口,我要在提示窗口显示时程序能够继续运行,譬如提示一个“程序正在运行,请等待...”)但是这样做,那个提示窗口from3总是会被这些控件挡住,弹出窗口用this.TopMost   =   true;也不起作用,于是我就想把这些控件也放在一个单独的窗体from2里,这样当我点击from2里面的按钮进行大量数据操作时弹出提示窗口from3了,但是当我在from2里的其它任意地方点击一下时,from3就看不见了,或者说from3就不在最顶端显示了
现在问题是:1.怎么样才能让from3一直都在最前面,知道数据操作完成后就自动关闭呢?

我查了一下说要用到模式与非模式窗口才行,如果真的用到这个非模式窗口的话,那么这个窗口怎么用呢,为什么我用.ShowDialog();会报

未处理的“System.InvalidOperationException”类型的异常出现在   system.windows.forms.dll   中。

其他信息:   非顶级窗体不能显示为模式对话框。在调用   showDialog   之前应从其所有父窗体中移除该窗体。
”这个错误呢?
2.请问这个又怎么解决呢?

------解决方案--------------------
比较奇怪.楼主现在到底是几个窗体?什么窗体?

我的建议:UI线程就是UI线程,大量数据操作用工作线程(如果你是.net 2.0 ,可以用backgroundworker控件).在UI线程showdialog()把form3显示出来,然后UI线程就等待.工作线程完成时返回信号量,关闭form3(form3.DialogResult = DialogResult.OK)

这样更清楚吧?
------解决方案--------------------
整体感觉你说的有点乱,别把所有东西都放一起.
------解决方案--------------------
你的form3用usercontrol代替吧,需要的时候用form3.visible=true