Están muy de moda las pestañas en las aplicaciones. Estas nos permiten tener bastante ordenadas todas las ventanas de la aplicación con las que estemos trabajando simultáneamente.
La idea consiste en usar "Controles de Usuarios" (UserControl) en vez de formularios tradicionales y abrirlos y crearlos en tiempo de ejecución en pestañas (TabPage) de un TabControl.
Empezamos por crear un nuevo proyecto de Windows Forms y le añadimos un menú (MenuStrip) con todas las opciones que necesitemos. Añadimos un TabControl para ir abriendo las distintas pestañas y un botón para cerrarlas.
Para crear los "Controles de Usuario" haremos botón derecho sobre el proyecto, luego Agregar / Nuevo Elemento y seleccionamos "Control de Usuario".
La función que se propone para abrir las pestañas es:
01 private void nuevaPestana(UserControl uc, String titulo) 02 { 03 int indice = indicePestanaAbierta(titulo); 04 if (indice < 0) { 05 TabPage tab = new TabPage(); 06 tab.Text = titulo; 07 tab.Controls.Add(uc); 08 tabMain.TabPages.Add(tab); 09 tabMain.SelectedTab = tab; 10 } else { 11 //si ya existe vamos a limpiar el usercontrol y volverlo a cargar en la misma pestaña 12 tabMain.TabPages[indice].Controls.Clear(); 13 tabMain.TabPages[indice].Controls.Add(uc); 14 tabMain.SelectedTab = tabMain.TabPages[indice]; 15 } 16 }Con esta función controlamos también que si ya existe esa pestaña, nos la refresque en vez de abrir otra.
01 private int indicePestanaAbierta(String titulo) 02 { 03 Boolean enc = false; 04 int i = 0; 05 while ((i < tabMain.TabPages.Count) && (enc == false)) { 06 if (tabMain.TabPages[i].Text == titulo) 07 enc = true; 08 else 09 i++; 10 } 11 if (enc) 12 return i; 13 else 14 return -1; 15 }El evento del botón para cerrar las pestañas sería algo así.
01 private void btnCerrar_Click(object sender, EventArgs e) 02 { 03 int indice = tabMain.SelectedIndex; 04 if (indice > 0) { //no queremos cerrar nunca la inicial. 05 tabMain.TabPages.Remove(tabMain.SelectedTab); 06 tabMain.SelectedIndex = indice - 1; 07 GC.Collect(); 08 } 09 }El evento de cualquiera de las opciones de menú para abrir las pestañas sería:
01 private void configuracionGeneralToolStripMenuItem_Click(object sender, EventArgs e) 02 03 { 04 UCconfiguracionGeneral uc = new UCconfiguracionGeneral(); 05 nuevaPestana(uc, "Configuración"); 06 07 }El ejemplo completo, se puede descargar desde aquí.