关闭子表单时从父表单更改LayoutMdi

时间:2014-09-24 20:38:35

标签: c# winforms mdi

我目前正在使用表单和mdi。在我的项目中有一个mainform(一个mdiContainer),它可以有x个子表单。我想达到,每次关闭一个子窗体,所有其他子窗体再次排列。

你可以把它写进主体:

public void resetToolStripMenuItem_Click(object sender, EventArgs e)
{
  this.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical);
}

在子表单中,我这样做:

private void subform_FormClosed(object sender, FormClosedEventArgs e)
{
  try
  {
    Form1 mainform = new Form1();
    mainform.resetToolStripMenuItem_Click(mainform, EventArgs.Empty);
  }
  catch
  {
    System.Windows.Forms.MessageBox.Show("error");
  }
}

它不会给出任何错误,但也不会再次排列子表单。我也尝试用其他参数调用该方法。

我知道如何才能使这项工作成功吗?

1 个答案:

答案 0 :(得分:1)

此行应该让你暂停:

Form1 mainform = new Form1();

您制作了一个新表单,因此您没有引用现有表单。

但我认为从儿童表格中尝试这样做会有问题。

从MDIParent听取孩子的Closed事件可能更好,如下所示:

ChildForm childForm = new ChildForm();
childForm.FormClosed += childForm_FormClosed;
childForm.MdiParent = this;
childForm.Show();

然后在Closed方法中,调用代码:

void childForm_FormClosed(object sender, FormClosedEventArgs e) {
  this.BeginInvoke(new Action(() => { 
    resetToolStripMenuItem_Click(null, null);
  }));
}

我使用了BeginInvoke,否则,封闭的子窗体仍然包含在布局平铺中。