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.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Un po' di benchmark tra Linq, Entity Framework e Nhibernate, il 12 ottobre 2008 alle 14:46
- UrlRewriting con trabocchetti vari, l'11 dicembre 2007 alle 21:00
- ControlParameter e masterpage... bug?, il 23 dicembre 2006 alle 15:58
- Se Visual Studio 2005 non accetta più la tastiera, il 16 dicembre 2006 alle 20:45
- Service Pack 1 di Visual Studio 2005, il 16 dicembre 2006 alle 20:35