How to: Cómo insertar un WinForm dentro de un control TabPanel

:-)
Hoy he visto en el foro de VB una duda que planteaba Tito, acerca de la posibilidad de usar un entorno de formularios hijos dentro de un TabPanel (al estilo del editor de Visual Studio). No es la primera vez que veo esta duda, así que le he dedicado un ratillo y aquí publico una posible solución.

FormInTabPanel 

De este modo podemos tener un formulario que actúa como contenedor de otros, pero sin utilizar MDI (que por otra parte me parece ya bastante pasado de moda :-P). La técnica a usar muy sencilla y lo único que hacemos es cada vez que creamos un form, creamos también un objeto TabPage e insertamos el formulario dentro de la nueva pestaña. La única cosa que tenemos que tener en cuenta es establecer la propiedad TopLevel del nuevo formulario 'hijo' a False, ya que de otro modo recibiremos un error.

Una muestra:

Private Sub ShowForm()
    Dim r As New Random()
    Static i As Integer
    i += 1
    Dim key As String = "f" + i.ToString()
    'Crea el nuevo form (copia de form2)
    Dim f As New Form2
    f.BackColor = Color.FromArgb(r.Next(0, 255), r.Next(0, 255), r.Next(0, 255))
    f.Text = String.Format("Nuevo form {0}", i)
    'Crea el tab que lo contiene
    Me.Tabs.TabPages.Add(key, f.Text)
    f.TopLevel = False
    f.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    f.Dock = DockStyle.Fill
    Me.Tabs.TabPages(key).Controls.Add(f)
    Me.Tabs.SelectedTab = Me.Tabs.TabPages(key)
    'Asigna el nuevo form al tag del tabpage
    Me.Tabs.TabPages(key).Tag = f
    'Por si desde el propio form quieres cerrar y eliminar el tab
    f.Tag = Me.Tabs.TabPages(key)
    f.Show()
End Sub

Podeis descargar el proyecto de ejemplo desde:

Y para los que siempre me tiráis los puntosycoma en cara, lo he realizado en VB (eh Jorge? :-D).
Un saludo desde Andorra!

** Modificación (02/07/2008) para agregar un menú contextual a las pestañas **

A petición de Carlos. De este modo es puede cerrar la pestaña actual o todas las pestañas menos la que estamos viendo ahora. El menú es un objeto ContextMenuStrip, de modo que es totalmente extensible para agregar vuestra propia funcionalidad.

FormInTabPanel_Menu

La nueva versión está disponible en:

Saludos,

Published 1/7/2008 13:10 por Lluis Franco
Archivado en: ,,,,
Comparte este post:

Comentarios

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Tuesday, July 01, 2008 8:49 PM por Carlos

Hola señor muy interesante el post :D

una consulta como se haria para que aparecira la opcion de cerrar cada pestaña digamos al darle clic secundario a cada una de las pestañas activas, que apareciera la opcion de cerrar dicha pestaña .. :S espero me hallan entendido..

:)

Gracias ... :D

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Wednesday, July 02, 2008 1:49 AM por Jose Fabricio Rojas

Buen Post¡¡¡

Felicitaciones , saludos desde Perú

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Wednesday, July 02, 2008 10:37 AM por Lluis Franco

:-)

Gracias Jose,

Carlos: He modificado el código para que muestre un menú con un par de opciones, y de este modo puedan cerrarse las pestañas.

Saludos,

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Wednesday, July 02, 2008 10:50 AM por La Evas

Juer Primi, justo necesitaba estoooooo :))))))))))))))))))))))))

Gracias mil

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Wednesday, July 02, 2008 10:53 AM por Lluis Franco

:-)

Caray que casualidad!!!

Bueno, para esto están los primos, no? :-D

Un abrazo,

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Wednesday, July 02, 2008 3:27 PM por Carlos

Hola Señor Lluis :D gracias por responder tan rapido  y sobre todo el haber aceptado mi solicitud... :$ :$ :D  (^^,

Nuevamente reitero las Gracias :D

Nota: Tengo en cuenta que esto no es un foro, pero si me ayudo bastante :D disculpas por las molestias... :D

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Thursday, September 25, 2008 1:26 PM por Alfonso

Muchas gracias por tu información. Nos ha servido de gran ayuda. Espeso que esto te sirva para seguir ayudando al resto de las personas

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Monday, December 01, 2008 4:43 PM por LUIS

SOY NUEVO EN ESTO, ME HA SERVIDO MUCHO LO QUE HAN PUESTO, PERO LO QUE NO HE CONSEGUIDO PONER ES UN BOTON(CERRAR) AL ESTILO EXPLORER O FIREFOX, NO ESTOY HACIENDO UN NAVEGADOR, SOLO LO QUIERO PARA UN PROGRAMA DE LA ESCUELA. SABEN COMO SE HACE? ME SERIA DE GRAN AYUDA!

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Friday, December 19, 2008 7:56 PM por Luis A.

Que buen post, esto me ha ayudado un monton, es justo lo que estaba intentando hacer.

muchas felicitaciones :-D

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Thursday, December 10, 2009 8:44 PM por Guillermo desde Colombia

Muy bueno, excelente, primer vez que me funciona lago tambien.

felicidades

Bye

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Sunday, December 27, 2009 7:20 PM por Alfonso

Muchas gracias. Me ha sido de gran utilidad.

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Tuesday, February 23, 2010 3:35 AM por Zzombi

gracias me sirvio de mucho

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Saturday, February 27, 2010 4:44 PM por kenyiro9

Y como seria el codigo en VB .NET 2008 lo pregunto porque el codigo que das no me corre, si pudieras responderme te lo agradesco.

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Sunday, February 28, 2010 4:00 PM por Sur07

Hola, muy buen ejemplo, pero podrias subir el codigo para Visual Basic 2005, porque creo que esta para Visual Basic 2008, porquie no puedo ejecutarlo.

Gracias

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Monday, March 08, 2010 6:50 PM por Sergi

Muy bueno el programa, felicidades

# re: How to: Cómo insertar un WinForm dentro de un control TabPanel

Thursday, April 15, 2010 10:48 AM por YETO

MUY BUEN POST MEN TE PASASTE