Question

Mon scénario est le suivant:

Je travaille sur une application Winforms en C # qui comporte un bouton à l'intérieur de la page principale d'un onglet de contrôle qui générera un autre onglet à chaque clic. Chaque nouvelle page contient une mise en page définie par un contrôle utilisateur.

Mes questions sont les suivantes:

  1. Comment puis-je permettre à l'utilisateur de fermer l'un des onglets créés dynamiquement à l'exécution?

  2. Comment puis-je modifier le contrôle de tabulation lui-même afin qu'il comporte un petit "X" dans chaque onglet sur lequel l'utilisateur peut cliquer pour fermer cet onglet en particulier? (Comme Firefox a)

  3. Comment puis-je exposer la propriété SelectedIndex du tabcontrol au contrôle utilisateur si je veux fermer l'onglet avec un bouton à l'intérieur du contrôle utilisateur?

Était-ce utile?

La solution

J'ai créé un contrôle d'onglet dérivé il y a environ un an. Je ne vais pas poster la source ici, car elle compte environ 700 lignes et est codée de manière assez compliquée. Je trouverai peut-être un peu de temps pour nettoyer le code, puis le publier ici. Pour le moment, je vais décrire brièvement la manière dont il est construit.

Chaque page à onglet comporte une icône "X" sur la gauche du titre et les pages à onglet prennent en charge la réorganisation en effectuant un glisser-déposer et en les déplaçant entre plusieurs contrôles de tabulation.

Je choisis le moyen le plus simple d’obtenir l’icône dans les pages à onglet. Le contrôle onglet a le TabControl.ImageList et une page à onglet a une TabPage.ImageIndex . Je viens donc d'ajouter trois icônes à une liste d'images - normales, survolées, enfoncées - et de traiter les événements de la souris.

Avec TabControl.GetTabRect ( ) , vous pouvez vérifier si la souris survole une page à onglet spécifique et, avec quelques calculs mathématiques, si elle survole l’icône. Ensuite, il vous suffit de changer l’icône en fonction de l’état du bouton de la souris et éventuellement de supprimer la page à onglet située sous la souris si le bouton est enfoncé.

Le principal problème de cette solution est que, pour calculer si la souris est au-dessus de l'icône, il faut savoir où l'icône est peinte par rapport à la page à onglet et cela pourrait changer avec une nouvelle version de Windows. Et l’icône se trouve à gauche du titre, mais cela n’a pas l’air mauvais.

Autres conseils

J'ai trouvé ce code et m'a été très utile:

private void tabControl_MouseUp(object sender, MouseEventArgs e)
{
    // check if the right mouse button was pressed
    if(e.Button == MouseButtons.Right)
    {
        // iterate through all the tab pages
        for(int i = 0; i < tabControl1.TabCount; i++)
        {
            // get their rectangle area and check if it contains the mouse cursor
            Rectangle r = tabControl1.GetTabRect(i);
            if (r.Contains(e.Location))
            {
                // show the context menu here
                System.Diagnostics.Debug.WriteLine("TabPressed: " + i);
             }
        }
    }
}

TabControl: comment capturer un clic droit de la souris Sur l'onglet

J'ai fait ce qui suit: à l'étape de création (ajout) TabPage , j'ai ajouté un toolStrip

ToolStrip ts = new ToolStrip();
ts.Dock = DockStyle.Top;
ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes;

Créez ensuite le bouton X et ajoutez-le à toolstrip

ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);

créez un événement en cliquant sur le bouton X

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

ajouter toolstrip à la page de code

tabControl1.TabPages[curenttabpage].Controls.Add(ts);

now pour ToolStripButton_Click est la suivante:

void ToolStripButton_Click(object sender, EventArgs e)
{ 
 ToolStripButton t = (ToolStripButton)(sender);
 ToolStrip ts = t.Owner;
 TabPage tb = (TabPage)
 (ts.Parent);tabControl1.TabPages.Remove(tb);
}

Peut-être que ce n'est pas ce que vous voulez, mais cela fonctionnera bien.

J'ai créé une configuration similaire.

Chaque contrôle ajouté à la page à onglet au moment de l'exécution est dérivé d'un contrôle de base spécial que j'ai créé. Ce contrôle de base comporte un bouton de fermeture (ainsi que d’autres fonctionnalités telles que le drapeau permettant de fermer en toute sécurité).

Fermez le code de tabulation que j'utilise sur mon contrôle de base:

 TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;

tabControl.TabPages.Remove(parent);

Je sais que c’est un vieux sujet, mais j’ai trouvé ce lien qui vous permettra de "masquer" onglets dans un tableau et vous pouvez alors simplement recharger les onglets que vous voulez au moment de l'exécution. J'ai ajouté ceci davantage pour un endroit que je peux facilement retrouver.

Ce code peut vous aider à fermer les contrôles d’onglet avec un clic du milieu:

            private void tabControl1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button != System.Windows.Forms.MouseButtons.Middle)
                    return;

                for (int i = 0; i < MainTabControl.TabPages.Count; i++)
                {
                    if (this.MainTabControl.GetTabRect(i).Contains(e.Location))
                    {
                        this.MainTabControl.TabPages.RemoveAt(i);
                        return;
                    }
                }
            }

Cela fonctionne!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top