C# 将窗体设置为面板的父级
我有一张单面有树状视图的表格。根据选择的节点,我希望在右侧显示不同的内容。为了保持代码和控件的可管理性,我的计划是将内容隔离为单独的表单,并将表单显示在面板中 在我的TreeView AfterSelect事件中,我尝试实例化表单,并将其父级设置为面板,但出现异常“无法将顶级控件添加到控件”: 这不是MDI配置,但我尝试将forms MdiParent属性设置为父窗体,然后将窗体的父属性设置为面板,但出现异常“指定为此窗体的MdiParent的窗体不是MdiContainer。参数名称:value”: 我无法将表单设置为MDI容器,因为它不是顶级表单,实际上是一个停靠在父表单内的表单(使用Weifenlo停靠库) 在非MDI框架中,是否有办法在面板中设置窗体的父级 并在面板中显示窗体C# 将窗体设置为面板的父级,c#,.net,winforms,C#,.net,Winforms,我有一张单面有树状视图的表格。根据选择的节点,我希望在右侧显示不同的内容。为了保持代码和控件的可管理性,我的计划是将内容隔离为单独的表单,并将表单显示在面板中 在我的TreeView AfterSelect事件中,我尝试实例化表单,并将其父级设置为面板,但出现异常“无法将顶级控件添加到控件”: 这不是MDI配置,但我尝试将forms MdiParent属性设置为父窗体,然后将窗体的父属性设置为面板,但出现异常“指定为此窗体的MdiParent的窗体不是MdiContainer。参数名称:valu
不,不要那样做。使用用户控件而不是表单。创建/设计一个用户控件就像一个表单,它将解决您的所有问题(此处)。您最好将每个面板创建为一个
用户控件。这些与表单类似,但没有窗口元素。如果出于某种原因仍要使用表单而不是用户控件,则可以设置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);
}