2014-09-24 99 views
0

我目前正在使用窗体和mdi。在我的项目中有一个mainform(一个mdiContainer),它可以有x个子表单。我想要达到的目的是,每次都关闭子窗体,再次安排所有其他子窗体。关闭子窗体时从父窗体更改LayoutMdi

你可以做到这一点写入到的MainForm这样的:

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

您每次关闭子窗体时都会启动一个新的主窗体。尝试删除该行。每当孩子关门时,不需要重新初始化mdi父母。 – tinstaafl 2014-09-24 21:06:26

回答

1

这一行应该暂停:

Form1 mainform = new Form1(); 

你犯了一个新的形式,这样你就不会引用现有的一个。

但我认为有问题试图从儿童形式做到这一点。

它可能更好地倾听孩子的距离的MdiParent Closed事件,像这样:

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

然后在封闭的方法,调用代码:

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

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

+0

无法做到这一点,childForm.FormClosed + = childForm_FormClosed和this.BeginInvoke ..给我的错误:不存在于这种情况下... – user3616874 2014-09-24 21:20:00

+0

@ user3616874看不到你做了什么,但所有这些代码是在MDI家长。 – LarsTech 2014-09-24 21:20:55

+0

哦,好的。我纠正了我的项目。但是,它仍然无能为力。它只是运行没有错误。 – user3616874 2014-09-24 21:35:36