winform显示窗口Show()和ShowDialog()的区别
1. 非模态窗口方式(可以跟其他界面自由切换,而且不阻塞代码)
Show()方法启动的窗口是非模态窗口,可以跟其他界面自由切换,
其后面的代码也会立刻执行,如:
Form1 form1 = new Form1();
form1.Show();
MessageBos.Show("这里会马上显示");
2. 模态窗口(必须关闭了该窗口,后面的代码才会执行,并且不能跟其他界面自由切换)
ShowDialog()打开的窗口为模态窗口(只是个名字而已),
区别在于,以showDialog()打开的窗体,要等窗体关闭后才能操作其他窗体.而show()则不受此限制.
此类窗口不能和别的窗口自由切换,而且其后面的代码必须等关闭该窗口才会执行(就像被阻塞在那里了)
如:
Form1 form1 = new Form1();
form1.ShowDialog();
MessageBos.Show("必须关闭了form1, 这里才会显示");
例如登录窗口
主程序入口:
static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); FrmLogin objFrm = new FrmLogin(); DialogResult result= objFrm.ShowDialog();//模式对话框,对话框模式的是有返回值的 if (result == DialogResult.OK)//说明登录成功了 { //登录成功,显示主窗体 FrmMain obj = new FrmMain(); Application.Run(obj); } else { Application.Exit(); } } }
登录窗口
private void btn_Login_Click(object sender, EventArgs e) { //判断是否选中匿名登录(不用输入用户名和密码直接登录的) if (this.chk_UsePwd.Checked) { this.DialogResult = DialogResult.OK; //CommonMethods.objAdmins.LoginName = "None"; CommonMethods.objAdmins=new SysAdmins() { LoginName = "None" }; } else { //登录判断 if (this.txt_UserId.Text.Trim().Length == 0) { MessageBox.Show("请填写用户名!", "登录提示"); this.txt_UserId.Focus(); return; } if (!DataValidate.IsInteger(this.txt_UserId.Text.Trim()))//判断用户ID是不是正整数 { MessageBox.Show("用户名必须为正整数!", "登录提示"); this.txt_UserId.Focus(); return; } if (this.txt_Pwd.Text.Trim().Length == 0) { MessageBox.Show("请输入密码!", "登录提示"); this.txt_Pwd.Focus(); return; } //封装对象 SysAdmins objAdmins = new SysAdmins()//初始化对象,设置 id 和 密码 的属性 { LoginId = Convert.ToInt32(this.txt_UserId.Text.Trim()), LoginPwd = this.txt_Pwd.Text.Trim() }; if (AdminLogin(objAdmins) == null)//没查到 { MessageBox.Show("用户名或密码错误!", "登录提示"); } else//查到了 { this.DialogResult = DialogResult.OK; CommonMethods.objAdmins = objAdmins; } } }