C#为什么form.Close()没有关闭表单?

时间:2010-10-12 08:38:09

标签: c# winforms

我有一个带有以下伪代码的按钮单击事件处理程序:

private void btnSave_Click(object sender, EventArgs e)
{
  if(txt.Text.length == 0)
     this.Close();
  else
     // Do something else

  // Some other code...
}

这只是一些简单的代码,但关键是,当文本长度等于零时,我想关闭表单。但是代码不是关闭表单而是执行部分//其他一些代码。单击事件处理程序完全执行后,表单将关闭。

我知道,当我return this.Close()之后,表格将会关闭,但我想知道为什么在你致电this.Close()时表格不会直接关闭。为什么执行事件处理程序的其余部分?

7 个答案:

答案 0 :(得分:11)

执行事件处理程序的其余部分是因为您没有离开该方法。它是如此简单。

调用this.Close()不会立即“删除”表单(以及当前事件处理程序)。如果没有对表单的更多引用,表单将在稍后由垃圾收集器收集。

this.Close()不是常规方法调用,除非方法抛出异常,否则将保留在当前方法的上下文中。

答案 1 :(得分:5)

关闭仅隐藏表单;表单仍然存在,如果再次显示,则不会再收到另一个Load事件。

要从内存中实际删除它,请使用Dispose()。

答案 2 :(得分:3)

当您执行当前方法时,答案很简单,因此this.Close()将被排队,直到您显式返回或当前的excuting方法抛出异常。

答案 3 :(得分:2)

另一种可能的解决方案是,如果您打开一个新表单并希望关闭当前表单:如果您使用newForm.ShowDialog()而不是newForm.Show(),则不会使用currentForm.Close()关闭currentForm直到newForm也关闭。

答案 4 :(得分:0)

除非Form是一个模态形式(用.ShowDialog()打开),否则Form.Close()也会处理该表单。因此,尽管其他人可能已经说过,但在此之后你无法在任何情况下重新打开它。这种行为有Form.Visible(隐藏/显示表单)。

这里的要点是.Close()不会从它被调用的部分返回,原因有几个。例如,您可以从另一个表单或类或其他任何东西调用SomeForm.Close()。

Close()只是一个与其他方法一样的方法。如果这是您想要的,则必须从调用Close()的方法显式返回。

答案 5 :(得分:0)

调用MessageBox.Show(frmMain,"消息","标题")添加形式" TextDialog"应用程序的Application.OpenForms()表单集合,与frmMain主表单本身一起。关闭Messagebox后它仍然存在。

当发生这种情况并且您调用OK按钮委托关闭主窗体时,调用frmMain.Close()将不起作用,主窗体不会消失,程序将不会终止,因为它通常会在您退出OK之后终止代表。只有Application.Exit()将关闭所有垃圾消息框" TextDialog" s。

答案 6 :(得分:0)

export type ComputeUnionValue<V extends AnyCodec[], E extends Extract<keyof V, number> = Extract<keyof V, number>> = {
  [i in E]: GetValue<V[i]>;
}[E];

如果要关闭第一个表单并打开第二个表单,请执行以下操作:

private void btnCloseForm_Click(object sender, EventArgs e)
{
FirstFrm.ActiveForm.Close();
}

或者您可以这样做:

private void btnCloseForm_Click(object sender, EventArgs e)
{
FirstFrm.ActiveForm.Close();
}

private void FirstFrm_FormClosed(object sender, FormClosedEventArgs e)
{
SecounfFrm frm = new SecounfFrm ();
frm.ShowDialog();
}