2010-12-19 69 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