web-dev-qa-db-fra.com

Bouton Fermer dans tabControl

est-ce que quelqu'un peut me dire comment ajouter un bouton de fermeture dans chaque onglet en utilisant tabControl en C #? je prévois d'utiliser le bouton pic pour remplacer [x] dans mon onglet ..

merci

28
user380899

Sans dériver une classe, voici un extrait soigné: http://www.dotnethnessts.net/implementing-close-button-in-tab-pages/

Définissez la propriété DrawMode du contrôle onglet sur OwnerDrawFixed. Cette propriété décide si le système ou le développeur peut peindre les légendes. Ajoutez le code dans l'événement DrawItem du contrôle Tab - Cet événement sera invoqué pour peindre chaque page Tab.

    //This code will render a "x" mark at the end of the Tab caption. 
e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - 15, e.Bounds.Top + 4);
e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + 12, e.Bounds.Top + 4);
e.DrawFocusRectangle();

Maintenant, pour l'action du bouton de fermeture, nous devons ajouter le code suivant à l'événement MouseDown du contrôle onglet.

//Looping through the controls.
for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
{
    Rectangle r = tabControl1.GetTabRect(i);
   //Getting the position of the "x" mark.
    Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);
    if (closeButton.Contains(e.Location))
    {
        if (MessageBox.Show("Would you like to Close this Tab?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {
            this.tabControl1.TabPages.RemoveAt(i);
            break;
        }
    }
}
54
andycted

Ajout aux autres réponses ... pourquoi itérer dans tous les onglets lors d'un événement de clic de souris alors que nous pouvons simplement détecter l'onglet actuel avec .SelectedIndex et .SelectedTab?

Ainsi:

private void tabControl1_MouseDown(object sender, MouseEventArgs e)
{
    Rectangle r = tabControl1.GetTabRect(this.tabControl1.SelectedIndex);
    Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);
    if (closeButton.Contains(e.Location))
    {
        this.tabControl1.TabPages.Remove(this.tabControl1.SelectedTab); 
    }
}

Ce qui semble se produire, c'est qu'au moment où vous cliquez sur une tabPage pour la fermer, elle est également sélectionnée, permettant ainsi au bouton de fermeture de fermer la bonne tabPage. Pour moi, cela fonctionne, mais veuillez prendre cela avec un soin supplémentaire, car je ne suis pas complètement sûr des inconvénients possibles (ma phrase initiale n'était pas une question complètement rhétorique car je suis un peu nouveau sur .Net ...).

7
jj_

Essayez ce code:

    private Point _imageLocation = new Point(13, 5);
        private Point _imgHitArea = new Point(13, 2);

        private void Form1_Load(object sender, EventArgs e)
        {
            tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
    tabControl1.DrawItem += tabControl1_DrawItem;
    CloseImage = WindowsFormsApplication3.Properties.Resources.closeR;
    tabControl1.Padding = new Point(10, 3);
        }


    private void TabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
        {
            try
            {
                Image img = new Bitmap(CloseImage);
                Rectangle r = e.Bounds;
                r = this.tabControl1.GetTabRect(e.Index);
                r.Offset(2, 2);
                Brush TitleBrush = new SolidBrush(Color.Black);
                Font f = this.Font;
                string title = this.tabControl1.TabPages[e.Index].Text;

                e.Graphics.DrawString(title, f, TitleBrush, new PointF(r.X, r.Y));

                if (tabControl1.SelectedIndex >= 1)
                {
                    e.Graphics.DrawImage(img, new Point(r.X + (this.tabControl1.GetTabRect(e.Index).Width - _imageLocation.X), _imageLocation.Y));
                }
            }
            catch (Exception) { }
        }


private void TabControl1_Mouse_Click(object sender, System.Windows.Forms.DrawItemEventArgs e)
{

TabControl tc = (TabControl)sender;
Point p = e.Location;
int _tabWidth = 0;
_tabWidth = this.tabControl1.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X);
Rectangle r = this.tabControl1.GetTabRect(tc.SelectedIndex);
r.Offset(_tabWidth, _imgHitArea.Y);
r.Width = 16;
r.Height = 16;
if (tabControl1.SelectedIndex >= 1)
{
    if (r.Contains(p))
    {
        TabPage TabP = (TabPage)tc.TabPages[tc.SelectedIndex];
        tc.TabPages.Remove(TabP);
    }

}
}

Regardez this extrait de code

1
user4340666