如何关闭一个特定的窗体在我的项目,如果它曾经出现

本文关键字:项目 我的 如果 曾经 窗体 何关闭 一个 | 更新日期: 2023-09-27 18:11:20

在我的项目中,第一个表单是Login表单,当用户尝试登录系统时,它只出现一次。如果登录成功,则显示系统的主表单并隐藏登录表单,如果登录尝试失败,则用户可以再尝试一次,等等。
问题是当用户在主表单想要使用X按钮关闭程序时,登录表单FormClosing事件的消息出现,它在用户按下Yes的情况下注销,但是当用户按下NO时,程序不关闭,但它返回到隐藏的登录表单登录表单FormClosing事件的代码为:

 private void LoginFrm_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult logoutResult = MessageBox.Show("Do you want to logout?","Logout",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
            if (logoutResult == DialogResult.No)
            {
                e.Cancel = true;
            }
            else
            {
                e.Cancel = false;
            }
        }

现在相同的FormClosing事件正在发生登录表单和主表单如何使程序不做任何事情,如果用户按下NO在logout messageBox中并保持在其当前状态,一旦用户登录到系统的登录表单关闭不隐藏。关于

如何关闭一个特定的窗体在我的项目,如果它曾经出现

如果您不想在 loginfm_formclosing 上显示messageBox:

private void LoginFrm_FormClosing(object sender, FormClosingEventArgs e)
    {
        //Add this lines, your login form is hidden
        if (this.Visible == false)
        {
            return;
        }            
        DialogResult logoutResult = MessageBox.Show("Do you want to logout?","Logout",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
        if (logoutResult == DialogResult.No)
        {
            e.Cancel = true;
        }
        else
        {
            e.Cancel = false; //<- you dont need this
        }
    }

MainForm:

//Add this line
Boolean isClosed = false; //<--
private void MainFrm_FormClosing(object sender, FormClosingEventArgs e)
    {
        //Add this
        if(isClosed == true){
            return;
        }
        DialogResult res = MessageBox.Show("Do you want to exit?"); 
        if (res == DialogResult.OK) {
            try {
                SqlCommand cmd = new SqlCommand("delete from empLogin where empId=" + deleteById + "", cn);
                cmd.ExecuteNonQuery();
                //Add this line
                isClosed = true; //<--
                Application.Exit();
            }
            catch (SqlException ex) {
                MessageBox.Show(ex.Message);
            }
            finally { cn.Close(); } 
        }
    }

尝试添加base.OnFormClosing(e);在方法的顶部

private void LoginFrm_FormClosing(object sender, FormClosingEventArgs e)
    {
        base.OnFormClosing(e);
        DialogResult logoutResult = MessageBox.Show("Do you want to logout?","Logout",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
        if (logoutResult == DialogResult.No)
        {
            e.Cancel = true;
        }
        else
        {
            e.Cancel = false;
        }
    }

我有一个更好的解决方案来显示登录表单。

在项目的Main功能中显示您的登录表单,然后在登录表单中检查用户,然后将DialogResult设置为OK并关闭登录表单。如果登录表单返回,并且对话结果为OK,则显示主表单。

static void Main()
{
    var frm = new frmLogin().ShowDialog();
    if (frm == DialogResult.OK)
        Application.Run(new frmMain());
}

这样,登录表单在主表单之前关闭。

如果需要Logout功能,可以重新显示登录表单并再次使用dialgresult。在主表单中使用这个函数:

private void Logout()
{
    var frm = new frmLogin().ShowDialog();
    // if new user is not identified.
    if (frm == System.Windows.Forms.DialogResult.Cancel)
    {
        // Close the main form
        this.Close();
    }
}