Come molti di voi ben sanno, il NET Framework fornisce un controllo denominato TabControl che non è altro che un particolare Pannello in grado di contenere n TabPage. A loro volta, un TabPage è un ulteriore Pannello che puo' contenere a sua volta n controlli. Fin qui ho scoperto l' acqua calda.

Veniamo al dunque. Oggi ho la necessità di abilitare le successive Pagine del mio controllo solo dopo aver fatto una determinata operazione.
Usando C# (non so se anche con VB succede) nell' IntelliSense manca la Proprietà enabled per una determinata TabPage ma con una semplice riga di codice come quella sotto, VS compila ugualmente ...

TabPage1.Enabled = false;

Beh cosa vi aspettereste da cio'? Che la pagina non venga evidenziata al click ... Invece non è cosi'. La pagina e selezionabile solamente che i suoi controlli Child vengono disabilitati. Mmm poco ortodosso ...

Soluzione? Implementare una sorta di disabilitazione a run-time.

//Nel costruttore ...
      
public Form1()
{
InitializeComponent();
//Disabilito la pagina
Pagina.Enabled = false;
}
//Durante la selezione controllo se è abilitata
private void Pagina_Selecting
(object sender, TabControlCancelEventArgs e)
{
if (!e.TabPage.Enabled)
{
e.Cancel = true;
}
}
//Infine rendiamo l' interfaccia comprensibile all' utente
private void Pagina_DrawItem
(object sender, DrawItemEventArgs e)
{
TabPage page = tabControl1.TabPages[e.Index];
if (!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);
}
}
}

L' esempio è stato prelevato da questo articolo su MSDN ... link