Comment puis-je désactiver un onglet dans un TabControl?

Est-il possible de désactiver un onglet dans un TabControl ?

J’utilise C #.

La classe TabPage masque la propriété Enabled. C’était intentionnel, car il y a un problème de conception de l’interface utilisateur avec elle. Le problème de base est que la désactivation de la page ne désactive pas également l’onglet. Et si vous essayez de contourner ce problème en désactivant l’onglet avec l’événement Selecting, cela ne fonctionnera pas lorsque TabControl n’a qu’une page.

Si ces problèmes d’utilisation ne vous concernent pas, gardez à l’esprit que la propriété fonctionne toujours, elle est simplement cachée par IntelliSense. Si le FUD est inconfortable, vous pouvez simplement faire ceci:

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

Convertissez votre TabPage en contrôle, puis définissez la propriété Enabled sur false.

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

Par conséquent, l’en-tête de la page sera toujours activé, mais son contenu sera désactivé.

Vous pouvez simplement utiliser:

 tabPage.Enabled = false; 

Cette propriété n’est pas affichée, mais elle fonctionne sans aucun problème.

Vous pouvez programmer l’événement TabControler sur TabControler pour qu’il soit impossible de passer à un onglet non modifiable:

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

Vous pouvez enregistrer l’événement “Sélection” et annuler la navigation vers la page à onglet:

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

Une autre idée est de mettre tous les contrôles sur la page d’onglet dans un contrôle Panel et de désactiver le panneau! Smiley

Vous pouvez également supprimer la page de tabulation de la collection tabControl1.TabPages. Cela cacherait la tabulation.

Les crédits vont à littleguru @ Channel 9 .

Vraisemblablement, vous voulez voir l’onglet dans le contrôle onglet, mais vous voulez qu’il soit “désactivé” (c’est-à-dire grisé et non sélectionnable). Il n’y a pas de prise en charge intégrée pour cela, mais vous pouvez remplacer le mécanisme de dessin pour obtenir l’effet souhaité.

Un exemple de la façon de procéder est fourni ici .

La magie se trouve dans cet extrait de la source présentée et dans la méthode DisableTab_DrawItem:

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

En prolongeant la réponse de Cédric Guillemette, après avoir désactivé le Control :

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

… vous pouvez alors gérer l’ TabControl de Selecting TabControl tant que:

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

Cela supprimera la page à onglet, mais vous devrez la rappend lorsque vous en aurez besoin:

 tabControl1.Controls.Remove(tabPage2); 

Si vous en avez besoin plus tard, vous voudrez peut-être le stocker dans une page temporaire avant de le supprimer, puis le rappend si nécessaire.

Le seul moyen consiste à intercepter l’événement Selecting et à empêcher l’activation d’un onglet.

J’ai dû gérer ça il y a quelque temps. J’ai supprimé l’onglet de la collection TabPages (je pense que c’est ça) et je l’ai ajouté lorsque les conditions ont changé. Mais ce n’était que dans Winforms où je pouvais garder l’onglet jusqu’à ce que j’en avais besoin à nouveau.

Vous pouvez le faire via les tabs: tabPage1.Hide (), tabPage2.Show () etc.

tabControl.TabPages.Remove (tabPage1);

La manière la plus délicate est de rendre son parent égal à null (rendre l’onglet seul sans parent):

  tabPage.Parent = null; 

Et quand vous voulez le renvoyer (le renverra à la fin de la collection de pages):

 tabPage.Parent = tabControl; 

Et si vous souhaitez le renvoyer dans un emplacement spécifique parmi les pages, vous pouvez utiliser:

 tabControl.TabPages.Insert(indexLocationYouWant, tabPage); 

J’ai déjà supprimé des pages à onglet pour empêcher l’utilisateur de cliquer dessus. Ce n’est probablement pas la meilleure solution car ils peuvent avoir besoin de voir que la page à onglet existe.

En utilisant les événements et les propriétés du contrôle onglet, vous pouvez activer / désactiver ce que vous voulez quand vous voulez. J’ai utilisé un booléen disponible pour toutes les méthodes de la classe de formulaire enfant mdi où tabControl est utilisé.

Rappelez-vous que l’événement de sélection se déclenche chaque fois que vous cliquez sur un onglet. Pour un grand nombre d’tabs, un “CASE” peut être plus facile à utiliser qu’un tas 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; } } } 

J’ai résolu ce problème comme ceci: j’ai 3 tabs et je veux garder l’utilisateur au premier onglet s’il ne s’est pas connecté, donc sur le SelectingEvent de TabControl j’ai écrit

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

L’utilisateur ne peut pas cliquer sur les tabs pour naviguer, mais ils peuvent utiliser les deux boutons ( Suivant et Précédent ). L’utilisateur ne peut pas continuer au prochain si les conditions // ne sont pas remplies.

 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; } 

réponse rfnodulator pour Vb.Net:

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

Supposons que vous avez ces contrôles:

TabControl avec le nom tcExemple.

TabPages avec les noms tpEx1 et tpEx2.

Essayez-le:

Définissez DrawMode de votre TabPage sur OwnerDrawFixed; Après InitializeComponent (), assurez-vous que tpEx2 n’est pas activé en ajoutant ce code:

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

Ajoutez à la sélection l’événement tcExemple le code ci-dessous:

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

Joindre à l’événement DrawItem de tcExemple ce code:

 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.DrawSsortingng(page.Text, page.Font, brush, e.Bounds); } } else { using (SolidBrush brush = new SolidBrush(page.ForeColor)) { e.Graphics.DrawSsortingng(page.Text, page.Font, brush, e.Bounds); } } } 

Cela rendra le deuxième onglet non cliquable.

La solution est très simple.

Supprimer / commenter cette ligne

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

dans la méthode IntializeComponent () dans MainForm.cs

Je n’ai pas trouvé de réponse appropriée à la question. Il semble y avoir aucune solution pour désactiver l’onglet spécifique. Ce que j’ai fait est de passer l’onglet spécifique à une variable et dans l’événement SelectedIndexChanged le remettre à 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; } 

Donc, vous ne désactivez pas réellement l’onglet, mais lorsqu’un autre onglet est cliqué, il vous renvoie toujours à l’onglet sélectionné.

Dans l’événement de chargement de formulaire si nous écrivons this.tabpage.PageEnabled = false , la page de l’onglet sera désactivée.

Utilisation:

  tabControl1.TabPages[1].Enabled = false; 

En écrivant ce code, la page à onglet ne sera pas complètement désactivée (ne pouvant pas être sélectionnée), mais son contenu interne sera désactivé et je pense que cela répond à vos besoins.

 MyTabControl.SelectedTab.Enabled = false;