2010-12-19 17 views
5

Tengo un formulario con una vista de árbol en un lado. Dependiendo de qué nodo esté seleccionado, quiero mostrar diferentes contenidos a la derecha. Para mantener el código y los controles manejables, mi plan era aislar el contenido en formularios separados y mostrar el formulario dentro de un panel.Parent un formulario para un panel

En mi TreeView caso AfterSelect, he intentado crear instancias de la forma, y ​​el establecimiento de su padre a un panel, pero puedo obtener una excepción "control de nivel superior no se puede añadir a un control.":

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

Este no es una configuración de MDI, pero traté de establecer los formularios de la propiedad MdiParent en el formulario principal y luego establecer la propiedad Parent del formulario en el panel, pero obtengo una excepción "El formulario que se especificó como el MdiParent para este formulario no es un MdiContainer . Nombre del parámetro: valor ":

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

No puedo establecer el formulario como contenedor de MDI porque no es un formulario de nivel superior, en realidad es un formulario que está acoplado dentro de un formulario principal (utilizando la biblioteca de acoplamiento de WeifenLuo).

¿Hay alguna forma de organizar un formulario en un panel en un marco sin MDI?

+0

¡Se ha modificado para usar UserControls en su lugar! – Jeremy

+0

OK, ¿eso resolvió los problemas? –

+0

@Henk - Sí. los controles del usuario eran la forma correcta de hacerlo, Formularios era un enfoque equivocado, debería haberlo visto desde el principio. – Jeremy

Respuesta

3

Será mejor que cree cada panel como UserControl. Estas son como formas, pero sin los elementos de la ventana.

3

y mostrar el formulario dentro de un panel

No, no hacemos eso. Use UserControls en lugar de formularios. Crear/diseñar un UserControl funciona igual que un Formulario y resolverá todos sus problemas (aquí).

1

Establezca frmShow.TopLevel = false si aún desea utilizar un formulario en lugar de un UserControl por alguna razón.

18

Solo para el registro, esto es posible. Puede convertir un formulario en un control secundario estableciendo su propiedad TopLevel en falso. De esta forma:

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); 
    } 

Un control de usuario tiene una sobrecarga.

+3

Gracias por publicar esto - Estoy de acuerdo en que la op debe utilizar UserControls en lugar de Formularios, pero tengo un caso completamente diferente donde NECESITO establecer el padre de un Formulario y esta pequeña pepita es lo que salvó el día. – Tim

+0

He descubierto que usar esta técnica significa que su orden de tabulación está mal. Usted tabula de principal a incrustado y luego nunca se va. La solución es usar un UserControl y la orden de tabulación funciona correctamente. –

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); 
} 
+0

¡Bienvenido a stackoverflow! Proporcione una breve descripción del código anterior para mejorar la precisión de la publicación :) –

Cuestiones relacionadas