none
habilitar y desabilitar un tabpagr RRS feed

  • Pergunta

  • Hola a todos, estoy haciendo una app y utilizo las pestañas para no tener que usar más formularios, pero deceo poner enable = false a algunos para controlar el acceso a estos mientras se trabaja en uno y bajo sierras reglas, sucede que no tiene esta propiedad, sin enbargo en la ayuda dice no está diseñada para utilizarse directamente desde el código, alguien puede ayudarme.
    terça-feira, 11 de agosto de 2020 01:56

Respostas

  • Hola cl2raul66,

    Te adjunto esta documentación oficial de Microsoft que explica algunas cosas que puedes hacer para limitar el acceso a las pestañas. Efectivamente, las pestañas ocultan la propiedad Enabled y esto es por diseño, o sea, no se puede desactivar una pestaña como tal. Sin embargo, no todo está perdido, puedes imitar este comportamiento. Podrías hacer algo como lo siguiente:

    1. Agregar un TabControl con 2 páginas

    2. Establecer DrawMode en OwnerDrawFixed

    3. Adjuntar el evento TabControl.Selecting a tabControl1_Selecting

    4. Adjuntar el evento TabControl.DrawItem a tabControl1_DrawItem

    5. Copiar el siguiente código en tu formulario:

    public Form1()
      {
       InitializeComponent();
    
       tabPage2.Enabled = false;
    
      }
      private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
      {
       if (!e.TabPage.Enabled)
       {
        e.Cancel = true;
       }
      }
    
      private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
      {
       TabPage page = tabControl1.TabPages[e.Index];
    
       if (!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);
        }
       }
      }
    

    Básicamente, lo que estás haciendo es dibujar tus propias pestañas. Estás deshabilitando TabPage en tu constructor; ten en cuenta que TabPage.Enabled no está visible en el diseñador o intellisense, pero existe. Luego, en el evento de selección, estás impidiendo que el enfoque cambie a una página deshabilitada. En DrawItem, tú mismo dibujas las pestañas, de modo que puedes imitar el deshabilitar una pestaña. Otra opción que tienes es castear tus pestañas como controles, para luego establecer la propiedad Enabled como false.

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

    Si haces esto, el encabezado de la pestaña seguirá estando habilitado pero su contenido estará deshabilitado. Quedo pendiente de cualquier actualización. Gracias por levantar tu consulta en los foros de msdn.

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    terça-feira, 11 de agosto de 2020 13:08
    Moderador

Todas as Respostas

  • Hola cl2raul66,

    Te adjunto esta documentación oficial de Microsoft que explica algunas cosas que puedes hacer para limitar el acceso a las pestañas. Efectivamente, las pestañas ocultan la propiedad Enabled y esto es por diseño, o sea, no se puede desactivar una pestaña como tal. Sin embargo, no todo está perdido, puedes imitar este comportamiento. Podrías hacer algo como lo siguiente:

    1. Agregar un TabControl con 2 páginas

    2. Establecer DrawMode en OwnerDrawFixed

    3. Adjuntar el evento TabControl.Selecting a tabControl1_Selecting

    4. Adjuntar el evento TabControl.DrawItem a tabControl1_DrawItem

    5. Copiar el siguiente código en tu formulario:

    public Form1()
      {
       InitializeComponent();
    
       tabPage2.Enabled = false;
    
      }
      private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
      {
       if (!e.TabPage.Enabled)
       {
        e.Cancel = true;
       }
      }
    
      private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
      {
       TabPage page = tabControl1.TabPages[e.Index];
    
       if (!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);
        }
       }
      }
    

    Básicamente, lo que estás haciendo es dibujar tus propias pestañas. Estás deshabilitando TabPage en tu constructor; ten en cuenta que TabPage.Enabled no está visible en el diseñador o intellisense, pero existe. Luego, en el evento de selección, estás impidiendo que el enfoque cambie a una página deshabilitada. En DrawItem, tú mismo dibujas las pestañas, de modo que puedes imitar el deshabilitar una pestaña. Otra opción que tienes es castear tus pestañas como controles, para luego establecer la propiedad Enabled como false.

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

    Si haces esto, el encabezado de la pestaña seguirá estando habilitado pero su contenido estará deshabilitado. Quedo pendiente de cualquier actualización. Gracias por levantar tu consulta en los foros de msdn.

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    terça-feira, 11 de agosto de 2020 13:08
    Moderador
  • Hola cl2raul66,

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 


    sexta-feira, 21 de agosto de 2020 01:03
    Moderador
  • Muchas gracias, lo voy a probar y les comento.
    segunda-feira, 24 de agosto de 2020 00:57
  • Hola cl2raul66,

    ¿Alguna novedad sobre la consulta realizada?

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    sexta-feira, 28 de agosto de 2020 01:11
    Moderador