我目前正在使用表单和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");
}
}
它不会给出任何错误,但也不会再次排列子表单。我也尝试用其他参数调用该方法。
我知道如何才能使这项工作成功吗?
答案 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,否则,封闭的子窗体仍然包含在布局平铺中。