2010-12-19 24 views
5

私は片面にツリービューを持つフォームを持っています。どのノードが選択されているかによって、右に別のコンテンツを表示する必要があります。コードとコントロールを管理しやすくするために、私の計画は、コンテンツを別々のフォームに分離し、フォームをパネル内に表示することでした。私のツリービュー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

+0

問題は解決しましたか? –

+0

@Henk - はい。ユーザーコントロールが正しい方法でした。フォームは誤ったアプローチでした。私はそれを最初から見ていたはずです。 – Jeremy

答えて

3

すべてのパネルをUserControlとして作成する方がよいでしょう。これらはフォームと似ていますが、ウィンドウ要素はありません。

3

とパネル

ありません内部フォームを表示するには、それをしません。フォームの代わりにUserControlsを使用します。 UserControlの作成/設計は、Formと同様に機能し、すべての問題(ここ)を解決します。

1

さらに、何らかの理由でUserControlの代わりにフォームを使用する場合は、frmShow.TopLevel = falseを設定します。

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を利用すべきであることに同意しますが、私はDIDがフォームの親を設定する必要があり、この小さなナゲットは何日保存されたのですか? – Tim

+0

私は、この技術を使用すると、あなたのタブの順序が乱れていることがわかりました。あなたは親から埋め込みにタブを移動し、その後は決して離さない。解決策は、UserControlとタブの順序を正しく使用することです。 –

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へ!投稿の正確さを向上させるために上記のコードについて簡単な説明を記してください:) –

関連する問題