Visual Studio IDE: gestione dei componenti d’interfaccia grafica.

Cari lettori, ben trovati. Oggi parleremo di un’importante caratteristica legata all’Integrated Development Environment IDE del Visual Studio. Esistono svariati contesti per i quali è opportuno capire come tale strumento lavora al fine di evitare comportamenti anomali che potrebbero essere scambianti erroneamente per un BUG del nostro prodotto.

Per discutere tale tematica, lasciatemi riportare un esempio:

Avviate Visual Studio 2008 e create una banalissima Desktop Application. Visual Studio creerà per voi una Form, chiamata Form1.cs (nel caso in cui abbiate selezionato C# come linguaggio di sviluppo). A questo punto gestite l’evento Shown, come indicato nel seguito.

 
        private void Form1_Shown(object sender, EventArgs e)
        {
            if (condizione==true)
                Close();
        }

Se una certa condizione è vera, richiamate la chiusura della From mostrata.

Compiuti i passi di cui sopra, aggiungete al vostro progetto una nuova Form che chiameremo Form2.

Di default, Visual Studio crea la Form2 eredidando dalla classe: System.Windows.Forms.Form. Modificate tale definizione affinchè la classe Form2 possa ereditare da Form 1, in altre parole cambiate il vostro codice come indicato nel seguito:

 public partial class Form2 : Form1
{
    public Form2()
    {
        InitializeComponent();
    }
}

Compiute le operazioni di cui sopra, compilate il vostro progetto. Noterete cheVisual Studio non mostra nessun messaggio d’errore, come del resto è atteso.

Subito dopo aver compilato il progetto, cercate di aprire in design view Form2, noterete che Visual Studio 2008 andrà in crash mostrando il seguente messaggio d’errore:

 

Untitled

Gli stessi passi eseguiti sul Visual Studio 2010, non causeranno il crash dell’ambiente di sviluppo, ma comunque non vi sarà possibile interagire con la From in design view, al suo posto troverete una schermata bianca.

Che cos’è successo? si tratta di un Bug dell’IDE del Visual Studio? L’applicazione funziona correttamente ma Visual Studio no!.

Ci tengo a rassicurarvi, non abbiamo trovato nessun bug o comportamento instabile Open-mouthed, se avessimo saputo come funziona l’IDE del Visual Studio avremmo evitato di perdere ore ed ore ad analizzare DUMP ed imprecare contro tutti e tutto.

Facciamo un passo indietro: come vengono mostrati i componenti grafici customizzati definiti durante lo sviluppo di un’applicazione dall’ IDE del Visual Studio?

E’ inevitabile che il codice scritto all’interno delle classi, che descrivono un certo componente grafico, debba essere eseguito affinché il componente stesso possa essere mostrato durante le fasi di sviluppo. Per ognuno dei componenti grafici aggiunti, Visual Studio crea internamente un’istanza  per l’esecuzione del codice.

Nel nostro contesto specifico, il codice della classe Fom1 viene eseguito ogni qualvolta si cerca di interagire, tramite l’IDE del Visual Studio, in design mode con la classe Form2. Questo implica che anche il metodo Shown viene erroneamente eseguito, interferendo in maniera anomala con il Visual Studio.

Per ovviare al problema, basta utilizzare gli strumenti giusti e conoscere il comportamento dell’IDE del Visual Studio.

E’ importante infatti essere certi che il codice da eseguire a runtime per la nostra applicazione non venga eseguito durante le fase di design.

A tal fine esiste la proprietà DesignMode, che nasce esattamente per ovviare a tali problematiche.

Vediamo nel seguito, come modificare correttamente il nostro codice, per ovviare a comportamenti indesiderati:

 private void Form1_Shown(object sender, EventArgs e)
{
    if (this.DesignMode != true)
    {
        if (condizione == true)
        {
            Close();
        }
    }
}

Con questo concludo e vi faccio i miei migliori saluti.

Carmelo.