将表单添加到面板

时间:2010-12-19 21:17:26

标签: c# .net winforms

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

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

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

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

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

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

是否有某种方法可以在非MDI框架中为表单创建表单?

5 个答案:

答案 0 :(得分:20)

仅供记录,这是可能的。您可以通过将其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);
    }

用户控件的开销较小。

答案 1 :(得分:3)

  

并在面板中显示表单

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

答案 2 :(得分:3)

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

答案 3 :(得分: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);
}

答案 4 :(得分:1)

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