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

区别

模态与非模态窗体的主要区别是窗体显示的时候是否可以操作其他窗体。模态窗体不允许操作其他窗体,非模态窗体可以操作其他窗体。

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

在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码

窗体显示为模式窗体时,单击“关闭”按钮会隐藏窗体,并将DialogResult属性设置为DialogResult.Cancel   与无模式窗体不同,当用户单击对话框的关闭窗体按钮或设置DialogResult属性的值时,不调用窗体的Close方法   实际上是把窗体的Visible属性赋值为false,隐藏窗体了   这样隐藏的窗体是可以重新显示,而不用创建该对话框的新实例   因为未关闭窗体,所以在应用程序不再需要该窗体时,请调用该窗体的Dispose方法

所以模态窗口在关闭时,不会调用close方法,也不调用dispose方法,窗口仍然存在,占有资源,所以可以继续获得窗口相关信息,在窗口不再使用时,需要手动释

testDialog.ShowDialog(); // 模态窗口关闭后,可以再次显示出来
testDialog.Dispose(); // 当模态窗口不再使用时,应该调用dispose方法释放资源 

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

怎么判断一个窗体是模式窗体呢?   利用Form.Modal属性,如果该窗体是模式显示,则为true,否则为false   根据通过Show和ShowDialog而显示出来的窗体的Modal属性分别对应false和true   特别注意:   由于在窗体创建之前是无法得知显示方式的,所以在窗体构造函数中,Modal属性总是对应false,所以我们只能在Load事件中或者之后利用Modal属性值

怎么确定窗体间的所有者关系?   Form类的Owner属性:窗体的所有者   当一个窗体归另一窗体所有时,它便随着所有者窗体最小化和关闭。   例如,如果Form2归窗体Form1所有,则关闭或最小化Form1时,Form2也会关闭或最小化。

private void button1_Click(object sender, EventArgs e)
{Form2 mainForm = new Form2(); mainForm.StartPosition = FormStartPosition.CenterScreen; mainForm.Location = new Point(500,500); //mainForm.ShowDialog(this); //或者 如果设置子府窗体,可以根据具体需求设置调用的方式 mainForm.Show(this); //或者 //mainForm.Owner = this; //mainForm.ShowDialog(); }

Winform 窗体传值

1.调用构造函数,传值是单向的传递,实现简单,重写构造函数,在其中赋值即可;

2.静态变量,在一个类中定义一个静态变量,其实相当于定义一个全局变量;

3.给窗体定义公有属性,在调用时给予赋值;

4.通过窗体的公有属性值和Owner属性   特点:实现简单,灵活  

实现代码如下:
在窗体Form1中
public int Form1Value = 1;  Form2 f2 = new Form2 ( ); f2.ShowDialog ( this ); //把Form1作为Form2的所有者传递给Form2  在窗体Form2中 //Form2的所有者是Form1 Form1 f1 = ( Form1 ) this.Owner; //取到Form1的值是1 MessageBox.Show ( f1.Form1Value .ToString ( ) ); //给Form1的Form1Value赋值222 f1.Form1Value = 222; 

5.通过窗体的公有属性值和Application.OpenForms属性

说明:Application.OpenForms属性:获取属于应用程序的打开窗体的集合。(此属性在 .NET Framework2.0版中)
实现代码如下:
在窗体Form1中
public int Form1Value = 1;
Form2 f2 = new Form2 ( ); f2.Show ( ); 在窗体Form2中 string formName = "Form1"; Form fr = Application.OpenForms [ formName ]; if ( fr != null ) { Form1 f1 = ( Form1 ) fr;  //取到Form1的值是1  MessageBox.Show ( f1.Form1Value.ToString ( ) );  //给Form1的Form1Value赋值222 f1.Form1Value = 222; } 

6通过事件

实现代码如下:
在窗体Form2中定义公有属性Form2Value,获取和设置textBox1的文本值
并且还定义一个accept事件
public string Form2Value
{
get { return this.textBox1.Text; } set { this.textBox1.Text = value; } } public event EventHandler accept; private void button1_Click ( object sender , EventArgs e ) { if ( accept != null ) { accept ( this , EventArgs.Empty ); //当窗体触发事件,传递自身引用 } } 在窗体Form1中 Form2 f2 = new Form2 ( ); f2.accept += new EventHandler ( f2_accept ); f2.Show ( ); void f2_accept ( object sender , EventArgs e ) { //事件的接收者通过一个简单的类型转换得到Form2的引用 Form2 f2 = (Form2) sender; //接收到Form2的textBox1.Text this.textBox1.Text = f2.Form2Value; 

View Code

原文网址:http://blog.csdn.net/percy__lee/article/details/48554339

转载于:https://www.cnblogs.com/SSs1995/p/9673763.html

showdialog相关推荐

  1. C# 窗体位置 Show和ShowDialog (转载)

    CenterParent                     窗体在其父窗体中居中.        CenterScreen                    窗体在当前显示窗口中居中,其尺寸 ...

  2. Window.Show()和Window.ShowDialog()区别

    Window.Show():     打开窗口并返回,而不等待新打开的窗口关闭. Window.ShowDialog():   打开一个窗口,并且仅在新打开的窗口关闭后才返回. 转载于:https:/ ...

  3. Thread\Threading.Timer\Task中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”

    在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 出错环境: 1.在Thread线程中,调用Show ...

  4. C#(WinForm)的Show()和ShowDialog()方法介绍

    1. 显示窗口的两种方式: Winform中的Form,在显示窗口时,可以使用Show()和ShowDialog()两种方式 2. 非模态窗口方式(可以跟其他界面自由切换,而且不阻塞代码) Show( ...

  5. C# 非模式窗体show()和模式窗体showdialog()的区别

    对话框不是模式就是无模式的.模式对话框,在可以继续操作应用程序的其他部分之前,必须被关闭(隐藏或卸载).例如,如果一个对话框,在可以切换到其它窗 体或对话框之前要求先单击"确定"或 ...

  6. C#重写ShowDialog函数

    /// <summary> /// 重写ShowDialog()函数 /// </summary> /// <returns> ViewServerInfo是返回类 ...

  7. c#中Show和Showdialog的区别分析

    简单地说他们的区别就是show弹出来的窗体和父窗体(上一个窗体的简称)是属于同一等级的,这两个窗体可以同时存在而且可以随意切换,但是showdialog弹出来的窗体就不能这样,他永远是被置顶的,如果不 ...

  8. c#中的Form.Show和Form.ShowDialog的区别

    出处:http://hi.baidu.com/cysteine/blog/item/01e32224702ff5398744f9bf.html 区别1:ShowDialog是模态的(独占用户输入),S ...

  9. 避免某个子窗体重复运行的方法(showdialog、show)

    在C#中窗口的显示有两种方式:模态显示(showdialog)和非模态显示(show). 二者最常见的区别是: 模态显示后,弹出窗口阻止调用窗口的所有消息响应.只有在弹出窗口结束后调用窗口才能继续.在 ...

  10. OpenFileDialog 类的ShowDialog() 错误的解决

    首先,一个类里,有个linkLabel1 private OpenFileDialog openFileDialog1; private DialogResult result; private vo ...

最新文章

  1. netcore 图片 文件大小_NetCore 3.0文件上传和大文件上传的限制详解
  2. 计算机专业专业课的准备
  3. html调后台接口_前后端分离之让前端开发脱离接口束缚(mock)
  4. hashcode相等的两个对象一定相等吗_为什么重写 equals方法时一定要重写hashCode方法?...
  5. 1805b: Coronavirus Spike Protein Binder Design 寻找蛋白质阻止新冠病毒感染人类细胞
  6. Spring Boot 2 + Redis 对象缓存
  7. 实现ftp_FTP文件服务器的实现
  8. vmware上安装vxworks(xp环境)
  9. 你敢在post和get上刁难我,就别怪我装逼了
  10. oracle登录日志查看_last命令详解--查看Linux 登录日志+实例说明
  11. 解决局域网共享时提示:你没有权限访问,请与网络管理员联系
  12. 数据库篇之[bsp_orders]数据表-BrnShop1.9升级至2.1升级说明(非官方版本)
  13. C++:vector二维数组初始化
  14. 99乘法表,九九乘法表
  15. 嵌入式Linux--MYS-6ULX-IOT--总目录
  16. 2018高中计算机竞赛,最新 | 2018年高中生各项竞赛时间一览表
  17. MYSQL数据库版本更新
  18. JVM监控及诊断工具-GUI篇
  19. 伪分布式安装zookeeper(在一台机器上运行三个zk服务)
  20. 高性能迷你服务器,分享几个关于迷你电脑主机的优缺点

热门文章

  1. css虚线border
  2. html错位排列,排列组合之错位重排
  3. JS stacktrace--解决运行npm run serve 后报错,node内存溢出问题
  4. switch选择语句在控制台实现一个简易的计算器(+ - * / %)
  5. python turtle画笑脸_如何用Python画滑稽笑脸
  6. 老骥伏枥,志在千里:如何在40岁后继续做软件开发?
  7. consul注册中心高可用集群的搭建经验
  8. java的tgz解压工具类
  9. [洛谷 OJ]P1101 单词方阵
  10. 小红书成功注册老红书商标!网友:从小看到老