personalizado - deshabilitar pestaña tabcontrol c#
¿Cómo puedo desactivar una pestaña dentro de un TabControl? (23)
¿Hay alguna forma de desactivar una pestaña en un TabControl ?
Estoy usando C #.
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 al siguiente si las // condiciones no se cumplen.
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;
}
Eliminé las páginas de pestañas en el pasado para evitar que el usuario haga clic en ellas. Sin embargo, probablemente esta no sea la mejor solución porque es posible que necesiten ver que la página de pestañas existe.
Emite tu TabPage a un Control, luego configura la propiedad Enabled en false.
((Control)this.tabPage).Enabled = false;
Por lo tanto, el encabezado del tabulador aún estará habilitado, pero su contenido se desactivará.
En el evento de carga de formulario si escribimos this.tabpage.PageEnabled = false
, el tabpage se desactivará.
Esto eliminará la página de pestañas, pero deberá volver a agregarla cuando la necesite:
tabControl1.Controls.Remove(tabPage2);
Si va a necesitarlo más tarde, es posible que desee almacenarlo en un tabulador temporal antes de eliminarlo y luego volver a agregarlo cuando sea necesario.
Extendiéndose luego de la respuesta de Cédric Guillemette, después de desactivar el Control
:
((Control)this.tabPage).Enabled = false;
... a continuación, puede manejar el evento Selecting
TabControl
como:
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
He resuelto este problema de esta manera: tengo 3 pestañas y quiero mantener al usuario en la primera pestaña si no se conectó, por lo que en SelectingEvent of TabControl escribí
if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
La única forma es atrapar el evento de Selecting
e impedir que se active una pestaña.
La clase TabPage oculta la propiedad Habilitada. Eso fue intencional ya que hay un problema de diseño de IU incómodo con él. El problema básico es que deshabilitar la página tampoco deshabilita la pestaña. Y si trata de evitarlo deshabilitando la pestaña con el evento Seleccionar, entonces no funciona cuando el TabControl tiene una sola página.
Si estos problemas de usabilidad no le preocupan, tenga en cuenta que la propiedad aún funciona, simplemente está oculta de 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;
}
La manera más complicada es hacer que su padre sea nulo (hacer la pestaña solo sin padre):
tabPage.Parent = null;
Y cuando desee 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);
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
ponerlo nuevamente en 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, no se desactiva la pestaña, pero cuando se hace clic en otra pestaña, siempre regresa a la pestaña seleccionada.
Presumiblemente, desea ver la pestaña en el control de pestañas, pero desea que esté "deshabilitada" (es decir, 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 se proporciona 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 );
Puede hacerlo a través de los tabuladores: tabPage1.Hide (), tabPage2.Show () etc.
Puede registrar el evento "Seleccionar" y cancelar la navegación a la página de pestañas:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage == tabPage2)
e.Cancel = true;
}
Otra idea es poner todos los controles en el tabulador en un control Panel y deshabilitar el panel! Smiley
También puede eliminar el tabulador de la colección tabControl1.TabPages. Eso escondería el tabulador.
Los créditos van a littleguru @ Channel 9 .
Puedes simplemente usar:
tabPage.Enabled = false;
Esta propiedad no se muestra, pero funciona sin ningún problema.
Puede programar el evento de selección en TabControler
para que sea imposible cambiar a una pestaña no editable:
private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !e.TabPage.Enabled;
}
Suponga que tiene estos controles:
TabControl con el nombre tcExemple.
TabPages con nombres tpEx1 y tpEx2.
Intentalo:
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;
Agregar a la selección tcExemple evento el código siguiente:
private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e)
{
if (!((Control)e.TabPage).Enabled)
{
e.Cancel = true;
}
}
Adjuntar al evento DrawItem de tcEmplear 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 haga clic.
Tuve que manejar esto hace un tiempo. Quité la pestaña de la colección de TabPages (creo que es eso) y la agregué cuando las condiciones cambiaron. Pero eso fue solo en Winforms, donde pude mantener la cuenta hasta que la necesité de nuevo.
Usando eventos y las propiedades del control de pestañas, puede activar / desactivar lo que desee cuando lo desee. Usé un bool que está disponible para todos los métodos en la clase de formulario mdi child donde se usa tabControl.
Recuerde que el evento de selección se activa cada vez que se hace clic en una 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;
}
}
}
Utilizar:
tabControl1.TabPages[1].Enabled = false;
Al escribir este código, la página de pestañas no se desactivará por completo (no podrá seleccionar), pero se desactivará su contenido interno, que creo que satisface sus necesidades.
respuesta del rninulador para Vb.Net:
Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
e.Cancel = Not e.TabPage.Enabled
End Sub
tabControl.TabPages.Remove (tabPage1);
MyTabControl.SelectedTab.Enabled = false;