Windows Forms C#登录系统点击退出按钮后验证功能失效的问题求助
Windows Forms C#登录系统点击退出按钮后验证功能失效的问题求助
嘿,我仔细看了你的代码和问题描述,终于找到导致点击退出按钮后登录功能失效的原因啦!
问题根源
你在Form1_FormClosing事件里的处理逻辑有问题:当用户确认退出时,你先调用了Application.Exit()终止整个应用的消息循环,紧接着又调用Application.Run(mainForm)启动新的消息循环。这会导致原来的Login窗体实例处于异常状态——因为Application.Exit()已经标记它要关闭,而且你设置了isClosing = true,之后再回到这个窗体点击登录按钮时,button1_Click里的if (isClosing || IsLoggedIn)判断会直接返回,完全跳过了登录验证的逻辑,这就是登录功能失效的原因。
另外,Application.Exit()和Application.Run()混用的做法本身就不符合Windows Forms的窗体生命周期逻辑,很容易导致这类状态异常的问题。
解决方案
我们可以简化FormClosing的处理逻辑,去掉多余的isClosing变量,正确处理窗体关闭和跳转的流程:
- 首先删除
private bool isClosing = false;这个字段,因为我们不再需要它。 - 修改
Form1_FormClosing方法,按照正常的窗体生命周期来处理:
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (!IsLoggedIn) { var result = MessageBox.Show("Вы уверены, что хотите выйти без входа?", "Подтверждение", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.No) { // 用户取消退出,阻止窗体关闭 e.Cancel = true; } else { // 用户确认退出:如果Login是启动窗体,关闭它就会结束应用;如果需要打开mainForm,先隐藏当前窗体再显示mainForm this.Hide(); mainForm.Show(); } } // 如果已经登录,直接允许窗体关闭即可,不需要额外处理 }
- 同时修改
button1_Click方法,去掉多余的isClosing判断:
private void button1_Click(object sender, EventArgs e) { if (IsLoggedIn) return; if (textBox1.Text == correctUsername && textBox2.Text == correctPassword) { IsLoggedIn = true; MessageBox.Show("Вход выполнен успешно!", "Доступ разрешен", MessageBoxButtons.OK, MessageBoxIcon.Information); AdminPanel adminPanel = new AdminPanel(); this.Hide(); adminPanel.ShowDialog(); this.Show(); } else { MessageBox.Show("Неверный логин или пароль!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
逻辑说明
- 当用户未登录就尝试关闭窗体时,弹出确认对话框:如果用户选择“No”,就阻止窗体关闭;如果选择“Yes”,就隐藏当前Login窗体并显示mainForm(如果Login是启动窗体,你也可以直接让它关闭,应用会自动退出,不需要启动mainForm,根据你的需求调整即可)。
- 去掉
isClosing变量后,登录按钮的逻辑不会再被错误的状态拦截,点击时会正常执行验证流程。
这样修改后,点击退出按钮再回到Login窗体,登录功能就能正常工作啦!
备注:内容来源于stack exchange,提问作者DanyOS




