如果它曾经出现,如何关闭我的项目中的特定表单

How to close a specific form in my project if it's once appeared

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

 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 并保持其当前状态,一旦用户登录系统,登录表单 将关闭而不是隐藏 ..问候

通过添加 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;
        }
    }

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

在项目的主要功能中显示您的登录表单,然后在登录表单中检查用户,然后将 DialogResult 设置为确定并关闭登录表单。如果登录表单 returns 并且 DialogResult 正常显示主表单。

static void Main()
{
    var frm = new frmLogin().ShowDialog();

    if (frm == DialogResult.OK)
        Application.Run(new frmMain());
}

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

如果你想要注销功能,你可以再次显示登录表单并再次使用DialogResult。在您的主窗体中使用此函数:

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();
    }
}

如果您不想在 LoginFrm_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(); } 
        }

    }