首页 > 解决方案 > 从第一个表单调用第二个表单实例。但是当回到第一个表单时,第二个表单实例不会关闭

问题描述

我正在通过第一个表单中的按钮单击调用第二个表单实例。在第二种形式中,如果第一种形式的用户名和密码不正确,则会出现 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();
            }

标签: c#winforms

解决方案


下面是你应该如何调用你的第二个表单实例:

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在这种情况下使用,因为您可能会将这两种形式视为两种不同的“事物”。


推荐阅读