c# - 从第一个表单调用第二个表单实例。但是当回到第一个表单时,第二个表单实例不会关闭
问题描述
我正在通过第一个表单中的按钮单击调用第二个表单实例。在第二种形式中,如果第一种形式的用户名和密码不正确,则会出现 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();
}
解决方案
下面是你应该如何调用你的第二个表单实例:
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
在这种情况下使用,因为您可能会将这两种形式视为两种不同的“事物”。
推荐阅读
- spacy - spaCy CLI 训练 NER 中的 P、R 和 F 分数是如何计算的?
- c++ - 尝试使用矩阵在 C++ 中实现 Durand-Kerner-Method
- security - 使用 HSM 存储“主密钥” - 如何?
- python - 如何从 Django 中另一个应用程序中的模型访问related_name?
- c - C 中 fread () 和 fwrite () 函数的问题
- r - 我将如何在 R 中指定这个函数(数学公式)?
- volttron - VOLTTRON 安装在 rasbian buster 上
- snowflake-cloud-data-platform - 用于检索在列表的任何元素中包含字符串的 JSON 的雪花查询
- python-3.x - python中的绝对文件夹路径
- html - 通过 CSS 在 Adobe XD 和 Web 上 Work Sans 字体的外观不同