Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

C# - Lavorare con i tabcontrol

C#

Alcune proprietà importanti

  • L'oggetto TabControl contiene al suo interno le "pagine". Ogni pagina è a sua volta un oggetto di tipo TabPage.
  • Per aggiungere o rimuovere pagine, andare sull'insieme "TabPages".
  • Per selezionare una pagina da codice utilizzare una delle due proprietà seguenti:

   TabControl1.SelectedTab = tabPage1;   // Tramite nome
   TabControl1.SelectedIndex = 0;        // Tramite indice

Nascondere le pagine e i bordi di un TabControl
  • Il TabControl non permette di personalizzare alcune proprietà tra cui il colore delle TabPages e il colore del bordo del controllo stesso.
  • In alcune situazioni può essere utile in fase di progetto, utilizzare il TabControl in quanto permette di raccogliere più pagine in un unico oggetto. Ma la scarsa personalizzazione dei colori di sfondo e della pagine contenute, ne impedisce un utilizzo appropriato.
  • Per questo motivo occorre utilizzare la tecnica sotto descritta con un esempio.
  • Questa tecnica fa sì che il controllo sia utilizzato normalmente in fase di progettazione, ma in esecuzione l'area del controllo viene nascosta dalla TabPage selezionata che si sovrappone al TabControl nascondendolo.
  • Diventa facile allora aggiungere altri controlli (nell'esempio dei bottoni più personalizzabili in termini di colori, dimensioni, ...) per selezionare la TabPage voluta.
  • La prima cosa da fare è inserire la seguente classe che eredita dalla classe TabControl.

   class CustomTabControl : TabControl
   {
       
private const int TCM_ADJUSTRECT = 0x1328;

       
protected override void WndProc(ref Message m)
       {
           
if (m.Msg == TCM_ADJUSTRECT && !DesignMode)
           {
               m.Result = (
IntPtr)1;
               
return;
           }
           
base.WndProc(ref m);
       }
   }

  • In questo modo si è costruito un nuovo controllo simile al TabControl ma con il solo override di WndProc.
  • A questo punto nella casella degli strumenti del progetto, compare il "CustomTabControl" che può essere trascinato nel progetto. Ereditando dal TabControl, appare identico al TabControl stesso.
  • In fase di esecuzione però, l'area completa del CustomTabControl viene nascosta dalla TabPage selezionata.
  • Ora basta aggiugere uno o più bottoni (tanti quante sono le TabPages del controllo) e per ogni bottone aggiungere il codice che attiva la TabPage selezionata.
  • Per esempio, con due bottoni:

   private void button1_Click(object sender, EventArgs e)
   {
       customTabControl1.SelectedTab = tabPage1;
   }

   private void button2_Click(object sender, EventArgs
e)
   {
       customTabControl1.SelectedTab = tabPage2;
   }


  • Riferimento: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/1d8be559-0b42-437a-bb3e-8404c5db364f/hiding-tab-pages-in-tabcontrol-using-c?forum=winforms
  • Si ringrazia Moreno Schievano per la segnalazione dell'articolo.


Colorare le linguette di un TabControl
  • Il TabControl non permette di personalizzare alcune proprietà tra cui il colore delle linguette esterne.
  • C'è comunque una soluzione che comporta l'utilizzo dell'evento DrawItem().
  • Si supponga di avere il form 'Form1'; esso contiene il solo controllo 'tabControl1'. Nel TabControl sono presenti le due pagine 'tabPage1' e 'tabPage2'. Sono queste due le linguette che coloriamo rispettivamente di rosso e di giallo tramite il codice seguente.
  • Innanzi tutto abbiamo bisogno di una struttura atta a contenere i TabPage e i colori; si utilizza un Dictionary, definito a livello di Form.

   private Dictionary<TabPage, Color> TabColors = new Dictionary<TabPage, Color>();

  • È necessario aggiungere l'evento 'DrawItem' al TabControl; ecco il codice.

   private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
   {
       using (Brush br = new SolidBrush(TabColors[tabControl1.TabPages[e.Index]]))
       {
           e.Graphics.FillRectangle(br, e.Bounds);
           SizeF sz = e.Graphics.MeasureString(tabControl1.TabPages[e.Index].Text, e.Font);
           e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + (e.Bounds.Width - sz.Width) / 2, e.Bounds.Top + (e.Bounds.Height - sz.Height) / 2 + 1);

           Rectangle rect = e.Bounds;
           rect.Offset(0, 1);
           rect.Inflate(0, -1);
           e.Graphics.DrawRectangle(Pens.DarkGray, rect);
           e.DrawFocusRectangle();
       }
   }

  • Infine nell'evento Form_Load() si imposta la proprietà 'DrawMode' del TabControl e si aggiungono gli elementi al Dictionary (tanti elementi quanti sono i TabPage).

   private void Form1_Load(object sender, EventArgs e)
   {
       this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;

       TabColors.Add(tabPage1, Color.Red);
       TabColors.Add(tabPage2, Color.Yellow);
   }

  • Questo è il risultato.


© 2022 Carlo Vecchio
Torna ai contenuti