C#模态对话框和非模态对话框

因为工作中出现的问题,来记录一下涉及到的模态和非模态对话框

简要介绍一下两个的区别:

  非模态对话框 模态对话框
调用窗口方式 窗体实例化对象.show() 窗体实例化对象.showdialog()
弹出后 可以切换到其他界面 未关闭前不能切换到其他界面
关闭后

自动释放资源,托管方式进行垃圾回收;DialogResult.ToStrring()==None;

仅隐藏窗体,不会主动释放资源,不会被主动垃圾回收;DialogResult.ToString()==Cancel;窗体对象.Visiable=false
其他 调用show()之后即可继续执行其他操作 关闭对话框后,才执行函数后面的操作

需要注意的是,如果关闭对话框后仍需要调用对话框中变量,需要用模态对话框;在考虑保留对话框数据信息,仅是想隐藏对话框时使用模态对话框,关闭时也可以调用this.Hide()也可不调用。简易代码如下:

namespace FileOpen  //主界面
{
    public partial class OpenFile : Form
    {
        public OpenFile()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ShowDialog openDialog = new ShowDialog();
            openDialog.ShowDialog();
            MessageBox.Show(openDialog.DialogResult.ToString());
            if (openDialog.Visible.ToString().ToLower() == "false")
            {
                MessageBox.Show("模态窗体关闭后Visible为False,并未释放");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ShowDlg openDlg = new ShowDlg();
            openDlg.Show();
            MessageBox.Show(openDlg.DialogResult.ToString());
        }

         
    }
}
namespace FileOpen
{
    public partial class ShowDialog : Form//模态对话框
    {
        public ShowDialog()
        {
            InitializeComponent();
        }

        private void ShowDialog_FormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("模态窗体关闭后DialogResult为" + this.DialogResult.ToString());
           
        }
    }
}
namespace FileOpen
{
    public partial class ShowDlg : Form//非模态对话框
    {
        public ShowDlg()
        {
            InitializeComponent();
        }

        private void ShowDlg_FormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("非模态窗体关闭后DialogResult为" + this.DialogResult.ToString());
        }

    }
}

 

你可能感兴趣的:(C#)