如何关闭使用 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);
并且整个事情都会正常工作并正确隐藏。
所以我有这个 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();
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);
并且整个事情都会正常工作并正确隐藏。