如何关闭使用 ShowDialog() 打开另一个窗体的窗体

How to close a form that opened another form using ShowDialog()

所以我有这个 frmUser 但要关闭它我必须调用 frmPass (我使用 ShowDialog() 而不是 Show() 调用)它将首先确认是否用户是管理员,但问题是当我执行下面的代码时

frmUser us = new frmUser(lblEID.Text, lblAdmin.Text, lblType.Text);
us.Hide();
this.Hide();

frmPass只隐藏自己,不与frmUser一起隐藏。这也是我从 frmUser

调用 frmPass 的代码
frmPass pass = new frmPass(lblAID.Text, lblName.Text, lblType.Text, "User Module");
pass.ShowDialog();

在您的密码表单中,您应该设置该表单的 DialogResult 属性。例如;在您的 frmPass 上,当用户单击“确定”按钮时,您的代码会检查用户名和密码是否有效。如果一切正常,将对话框结果设置为 OK,如下所示:

private void btnOk_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.Ok;
}

这将关闭表格。 在 frmUser 中,如果需要,您可以检查什么是 frmPass 形式的 DialogResult,如下所示:

frmPass pass = new frmPass(lblAID.Text, lblName.Text, lblType.Text, "User Module");
DialogResult dr = pass.ShowDialog();

if (dr == DialogResult.Ok)
{
    //do code if form is closed with OK dialog result
}
else
{
    // some warning to user...
}

问题是您试图隐藏 frmUser 的错误实例。我假设第一段代码在 class frmPass 内。在那里你创建了一个你试图隐藏的新实例。但是您想隐藏原始实例。

正如 Nino 已经建议的那样,我也建议使用 DialogResult 检查管理员是否已确认。但可能你已经有了不同的机制。尽管如此,您需要在调用 pass.ShowDialog();

之后将隐藏代码行放入 class frmUser
private void button1_Click(object sender, EventArgs e)
{
    formPass pass = new formPass();
    pass.ShowDialog();

    if(AdminIsConfirmed)
    {
         this.Hide();
    }
}

将另一个 this.Hide() 留在 frmPass 中以关闭它。

编辑

另一种可能性是将 frmUser 实例传递给 frmPass 的构造函数,并在 frmPass 中有一个 frmUser 类型的变量。你只需要重载它:

public partial class formPass : Form
{
    formUser us;
    public formPass(/* all that stuff that you have plus*/, formUser us)
    {
        InitializeComponent();

        this.us = us;
    }

现在像这样打电话给 frmPass:

frmPass pass = new frmPass(lblAID.Text, lblName.Text, lblType.Text, "User Module", this);

现在您只需删除以下行:

frmUser us = new frmUser(lblEID.Text, lblAdmin.Text, lblType.Text);

并且整个事情都会正常工作并正确隐藏。