将表单添加到面板

Jer*_*emy 6 .net c# winforms

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

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

Form frmShow = new MyForm();
frmShow.Parent = this.pnlHost;
Run Code Online (Sandbox Code Playgroud)

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

Form frmShow = new MyForm();
frmShow.MdiParent = this;
frmShow.Parent = this.pnlConfigure;
Run Code Online (Sandbox Code Playgroud)

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

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

Han*_*ant 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);
    }
Run Code Online (Sandbox Code Playgroud)

用户控件的开销较小.

  • 感谢发布这个 - 我同意op应该使用UserControls而不是Forms,但我有一个完全不同的情况,我需要设置一个Form的父级,这个小块是节省了一天! (3认同)

zsa*_*ank 4

您最好将每个面板创建为UserControl. 它们就像表单一样,但没有窗口元素。