我有一面树形视图。根据选择的节点,我想在右侧显示不同的内容。为了使代码和控件易于管理,我的计划是将内容分离为单独的表单,并在面板中显示表单。
在我的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框架中为表单创建表单?
答案 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
。