Windows Forms - DataGridView e validazione

Andrea Zani

di Andrea Zani, in .NET2, domenica 23 settembre 2007 ore 20.08

Sto sistemando una piccola applicazione windows forms che ho scritto in C# per renderla più umana. Ieri sera ho perso più di un'ora - due - per risolvere un problema con la validazione dei dati inseriti in un DataGridView. Tutto sembrava semplice all'inizio visto che è sufficiente agganciare all'evento CellValidating il proprio codice per controllare il contenuto delle celle:

        private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
        { 
            ... 
            if (e.ColumnIndex == 2) 
            { 
                int numero; 
                if (int.TryParse(e.FormattedValue.ToString(), out numero) == false) 
                { 
                    dataGridView1.Rows[e.RowIndex].ErrorText = "Inserire un valore numerico!"; 
                    e.Cancel = true; 
                } 
                else 
                { 
                    dataGridView1.Rows[e.RowIndex].ErrorText = null; 
                } 
            } 
        }

Avviato l'esempio è tutto ok, nella cella prescelta posso inserire solo un valore numerico intero, altrimenti compare il bollino rosso e l'errore specificato. Ma da qui inizia il patimento. Se, lasciato il contenuto errato in quella cella, qualsiasi altro webcontrol non risponde, neanche la chiusura della finestra. Penso che sia come per le web application: modifico la proprietà "Validating" dei singolo webcontrol all'infuori del DataGridView, ma nulla. Inizio a fare una ricerca su Internet, e trovo che è un problema comune e scopro qualche trucco per scavalcare il problema, ma non in modo soddisfacente.

Alla fine, testando, mettendo più idee insieme e tirando cazzotti alla tastiera ho trovato una buona soluzione. Innanzitutto è necessario disattivare la generazione di exception in caso di inserimento di un dato errato nella cella. Aggiungiamo questo codice all'avento DataError del DataGridView:

private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) 
        { 
            e.ThrowException = false; 
        }

Ora aggiungiamo quest'altro codice all'evento Leave, che ci permette di ripristinare il contenuto della cella che era presente prima della nostra modifica o per inserire un valore di default dato il tipo:

private void dataGridView1_Leave(object sender, EventArgs e) 
        { 
            for (int i = 0; i < dataGridView1.Rows.Count; i++) 
            { 
                for (int y = 0; y < dataGridView1.ColumnCount; y++) 
                { 
                    dataGridView1.Rows[i].Cells[y].Value= 
                        dataGridView1.Rows[i].Cells[y].GetEditedFormattedValue(i, DataGridViewDataErrorContexts.Commit); 
                } 
            } 
        }

Infine, per permettere la chiusura della finestra senza comunicazioni alcune, aggiungiamo questo codice all'evento FormClosing della nostra form:

private void Principale_FormClosing(object sender, FormClosingEventArgs e) 
        { 
            e.Cancel = false; 
        }

Fine.

Commenti

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.



Segnala su: Facebook MSDN Social Twitter Segnalo Wikio Diggita Technorati Stumbleupon Google Yahoo FriendFeed Delicious Furl

Nella stessa categoria
I più letti del mese
TagCloud
BLOG INFO
  • 295 post, 201 commenti, 36 trackback
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom
IN EVIDENZA