You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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变量,正确处理窗体关闭和跳转的流程:

  1. 首先删除private bool isClosing = false;这个字段,因为我们不再需要它。
  2. 修改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();
        }
    }
    // 如果已经登录,直接允许窗体关闭即可,不需要额外处理
}
  1. 同时修改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

火山引擎 最新活动