2010-12-19 109 views
5

我有一個窗體在一邊的樹形視圖。根據選擇的節點,我想在右側顯示不同的內容。爲了保持代碼和控件的可管理性,我的計劃是將內容分離爲單獨的表單,並在面板中顯示錶單。父窗體到面板

在我的TreeView AfterSelect事件,我試圖實例的形式,並設置它的母公司在面板上,但我得到一個異常「頂級控件不能被添加到一個控制」:

Form frmShow = new MyForm(); 
frmShow.Parent = this.pnlHost; 

這不是MDI配置,但我嘗試將窗體MdiParent屬性設置爲父窗體,然後將窗體的Parent屬性設置爲面板,但我得到一個異常「爲此窗體指定爲MdiParent的窗體不是MdiContainer參數名稱:值「:

Form frmShow = new MyForm(); 
frmShow.MdiParent = this; 
frmShow.Parent = this.pnlConfigure; 

我不能將窗體設置爲MDI容器,因爲它不是頂層窗體,它實際上是一個停靠在父窗體內部的窗體(使用WeifenLuo對接庫)。

是否有某種方式在非MDI框架中的面板中父窗體?

+0

改爲使用UserControls! – Jeremy 2010-12-19 21:22:53

+0

好的,是否解決了問題? – 2010-12-19 21:25:38

+0

@亨克 - 是的。用戶控件是正確的選擇,Forms是一種被誤導的方法,我應該從一開始就看到。 – Jeremy 2010-12-19 23:52:34

回答

3

您最好將每個面板創建爲UserControl。這些就像窗體一樣,但沒有窗口元素。

3

和顯示面板

沒有內部的形式,不這樣做。使用UserControls而不是Forms。創建/設計一個UserControl就像一個Form一樣,它會解決你所有的問題(這裏)。

1

設置爲frmShow.TopLevel = false如果您仍然想使用窗體而不是UserControl出於某種原因。

18

只是爲了記錄,這是可能的。您可以通過將其TopLevel屬性設置爲false來將表單轉換爲子控件。像這樣:

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { 
     switch (e.Node.Name) { 
      case "Node0": embedForm(new Form2()); break; 
      // etc.. 
     } 
    } 
    private void embedForm(Form frm) { 
     // Remove any existing form 
     while (panel1.Controls.Count > 0) panel1.Controls[0].Dispose(); 
     // Embed new one 
     frm.TopLevel = false; 
     frm.FormBorderStyle = FormBorderStyle.None; 
     frm.Dock = DockStyle.Fill; 
     frm.Visible = true; 
     panel1.Controls.Add(frm); 
    } 

用戶控件的開銷較少。

+3

感謝張貼這個 - 我同意操作應該利用UserControls而不是形式,但我有一個完全不同的情況下,我需要設置一個窗體的父母,這個小塊是什麼保存了一天! – Tim 2011-08-04 14:18:03

+0

我發現使用這種技術意味着你的標籤順序已經搞亂了。你從父母選項卡嵌入,然後它永遠不會離開。解決方案是使用UserControl並且Tab鍵順序正常工作。 – 2016-12-01 16:23:26

2
private void toolStripMenuItem1_Click(object sender, EventArgs e) 
{ 
    ucAdmin ucA = new ucAdmin(); //ucAdmin is a user control u had created. 
    ucA.Visible = true; 
    ucA.Dock = DockStyle.Fill; 

    this.pnlMain.Controls.Clear(); // pnlMain is the location u are going to display this user control. 
    this.pnlMain.Controls.Add(ucA); 
} 
+0

歡迎來到stackoverflow!請提供關於上述代碼的簡短描述以提高帖子的準確性:) – 2012-10-20 13:53:10