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;
                }
            }
        }

  

搜索笔记:

winform使用ShowDialog后,调用异步线程(async)等待(await)时,还未执行完毕,form就关了

https://blog.csdn.net/u012549951/article/details/107689593?spm=1001.2101.3001.6650.10&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-10-107689593-blog-86597538.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-10-107689593-blog-86597538.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=14

winform 多线程中ShowDialog()步骤无效的解决办法

https://chenyuan.blog.csdn.net/article/details/86597538?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-9-86597538-blog-93811187.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-9-86597538-blog-93811187.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=10

 

 

posted @ 2020-03-26 10:15  包子789654  阅读(901)  评论(0编辑  收藏  举报