表單嵌套
經驗豐富的Visual Basic開發人員知道多重文件介面(MDI)應用程式能夠包含子表單,那些子表單由MDI父表單管理。但是如果沒有MDI的能力你怎樣實現包含嵌套表單?例如一個MDI子表單也可能需要包含另一個表單。
有時能夠使用使用者控制項(UserControl)實現這種功能,但是如果你真的需要把一個表單嵌套進另一個表單,有多種方法可以實現。表單衍生自Control類,這意味著它能被放入另一個表單的控制項集合中,使用如下的邏輯:
Dim f As New frmEmbed2() Me.Controls.Add(f) f.Show() |
但是很不幸,這段代碼將會導致一個運行時(runtime)異常(見圖1)。
圖1.試圖把一個表單添加到另一個表單的控制項集合時出現的執行階段錯誤
為了避免這種異常,該表單的TopLevel屬性必須設定為False(見下面的代碼)。
Dim f As New frmEmbed2() f.TopLevel = False Me.Controls.Add(f) f.Show() |
補助說明(C#):
在使用Visual Studio 2008 開發Windows程式的時候,需要在容器控制項中顯示一個新的Form,直接使用如下代碼出現異常無法將頂級控制項添加到控制項:
MyForm myForm = new MyForm();
container.Controls.Add(myForm);
網上查閱了相關資料,解決方案很簡單。由於Form預設為頂級控制項,所以在容器控制項中加入會出現標題所示異常。
只要在添加控制項的代碼之前將Form設定為非頂級控制項即可解決錯誤。
MyForm myForm = new MyForm();
myForm.TopLevel = false;
container.Controls.Add(myForm);
圖2顯示的是使用上面的邏輯實現的一個表單嵌入另一個表單。嵌入的表單有一個標題條(它的顏色是未啟用的系統色彩),因此該嵌入表單能在容器表單內四處拖動。在圖2中,該表單從它的開始位置(左上方)拖到了右下角。
圖2.在容器表單中有一個嵌入的表單。嵌入的表單能在容器表單中拖動。
通常在顯示嵌入的表單前先設定它的位置。這隻需要簡單的設定嵌入表單的Left和Top屬性。嵌入表單的位置與容器表單是相對的。
與MDI子表單不同,嵌入表單能覆蓋容器表單上的控制項。圖3顯示了它們的不同。
圖3.嵌入表單(左)可以覆蓋容器表單上的控制項。MDI子表單(右)不能覆蓋MDI父表單上的控制項。
在右邊的MDI例子中,沒有辦法使按鈕隱藏在子表單的後面。但是在左邊該按鈕被嵌入表單覆蓋了。
當表單第一次被嵌入時,它將顯示在容器表單上的已存在的控制項的後面。當它被點擊時,它走向前台並停留在那兒。這會打擾使用者,但是能通過插入下面的代碼防止這種情況發生:
f.BringToFront()
嵌入的表單可以包含其它的嵌入表單,沒有實際的限制。圖4顯示了一個本身包含嵌入的表單的嵌入表單。
圖4.一個包含嵌入表單的嵌入表單