¿Hay alguna forma de deshabilitar una pestaña en un TabControl ?
c#
winforms
tabcontrol
Oro
fuente
fuente
Respuestas:
La clase TabPage 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 también deshabilita la pestaña. Y si intenta solucionarlo deshabilitando la pestaña con el evento Selecting, entonces no funciona cuando TabControl tiene solo 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; }
fuente
Transmita su TabPage a un Control, luego establezca la propiedad Enabled en false.
((Control)this.tabPage).Enabled = false;
Por lo tanto, el encabezado de la pestaña seguirá estando habilitado pero su contenido estará deshabilitado.
fuente
Simplemente puede usar:
tabPage.Enabled = false;
Esta propiedad no se muestra, pero funciona sin problemas.
Puede programar el evento de selección
TabControler
para 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; }
fuente
Visible
propiedad, aunque no pareció tener ningún efecto visual cuando la probé.Puede registrar el evento "Seleccionar" 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 pestaña en un panel de control y deshabilitar el panel. Smiley
También puede eliminar la pestaña de la colección tabControl1.TabPages. Eso ocultaría la pestaña.
Los créditos van a littleguru @ Channel 9 .
fuente
Presumiblemente, desea ver la pestaña en el control de pestañas, pero desea que esté "deshabilitada" (es decir, atenuada y no seleccionable). No hay soporte incorporado para esto, pero puede anular el mecanismo de dibujo para obtener el efecto deseado.
Aquí se proporciona un ejemplo de cómo hacer esto .
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 );
fuente
Ampliando la respuesta de Cédric Guillemette, después de desactivar
Control
:((Control)this.tabPage).Enabled = false;
... a continuación, puede manejar el
TabControl
'sSelecting
evento como:private void tabControl_Selecting(object sender, TabControlCancelEventArgs e) { e.Cancel = !((Control)e.TabPage).Enabled; }
fuente
Esto eliminará la página de la pestaña, pero deberá volver a agregarla cuando la necesite:
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.
fuente
La única forma es detectar el
Selecting
evento y evitar que se active una pestaña.fuente
La forma más complicada es hacer que su padre sea igual a nulo (haga que la pestaña solo sin el padre):
tabPage.Parent = null;
Y cuando quiera devolverlo (lo devolverá al final de la colección de páginas):
Y si desea devolverlo en una ubicación específica entre las páginas, puede usar:
fuente
Tuve que manejar esto hace un tiempo. Eliminé la pestaña de la colección TabPages (creo que eso es todo) y la agregué cuando las condiciones cambiaron. Pero eso fue solo en Winforms donde pude mantener la pestaña hasta que la necesite nuevamente.
fuente
Puede hacerlo a través de las pestañas: tabPage1.Hide (), tabPage2.Show () etc.
fuente
tabControl.TabPages.Remove (tabPage1);
fuente
Eliminé páginas con 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 existe la página de pestañas.
fuente
Usando eventos y las propiedades del control de pestañas, puede habilitar / deshabilitar lo que desee cuando lo desee. Usé un bool que está disponible para todos los métodos en la clase de formulario secundario mdi donde se usa tabControl.
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" puede ser más fácil de usar que un montón de si.
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; } } }
fuente
He resuelto este problema de esta manera: tengo 3 pestañas y quiero mantener al usuario en la primera pestaña si no inició sesión, así que en el evento de selección de TabControl escribí
if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
fuente
El usuario no puede hacer clic en las pestañas para navegar, pero puede usar los dos botones ( Nexty Back). 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; }
fuente
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
fuente
Suponga que tiene estos controles:
TabControl con el nombre tcExemple.
TabPages con los 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;
Agregue al evento de selección tcExemple el siguiente código:
private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e) { if (!((Control)e.TabPage).Enabled) { e.Cancel = true; } }
Adjuntar al evento DrawItem de tc Ejemplo de 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 no se pueda hacer clic en la segunda pestaña.
fuente
Esta es una vieja pregunta, pero alguien puede beneficiarse de mi adición. Necesitaba un TabControl que mostrara las pestañas ocultas sucesivamente (después de realizar una acción en la pestaña actual). Entonces, hice una clase rápida para heredar y llamé a HideSuccessive () en Load:
public class RevealingTabControl : TabControl { private Action _showNextRequested = delegate { }; public void HideSuccessive() { var tabPages = this.TabPages.Cast<TabPage>().Skip(1); var queue = new ConcurrentQueue<TabPage>(tabPages); tabPages.ToList().ForEach(t => t.Parent = null); _showNextRequested = () => { if (queue.TryDequeue(out TabPage tabPage)) tabPage.Parent = this; }; } public void ShowNext() => _showNextRequested(); }
fuente
En el evento de carga de formulario si escribimos
this.tabpage.PageEnabled = false
, la pestaña se desactivará.fuente
Utilizar:
tabControl1.TabPages[1].Enabled = false;
Al escribir este código, la página de la pestaña no se desactivará por completo (no se podrá seleccionar), pero su contenido interno se desactivará, lo que creo que satisface sus necesidades.
fuente
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
fuente
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
SelectedIndexChanged
caso, volver a colocarla enSelectedIndex
://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 deshabilita la pestaña, pero cuando se hace clic en otra pestaña, siempre regresa a la pestaña seleccionada.
fuente
MyTabControl.SelectedTab.Enabled = false;
fuente