C#中SHOWDIALOG()与SHOW()的区别_模态与非模态_销毁与释放

Dispose() Close()

C#中showDialog()与show()的区别
showdialog方法 有 驻权交回 的功能
C# show和showdialog区别


在C#中窗口的显示有两种方式:
模态显示(showdialog)
非模态显示(show)。

二者最常见的区别是:
模态显示后,弹出窗口阻止调用窗口的所有消息响应。
只有在弹出窗口结束后调用窗口才能继续。
在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值。

非模态显示后,
可以在弹出窗口和调用窗口之间随意切换。
调用窗口调用show方法后,下面的代码可以立即执行。
在非模态窗口关闭后,窗口的所有资源被释放,窗口不存在,
无法获取窗口的任何信息。

MSDN上对showdialog的解释:

当窗体显示为模式对话框时,单击“关闭”按钮(窗体右上角带 X 的按钮)会隐藏窗体并将 DialogResult 属性设置为 DialogResult.Cancel。与无模式窗体不同,当用户单击对话框的关闭窗体按钮或设置 DialogResult 属性的值时,.NET Framework 不调用 Close 方法。窗体转而可以隐藏并可重新显示,而不用创建该对话框的新实例。因为未关闭显示为对话框的窗体,所以在您的应用程序不再需要该窗体时,必须调用该窗体的 Dispose 方法。

也就是说,非模态窗口在关闭时,会调用close方法,进而调用dispose方法,将窗口资源进行回收,所以窗口关闭后,不能在获取窗口信息。

模态窗口在关闭时,不会调用close方法,也不调用dispose方法,窗口仍然存在,占有资源,所以可以继续获得窗口相关信息,在窗口不再使用时,需要手动释放资源。
[csharp] view plain copy
Form2 testDialog = new Form2();

if (testDialog.ShowDialog(this) == DialogResult.OK)
{
this.txtResult.Text = testDialog.TextBox1.Text; // 窗口关闭后,还可以继续访问窗口的子控件值
}
else
{
this.txtResult.Text = "Cancelled";
}
// 关闭窗口
// 其他操作
......
......
testDialog.ShowDialog(); // 模态窗口关闭后,可以再次显示出来
testDialog.Dispose(); // 当模态窗口不再使用时,
应该调用dispose方法释放资源

Form2 test = new Form2();
test.Show(); // 非模态显示
// 关闭窗口
// 其他操作
......
......
test.Show(); // 异常,因为在test关闭时,窗口已经被彻底销毁了,这里必须重新新建一个窗口,然后显示
// 修改为如下
test = new Form2(); // 创建一个新窗口,重新分配空间
test.Show(); // 显示窗口

面对多窗口的调用的时候,我们往往不喜欢窗口之间的随意切换,那样我们还有花费时间寻找我们要用的窗口,而且,一但出现问题,窗口的顺序也有可能被再次打乱,很是不顺手,那么我们怎么办呢?
我们可以将show方法转化为showdialog方法,顾名思义,showdialog是一个进行路经绑定的show方法,他是不可以自由切换的,换言之,就是,当你没有关闭你当前页的前提下,你是无法关闭该页面后面的任一页面的,它是当前唯一(路经打开)为true的。

而show方法由于未进行绑定,它所显示的各个窗口、对话框是可以相互切换,而不需要关闭当前窗口、对话框。但是他由于未进行绑定,所以每个由show方法打开的窗口的顺序是非固定的,如果遇到什么问题,由show方法打开的窗口的顺序可能会有很大的改变!

show()仅仅是显示出来窗口界面而已```也就是和你执行的结果在同一窗口显示```所显示的窗口可以在后台运行```而showDialog()是一个对话框窗口界面```执行结果以新窗口界面出现```不允许进行后台运行```就是你想编辑什么的时候```非得先关闭showDialog()窗口界面才可以进行其他操作```

这就是它们的一点小区别了```

show()是非模式窗体.
showDialog()是模式窗体.
区别在于,以showDialog()打开的窗体,要等窗体关闭后才能操作其他窗体.而show()则不受此限制.

这是最经常的区别了,
还有一个我个人使用的心得,你可以了解

比如你先打开子窗体,想隐藏主窗体。
如果这个时候用Show的话,则会发生的事情是,打开子窗体的同时主窗体又显示出来,而使用ShowDialog()的时候主要当子窗体关闭的时候主窗体才会显示。
简单代码如下:
Form2 f2 = new Form2();
this.Visible = false;
f2.ShowDialog();
this.Visible= true;
这就是模态对话框的与Show的区别。

欢迎讨论,相互学习。 txwtech@163.com
原文地址:https://www.cnblogs.com/txwtech/p/14722906.html