Autore: Michele
Locuratolo
Spesso si ha la necessità di recuperare i dati da una cella di una DataGrid. La regola vuole che tali elementi vengano recuperati dal DataSource e non dalla DataGridView in quanto, come spesso accade, nella gliglia potrebbero non essere mostrati tutti i dati.
Per farlo, usiamo il seguente codice:
1 private object GetCurrentBindedObject(DataGridView dgv) {
2
3 if (dgv == null || dgv.DataSource == null) {
4 return null;
5 }
6
7 BindingManagerBase bmb = dgv.BindingContext[dgv.DataSource];
8
9 if (bmb == null) {
10 return null;
11 }
12
13 return bmb.Current;
14 }
Il tipo di ritorno è un object che, in caso la sorgente dati sia una DataTable, dovrà essere castato a DataRowView.
A questo punto, per accedere al dato che ci interessa leggere, possiamo usare il seguente codice:
1 DataRowView drv = (DataRowView)GetCurrentBindedObject(dgvUsers);
2 string strNome = drv["Nome"].ToString();
Il .NET Framework 2.0 però, ci permette di creare in modo semplice delle collection di oggetti bindabili ad elementi della UI.
Usando questa nuova caratteristica ed i comodi Generics, possiamo modificare il codice di GetCurrentBindedObject per farci ritornare direttamente il tipo che ci interessa.
Supponiamo di avere un oggetto User che rappresenta l’utente e la collection Users, che deriva da BinsingList<T> che rappresenta l’elenco dei nostri utenti (vedi codice allegato).
Il nostro codice può essere modificato come segue:
1 private T GetCurrentBindedObject(DataGridView dgv) where T: class {
2
3 if (dgv == null || dgv.DataSource == null) {
4 return null;
5 }
6
7 BindingManagerBase bmb = dgv.BindingContext[dgv.DataSource];
8
9 if (bmb == null) {
10 return null;
11 }
12
13 return bmb.Current as T;
14 }
da usare con il seguente codice:
1 User user = GetCurrentBindedObject(dgvUsers);
2 string Nome = user.Name;
Lo stesso metodo, essendo generico, potrà essere usato per tutti gli object del nostro domain model.
Il codice completo è disponibile nel file allegato.