Est-il possible de désactiver un onglet dans un TabControl ?
J'utilise C #.
La TabPage class masque la propriété Enabled. C'était intentionnel, car il pose un problème de conception de l'interface utilisateur délicat. Le problème fondamental est que la désactivation de la page ne désactive pas non plus 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 si TabControl n'a qu'une seule page.
Si ces problèmes d'utilisation ne vous concernent pas, alors gardez à l'esprit que la propriété fonctionne toujours, elle est simplement masquée à 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 un 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 d'onglet 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 cela fonctionne sans aucun problème.
Vous pouvez programmer l'événement Selecting 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 de panneau et de désactiver le panneau! Smiley
Vous pouvez également supprimer la page d'onglet de la collection tabControl1.TabPages. Cela cacherait la page de tabulation.
Les crédits vont à littleguru @ Channel 9 .
Vraisemblablement, vous voulez voir l’onglet dans le contrôle d’onglet, mais vous voulez qu’il soit "désactivé" (c’est-à-dire grisé et non sélectionnable). Il n'y a pas de support intégré pour cela, mais vous pouvez remplacer le mécanisme de dessin pour donner l'effet souhaité.
Un exemple de la façon de procéder est fourni ici .
La magie est 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 );
Répondant à Cédric Guillemette, après avoir désactivé la variable Control
:
((Control)this.tabPage).Enabled = false;
... vous pouvez alors gérer l'événement TabControl
's Selecting
comme:
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
Cela supprimera la page à onglet, mais vous devrez la rajouter quand vous en aurez besoin:
tabControl1.Controls.Remove(tabPage2);
Si vous en avez besoin ultérieurement, vous pouvez le stocker dans une page à onglet temporaire avant la suppression, puis l'ajouter de nouveau 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 cela il y a quelque temps. J'ai supprimé l'onglet de la collection TabPages (je pense que c'est ça) et je l'ai rajouté lorsque les conditions ont changé. Mais ce n’était que dans Winforms où je pouvais garder la note jusqu’à ce que j’en ressente le besoin.
Vous pouvez le faire via les onglets: tabPage1.Hide (), tabPage2.Show () etc.
Le moyen le plus difficile est de rendre son parent égal à null (rendre l’onglet seul sans parent):
tabPage.Parent = null;
Et quand vous voulez le retourner (le retournera à la fin de la collection de pages):
tabPage.Parent = tabControl;
Et si vous souhaitez le renvoyer à un emplacement spécifique parmi les pages, vous pouvez utiliser:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
tabControl.TabPages.Remove (tabPage1);
J'ai déjà supprimé des onglets 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.
réponse de 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
J'ai résolu ce problème de la manière suivante:
if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
En utilisant des événements et les propriétés du contrôle des onglets, vous pouvez activer/désactiver ce que vous voulez quand vous le voulez. J'ai utilisé un booléen disponible pour toutes les méthodes de la classe de formulaire enfant mdi où le contrôle tabControl est utilisé.
Rappelez-vous que la sélection est déclenchée chaque fois que vous cliquez sur un onglet. Pour un grand nombre d'onglets, un "CAS" peut être plus facile à utiliser qu'un tas de if.
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;
}
}
}
La solution est très simple.
Supprimer/commenter cette ligne
this.tabControl.Controls.Add(this.YourTabName);
dans la méthode IntializeComponent () dans MainForm.cs
Supposons que vous ayez 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 (), vérifiez que tpEx2 n'est pas activé en ajoutant ce code:
((Control)tcExemple.TabPages["tpEx2").Enabled = false;
Ajoutez à l'événement tcExemple Selection le code ci-dessous:
private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e)
{
if (!((Control)e.TabPage).Enabled)
{
e.Cancel = true;
}
}
Associez à 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.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);
}
}
}
Cela rendra le deuxième onglet non-cliquable.
L'utilisateur ne peut pas cliquer sur les onglets pour naviguer, mais il peut utiliser les deux boutons (Next et Back). L'utilisateur ne peut pas continuer à la suivante 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;
}
Je n'ai pas pu trouver de réponse appropriée à la question. Il semble n'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
de 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;
}
Ainsi, vous ne désactivez pas réellement l'onglet, mais lorsqu'un autre onglet est cliqué, il vous renvoie toujours à l'onglet sélectionné.