web-dev-qa-db-fra.com

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

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

J'utilise C #.

66
Gold

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;
}
66
Hans Passant

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é.

80

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

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 .

42
Stormenet

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 );
13
Stewart

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

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.

6
sahran

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

5
Martijn Laarman

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. 

1
jcollum

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

1
aldebaran

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);
1
Amr Ashraf

tabControl.TabPages.Remove (tabPage1);

1
Johannes Kawali

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.

0
Aaron Smith

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
0
Matias Masso

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;
            }
        }
    }
0
KWB Tech

La solution est très simple.

Supprimer/commenter cette ligne 

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

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

0
user9677867

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.

0
Rafael

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

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é.

0
Andy