Pregunta

¿Hay una manera de deshabilitar una pestaña en un TabControl ?

Estoy usando C #.

¿Fue útil?

Solución

La TabPage class oculta la propiedad Enabled. Eso fue intencional ya que hay un problema de diseño de interfaz de usuario incómodo. El problema básico es que deshabilitar la página no deshabilita también la pestaña. Y si intenta evitarlo mediante la desactivación de la pestaña con el evento de selección, no funcionará cuando TabControl solo tenga una página.

Si estos problemas de usabilidad no le preocupan, tenga en cuenta que la propiedad aún funciona, simplemente está oculta a IntelliSense. Si el FUD es incómodo, simplemente puede hacer esto:

public static void EnableTab(TabPage page, bool enable) {
    foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}

Otros consejos

Convierta su TabPage en un control, luego establezca la propiedad Enabled en falso.

((Control)this.tabPage).Enabled = false;

Por lo tanto, el encabezado de la página de la pestaña aún estará habilitado, pero su contenido estará deshabilitado.

Puedes usar simplemente:

tabPage.Enabled = false;

Esta propiedad no se muestra, pero funciona sin problemas.

Puede programar el evento de selección en TabControler para hacer que sea imposible cambiar a una pestaña no editable:

private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPageIndex < 0) return;
    e.Cancel = !e.TabPage.Enabled;
}

Puede registrar " Seleccionando " evento y cancelar la navegación a la página de la pestaña:

private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPage == tabPage2)
        e.Cancel = true;
}

¡Otra idea es poner todos los controles en la página de pestañas en un control de Panel y deshabilitar el panel! Smiley

También puede eliminar la página de la pestaña de la colección tabControl1.TabPages. Eso ocultaría la página de la pestaña.

Los créditos van a littleguru @ Canal 9 .

Es de suponer que desea ver la pestaña en el control de pestaña, pero desea que esté " deshabilitado " (es decir, en gris y no seleccionable). No hay soporte incorporado para esto, pero puede anular el mecanismo de dibujo para dar el efecto deseado.

Un ejemplo de cómo hacer esto es proporcionado aquí .

La magia está en este fragmento de la fuente presentada y en el método DisableTab_DrawItem:

this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );

Ampliando la respuesta de Cédric Guillemette, después de que deshabilites el Control :

((Control)this.tabPage).Enabled = false;

... luego puedes manejar el evento TabControl del Selecting como:

private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
    e.Cancel = !((Control)e.TabPage).Enabled;
}

Esto eliminará la página de la pestaña, pero deberá volver a agregarla cuando la necesite:

tabControl1.Controls.Remove(tabPage2);

Si lo va a necesitar más adelante, es posible que desee almacenarlo en una pestaña temporal antes de eliminarlo y luego volver a agregarlo cuando sea necesario.

La única forma es capturar el evento Selecting e impedir que se active una pestaña.

Tuve que manejar esto hace un tiempo. Quité la pestaña de la colección TabPages (creo que eso es todo) y la volví a agregar cuando las condiciones cambiaron. Pero eso fue solo en Winforms donde podía mantener la cuenta hasta que la volviera a necesitar.

Puedes hacerlo a través de las pestañas: tabPage1.Hide (), tabPage2.Show () etc.

tabControl.TabPages.Remove (tabPage1);

La forma más complicada es hacer que su padre sea igual a nulo (solo la pestaña sin el padre):

 tabPage.Parent = null;

Y cuando quiera devolverlo (lo devolverá al final de la colección de páginas):

tabPage.Parent = tabControl;

Y si desea devolverlo en una ubicación específica entre las páginas que puede usar:

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);

He eliminado páginas de pestañas en el pasado para evitar que el usuario haga clic en ellas. Aunque probablemente esta no sea la mejor solución porque es posible que necesiten ver que la página de la pestaña existe.

Usando eventos, y las propiedades del control de pestañas, puede habilitar / deshabilitar lo que quiera cuando quiera. Utilicé un bool que está disponible para todos los métodos en la clase de formulario hijo mdi donde se usa el control de tabla.

Recuerde que el evento de selección se activa cada vez que se hace clic en cualquier pestaña. Para un gran número de pestañas, un " CASO " podría ser más fácil de usar que un montón de ifs.

public partial class Form2 : Form
    {
        bool formComplete = false;

        public Form2()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)
        {


            formComplete = true;
            tabControl1.SelectTab(1);

        }

        private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (tabControl1.SelectedTab == tabControl1.TabPages[1])
            {

                tabControl1.Enabled = false;

                if (formComplete)
                {
                    MessageBox.Show("You will be taken to next tab");
                    tabControl1.SelectTab(1);

                }
                else
                {
                    MessageBox.Show("Try completing form first");
                    tabControl1.SelectTab(0);
                }
                tabControl1.Enabled = true;
            }
        }
    }

He resuelto este problema de esta manera: Tengo 3 pestañas y quiero mantener al usuario en la primera pestaña si él no inició sesión, así que en el SelectingEvent de TabControl escribí

if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }

El usuario no puede hacer clic en las pestañas para navegar, pero puede usar los dos botones ( Siguiente y Atrás ). El usuario no puede continuar con el siguiente si no se cumplen las // condiciones.

private int currentTab = 0;

private void frmOneTimeEntry_Load(object sender, EventArgs e)
{
    tabMenu.Selecting += new TabControlCancelEventHandler(tabMenu_Selecting);
}

private void tabMenu_Selecting(object sender, TabControlCancelEventArgs e)
{
    tabMenu.SelectTab(currentTab);
}

private void btnNextStep_Click(object sender, EventArgs e)
{
    switch(tabMenu.SelectedIndex)
    {
        case 0:
            //if conditions met GoTo
        case 2:
            //if conditions met GoTo
        case n:
            //if conditions met GoTo
    {
    CanLeaveTab:
    currentTab++;
    tabMenu.SelectTab(tabMenu.SelectedIndex + 1);
    if (tabMenu.SelectedIndex == 3)
        btnNextStep.Enabled = false;
    if (btnBackStep.Enabled == false)
        btnBackStep.Enabled = true;

    CannotLeaveTab:
        ;
}

private void btnBackStep_Click(object sender, EventArgs e)
{
    currentTab--;
    tabMenu.SelectTab(tabMenu.SelectedIndex - 1);
    if (tabMenu.SelectedIndex == 0)
        btnBackStep.Enabled = false;
    if (btnNextStep.Enabled == false)
        btnNextStep.Enabled = true;
}

respuesta de rfnodulator para Vb.Net:

Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
        e.Cancel = Not e.TabPage.Enabled
End Sub

Suponga que tiene estos controles:

TabControl con el nombre tcExemple.

TabPages con los nombres tpEx1 y tpEx2.

Inténtalo:

Establezca DrawMode de su TabPage en OwnerDrawFixed; Después de InitializeComponent (), asegúrese de que tpEx2 no esté habilitado agregando este código:

((Control)tcExemple.TabPages["tpEx2").Enabled = false;

Agregue a la selección tcExemple el código a continuación:

private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e)
    {
        if (!((Control)e.TabPage).Enabled)
        {
            e.Cancel = true;
        }
    }

Adjunte al evento DrawItem de tcEximple este código:

private void tcExemple_DrawItem(object sender, DrawItemEventArgs e)
    {
        TabPage page = tcExemple.TabPages[e.Index];
        if (!((Control)page).Enabled)
        {
            using (SolidBrush brush = new SolidBrush(SystemColors.GrayText))
            {
                e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds);
            }
        }
        else
        {
            using (SolidBrush brush = new SolidBrush(page.ForeColor))
            {
                e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds);
            }
        }
    }

Hará que la segunda pestaña no se pueda hacer clic.

La solución es muy simple.

Eliminar / comentar esta línea

this.tabControl.Controls.Add(this.YourTabName);

en el método IntializeComponent () en MainForm.cs

No pude encontrar una respuesta adecuada a la pregunta. Parece que no hay solución para deshabilitar la pestaña específica. Lo que hice fue pasar la pestaña específica a una variable y en el evento SelectedIndexChanged volver a poner a SelectedIndex :

//variable for your specific tab 
int _TAB = 0;

//here you specify your tab that you want to expose
_TAB = 1;
tabHolder.SelectedIndex = _TAB;

private void tabHolder_SelectedIndexChanged(object sender, EventArgs e)
{
    if (_TAB != 0) tabHolder.SelectedIndex = _TAB;
}

Por lo tanto, en realidad no deshabilitas la pestaña, pero cuando se hace clic en otra pestaña, siempre regresa a la pestaña seleccionada.

En el evento de carga de formulario, si escribimos this.tabpage.PageEnabled = false , la página de la pestaña se desactivará.

Uso:

 tabControl1.TabPages[1].Enabled = false;

Al escribir este código, la página de la pestaña no se deshabilitará por completo (no se podrá seleccionar), pero su contenido interno se deshabilitará, lo que creo que satisface sus necesidades.

MyTabControl.SelectedTab.Enabled = false;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top