模态窗口

C# 非模式窗体show()和模式窗体showdialog()的区别
对话框不是模式就是无模式的。模式对话框,在可以继续操作应用程序的其他部分之前,必须被关闭(隐藏或卸载)。例如,如果一个对话框,在可以切换到其它窗 体或对话框之前要求先单击“确定”或“取消”,则它就是模式的。

一、调用

任何窗体(派生于基类Form的类),都可以以两种方式进行显示。

//非模式窗体
From qform=new Form();
qform.Show();

//模式窗体
Form qform=new Form();
qform.ShowDialog();

一、控制权上的区别

Form.Show创建新窗体后(非模式),立即返回,且没有在当前活动窗体和新窗体间建立任何关系,即在保持新窗口的情况下关闭(或最小化)现有 窗体或在保留现有窗体情况下关闭(或最小化)新窗口,都是可以的。

Form.ShowDialog创建模式窗体,即只有当建立的新窗口关闭之后,原有窗体才能重新获得控制权。即如果不关闭新窗口,将无法对原活动窗 口进行任何操作。对新窗口进行的最小化、还原将会和原窗口一起进行,但是新窗口的关闭对原窗口没有影响。

需要注意的是,不管是何种情况,只要主窗体被关闭了,或主程序结束了,那么Application.Run将会关闭所有窗体,不管它是模式还是非模 式。


在rdlc中,使用showdialog显示打印界面,需要手动卸载程序集,否则抛出异常:vs2010 rdlc .net4.0 卸载 Appdomain 时出错。 (异常来自 HRESULT:0x80131015) 

如果使用showdialog展示rdlc则其线程与主程序属于不同线程;使用show战士rdlc则二者属于同一线程,就不会抛出异常。
卸载程序集方法this.reportViewer1.LocalReport.ReleaseSandboxAppDomain();
详参http://blog.csdn.net/pengzhiq/article/details/5876063
 
原文地址:https://www.cnblogs.com/maomiyouai/p/3487160.html