2014-09-24 116 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