从第一个表单调用第二个表单实例。但是当返回第一个表单时,第二个表单实例不会关闭

时间:2018-12-11 07:54:00

标签: c# winforms

我要调用第二个表单实例,并从第一个表单中单击按钮。在第二种形式中,如果第一种形式的用户名和密码不正确,则有一个SqlException会获取错误。如果SqlException发现错误,它将关闭第二个窗体并打开回第一个窗体。问题在于第二种形式保留在内存中,并且如果用户输入了不正确的用户名和密码100次,第二种形式的100个实例将保留在内存中,并且内存使用量正在堆积。我在第二个表单上也有一个按钮,可以让您回到第一个表单,我认为同样的事情也在发生。

我在表单之间切换的代码:

       //first form called FormLogin

        public FormLogin()
        {
            InitializeComponent();     
        }

        private void button1_Click(object sender, EventArgs e)
            {
                this.Hide();
                var nextForm = new Form1();
                nextForm.ShowDialog();
                nextForm.Activate();
                nextForm.Show();
            }

        //SqlException in the second form called Form1 

        public Form1()
        {
            InitializeComponent();
        }

         catch (SqlException ex)
                   {
                    //MessageBox.Show(ex.Message);
                    //var backtologin = new FormLogin();
                    //backtologin.Show();
                    //backtologin.Activate();
                    this.Hide();
                    MessageBox.Show(ex.Message,"Incorrect password, or missing permission!");
                    FormLogin login = new FormLogin();

                    login.ShowDialog();
                    login.Activate();

                    this.Close();
                }

    //second form button for going back to the first form
    private void logout_Click(object sender, EventArgs e)
            {
                this.Hide();
                FormLogin login2 = new FormLogin();
                login2.ShowDialog();
                login2.Activate();
                this.Close();
            }

2 个答案:

答案 0 :(得分:0)

这是您应该如何调用第二个表单实例的方法:

private void button1_Click(object sender, EventArgs e)
{
    this.Hide();
    var nextForm = new Form1();
    nextForm.FormClosing += (s,e) => {
        nextForm.Dispose(); // not always needed, but calling it doesn't hurt. It ensures the "nextForm" variable gets disposed, acts just like "using" statement.
        this.Show();
    };
    try{
        nextForm.Show();
    }
    catch(Exception e){
        //manage your exception here
    }


}

在这种情况下,请避免使用ShowDialog,因为您可能会将这两种形式视为两个不同的“事物”。

答案 1 :(得分:0)

使用ShowDialog()显示表单时,应使用using子句

using(FormLogin login2 = new FormLogin())
{
    login2.ShowDialog();
}

这样,在关闭login2后,它将被处置。

相关问题