将表单添加到面板

我有一个树形视图的一面。 根据选择的节点,我想在右侧显示不同的内容。 为了使代码和控件易于管理,我的计划是将内容分离为单独的表单,并在面板中显示表单。

在我的TreeView AfterSelect事件中,我尝试实例化表单,并将它的父设置为面板,但我得到一个exception“顶级控件无法添加到控件。”:

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

这不是MDI配置,但我尝试将表单MdiParent属性设置为父表单,然后将表单的Parent属性设置为面板但我得到一个exception“指定为此表单的MdiParent的表单不是MdiContainer。参数名称:value“:

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

我不能将表单设置为MDI容器,因为它不是顶级表单,它实际上是一个停靠在父表单内的表单(使用WeifenLuo停靠库)。

是否有某种方法可以在非MDI框架中的窗体中表示窗体?

最好将每个面板创建为UserControl 。 这些就像表格一样,但没有窗口元素。

只是为了记录,这是可能的。 您可以通过将其TopLevel属性设置为false将Form转换为子控件。 像这样:

  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); } 

用户控件的开销较小。

并在面板内显示表单

不,不要那样做。 使用UserControls而不是Forms。 创建/设计UserControl就像一个Form一样,它将解决你所有的问题(这里)。

 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); } 

如果由于某种原因仍想使用表单而不是UserControl,请设置frmShow.TopLevel = false