首页 > 解决方案 > 如何在 C# 中控制从最后一个表单打开另一个表单的表单?

问题描述

我正在编写一个代码,当用户单击一个按钮时,会弹出一个子表单并且用户输入信息。当子窗体出现时,父窗体被最小化。我希望在用户单击 x 按钮时返回父表单。我试图在 childform_FormClosed 事件中将 FormWindowState 属性设置回正常,但是子窗体在父窗体继续最小化时关闭。我正在使用 VS 社区 2019;我看到有人能够通过设计选项卡中的属性窗口访问表单关闭事件属性,但是我在我的 VS 版本中找不到它,所以我写了这段代码。我尝试了以下:

以儿童形式:

private void ChildForm_FormClosed(object sender, FormClosingEventArgs e)
{
    ParentForm frm = (ParentForm)Application.OpenForms["ParentForm"];// find open form
    frm.WindowState = FormWindowState.Normal;
}

标签: c#formsvisual-studioformclosing

解决方案


要获得干净的设计,您应该使用表单创建者模式并传递源表单,例如:

父窗体.cs

WindowState = FormWindowState.Minimized;
ChildForm.Create(this).ShowDialog();

ChildForm.cs

static public ChildForm Create(Form sender)
{
  ChildForm form = new ChildForm();
  form.Sender = sender;
  return form;
}

private Form Sender;

private void ChildForm_FormClosed(object sender, FormClosingEventArgs e)
{
    if (Sender != null)
      Sender.WindowState = FormWindowState.Normal;
}

如果需要,您还可以封装更多:

父窗体.cs

ChildForm.Run(this);

ChildForm.cs

static public void Run(Form sender, bool isDialog)
{
  if (sender != null)
    sender.WindowState = FormWindowState.Minimized;
  ChildForm form = new ChildForm();
  form.Sender = sender;
  if ( isDialog )
    form.ShowDialog();
  else
    form.Show();
}

private Form Sender;

private void ChildForm_FormClosed(object sender, FormClosingEventArgs e)
{
    if (Sender != null)
      Sender.WindowState = FormWindowState.Normal;
}

推荐阅读