C# 将窗体设置为面板的父级

C# 将窗体设置为面板的父级,c#,.net,winforms,C#,.net,Winforms,我有一张单面有树状视图的表格。根据选择的节点,我希望在右侧显示不同的内容。为了保持代码和控件的可管理性,我的计划是将内容隔离为单独的表单,并将表单显示在面板中 在我的TreeView AfterSelect事件中,我尝试实例化表单,并将其父级设置为面板,但出现异常“无法将顶级控件添加到控件”: 这不是MDI配置,但我尝试将forms MdiParent属性设置为父窗体,然后将窗体的父属性设置为面板,但出现异常“指定为此窗体的MdiParent的窗体不是MdiContainer。参数名称:valu

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

在我的TreeView AfterSelect事件中,我尝试实例化表单,并将其父级设置为面板,但出现异常“无法将顶级控件添加到控件”:

这不是MDI配置,但我尝试将forms MdiParent属性设置为父窗体,然后将窗体的父属性设置为面板,但出现异常“指定为此窗体的MdiParent的窗体不是MdiContainer。参数名称:value”:

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

在非MDI框架中,是否有办法在面板中设置窗体的父级

并在面板中显示窗体


不,不要那样做。使用用户控件而不是表单。创建/设计一个用户控件就像一个表单,它将解决您的所有问题(此处)。

您最好将每个面板创建为一个
用户控件。这些与表单类似,但没有窗口元素。

如果出于某种原因仍要使用表单而不是用户控件,则可以设置
frmShow.TopLevel=false。

仅用于记录。通过将窗体的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);
    }

用户控件的开销较小。

改为使用用户控件!好的,这解决了问题吗?@Henk-是的。用户控件是正确的方法,表单是错误的方法,我应该从一开始就看到这一点。@Jeremy你是如何将dockpanel添加到用户控件中的?我正在尝试这样做,当我将表单添加到dockpanel时,会出现以下错误:“父表单无效。当使用DockingMdi或SystemMdi文档样式时,dockpanel控件必须是主MDI容器表单的子控件。”。这似乎是正确的,因为我们不能将UserControl设置为MDI容器。你能给我一个提示吗?@OlaruMircea我也有同样的例外,并将DockPanel的属性“DocumentStyle”设置为“DockingWindow”。谢谢你发布这篇文章-我同意op应该使用用户控件而不是表单,但我有一个完全不同的情况,我确实需要设置表单的父项,而这个小金块就是拯救了这一天!我发现使用这种技术意味着你的标签顺序混乱。您可以从父选项卡切换到嵌入式选项卡,然后它将永远不会离开。解决方案是使用UserControl,并且tab order可以正常工作。欢迎使用stackoverflow!请提供上述代码的简短说明,以提高帖子的准确性:)
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);
}
    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);
    }
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);
}