Desde las versiones antiguas de Visual Studio, me he encontrado con un pequeño problema a la hora de trabajar con el TabControl: Ocultar / Mostrar las TabPages.
Pese a que el control TabControl, presenta una propiedad “TabPageCollection” que alberga todas las TabPages del Control, y a su vez cada TabPage tienen unos métodos Hide y Show, su funcionamiento no es el que “yo” desearía. Me explico:
- Si yo llamo al método Hide de un TabPage, me gustaría que este TabPage no fuera visible de cara al usuario.
¿Qué sucede cuando llamo al método Hide?: Puesto que el objeto TabPage, herede del control Panel, el método Hide, se encarga de ocultar el panel que se muestra en el control TabControl y todo su contenido, pero no la cabecera de la “pestaña”.
Del mismo modo el método Show() lo que va a realizar es mostrar su contenido.
Por ello, he creado un control de Usuario para implementar los métodos HideTabPage y ShowTabPage.
Para poder realizar estos métodos he creado una lista privada para manejar las “TabPages”:
List<TabPage> AllTabPages;
Para su correcto funcionamiento, en el Constructor de la Clase, inicializo la lista:
AllTabPages = new List<TabPage>();
Y ya se puede implementar la funcionalidad:
public void HideTabPage(TabPage tb)
{
if (TabPages.Contains(tb))
{
foreach (TabPage t in TabPages)
{
if (!AllTabPages.Contains(t))
AllTabPages.Add(t);
}
this.TabPages.Remove(tb);
}
}
public void ShowTabPage(TabPage tb)
{
if ((AllTabPages.Contains(tb)) && (!TabPages.Contains(tb)))
this.TabPages.Add(tb);
}
Para su utilización bastaría con hacer una llamada de la siguiente manera:
extTabControl1.HideTabPage(TabPage1);
o
extTabControl1.ShowTabPage(TabPage1);
Además de Ocultar y Mostrar un TabPage, he generado la posibilidad de Habilitar / Deshabilitar TabPages y que el control no entre en TabPages Deshabilitadas. Para lograrlo he sobrescrito el método Selecting del control:
protected override void OnSelecting(TabControlCancelEventArgs e)
{
if (e.TabPageIndex > -1)
{
TabPage tb = TabPages[e.TabPageIndex];
if (tb.Enabled == false)
e.Cancel = true;
else
base.OnSelecting(e);
}
}
Os dejo el enlace a CodePlex donde lo he publicado.
Si tenéis cualquier duda, aquí estoy.
Saludos