Data Binding
Il data binding e' quel meccanismo che collega una fonte dati,
quale puo' essere un database, ai controlli sul Form. Oltre ai
database, anche i file di testo o qualsiasi oggetto del tipo collection che
implementi l'interfaccia IList puo' essere collegato.
Il data binding e' implementato attorno ad Ado.Net
e ne semplifica gli aspetti tecnici, perche' minimizza la scrittura del codice
da parte del programmatore.
L'utilizzo di Ado.Net per quanto riguarda il data binding, si
limita all'impiego di oggetti che nella Toolbox si trovano sotto la
voce Data. Possiamo dividere questi controlli in due classi: quelli
che sono ottimizzati per il collegamento al Server SQL e quelli che,
tramite OleDB si collegano ad altri database.
I controlli di tipo Connection si occupano della connessione
al database. I controlli di tipo Command costruiscono comandi
per le query ed altre operazioni sul database. I controlli di tipo DataSet
sono detti controlli scollegati, perche', dopo aver reperito i dati voluti, ne
custodiscono una copia al loro interno e possono scollegarsi dal DB, liberando
risorse. I DataSet s'interfacciano al database utilizzando i
controlli del tipo DataAdapter.
E' implicito che dietro questi controlli ci sono le classi equivalenti fornite
da Ado.Net e delle quali, poiche' il data binding dovrebbe
facilitarne l'utilizzo, parleremo altrove. Peraltro, un Wizard ci permette di
crearli e quindi impostarne le proprieta' con un metodo guidato.
Lo scopo dell'impiego di questi oggetti e' quello di costruire un DataSet
da collegare ai vari controlli con i quali visualizziamo le informazioni, ad
esempio: TextBox, Label, ComboBox,
ListBox, DataGrid.
Mostriamo come collegare i controlli elencati sopra con un esempio di gestione
di messaggi di posta elettronica. Supponiamo di avere le email memorizzate su
un database Access, chiamato Posta.mdb. Esso contiene la tabella che
segue:
Tabella Posta |
indice |
mittente |
oggetto |
testo |
1 |
dante@alighieri.it |
Commedia |
Nel mezzo del cammin.... |
2 |
babbo@natale.com |
Auguri |
Buon natale |
3 |
guido@lamacchina.org |
Viabilita' |
Via libera |
Vogliamo creare un form che ci permetta di visualizzare i vari messaggi uno
alla volta o contemporaneamente. Utilizziamo i seguenti controlli.
Controllo |
Text |
Name |
Text |
"" |
txtMittente |
Text |
"" |
txtOggetto |
Text |
"" |
txtTesto |
Label |
"" |
lblIndice |
ComboBox |
-- |
cboSender |
ListBox |
-- |
lstSubject |
Button |
"<<" |
btnPrev |
Button |
">>" |
btnNext |
DataGrid |
-- |
grdPosta |
Possiamo raggruppare i controlli elencati precedentemente in tre sezioni:
-
lblIndice, txtMittente, txtOggetto, txtTesto, btnPrev, btnNext
-
cboSender, lstSubject
-
grdPosta
Oltre a questi controlli aggiungiamo un OleDbDataAdapter. Il
suo inserimento comporta una creazione guidata:
-
Nuova connessione
-
Creazione Data Link
-
Provider - Scegliere: Microsoft Jet 4.0 OLE DB Provider
-
Connection - Cliccare il pulsante "..." e selezionare
"posta.mdb"
-
Generazione query SQL - Introdurre: "select * from posta"
Questo Adapter si colleghera' al database e riempira' un DataSet
con le informazioni che vogliamo. Creiamo, intanto, il DataSet. Lo facciamo con
il Wizard che si trova nel menu principale di progettazione del form sotto la
voce Data (o dati) -> Generate DataSet...
-
New
- Nominarlo: DataSet_Posta.
-
Aggiungerlo al Designer
- Cliccare la CheckBox in fondo.
Esempio 1 - Data binding semplice
Esaminate il codice.
Il data binding semplice si ha quando la fonte dati viene collegata ad un
controllo che supporta solo la visualizzazione di un singolo elemento, es. TextBox,
Label. Poiche' dobbiamo individuare un singolo elemento in una tabella, questo
e' il collegamento piu' macchinoso.
Utilizziamo il metodo Add dell'oggetto DataBindings
dei controlli in questione. Gli forniamo:
-
La proprieta' che conterra' l'elemento da visualizzare, nel nostro esempio,
"Text" in tutti i casi.
-
La sorgente dei dati, nel nostro esempio il DataSet DataSet_Posta,
in tutti i casi.
-
La colonna da cui prendere l'elemento. Abbiamo un controllo per colonna.
In questo modo abbiamo spezzato una riga della tabella posta nei suoi quattro
elementi, che visualizziamo separatamente con una Label e tre TextBox. Se
vogliamo visualizzare tutti i messaggi, dobbiamo avvalerci dei due pulsanti
"<<", ">>" che faranno scorrere le righe in dietro ed in avanti.
Nei gestori di evento dei pulsanti utilizziamo la proprieta' BindingContext
del form. Il BindingContext e' una raccolta di gestori di
collegamento il cui scopo principale e' quello di gestire la sincronizzazione
fra i vari controlli che visualizzano gli elementi di una stessa fonte di dati.
Noi utilizziamo l'elemento DataSet_Posta.Posta della collection BindingContext,
cioe' ci interessiamo della sincronizzazione della visualizzazione della
tabella Posta, che e' anche l'unica che abbiamo. La proprieta' Position
e' l'indice della riga sulla quale ci troviamo. Alterando tale valore sincronizziamo
tutti gli oggetti in modo che aggiornino il loro contenuto con i valori della
nuova riga individuata. In pratica incrementiamo o decrementiamo il suo valore
in modo da scorrere su tutte le righe.
Esempio 2 - Data binding complesso
Esaminate il codice.
Il binding si chiama complesso quando possiamo visualizzare piu' di un
elemento, come nel caso di una ComboBox o di una ListBox. In questo caso
possiamo visualizzare intere colonne. A dispetto del nome, l'impiego diventa
piu' semplice perche' dobbiamo impostare solo due proprieta'. DataSource
e' la fonte dei dati a cui collegarsi, nel nostro caso, la tabella Posta. DisplayMember
indica la colonna da visualizzare. In questo caso il BindingContext
e' gestito trasparentemente, bastera' cambiare selezione e tutti i controlli si
aggiorneranno automaticamente.
Esempio 3 - Visualizzare un'intera tabella
Esaminate il codice.
Anche questo e' un esempio di binding complesso, paradossalmente e' il piu'
semplice da realizzare. Poiche' un DataGrid e' una matrice
bidimensionale essa si interfaccia nel rapporto uno a uno con la tabella,
pertanto ci limitiamo ad impostare soltanto la sua fonte dati DataSource.
Riempire il DataSet
In tutti i casi, l'oggetto perno e' il DataSet. Ricordiamo che esso non e'
collegato al database. L'unico momento in cui si collega e' per recuperare dei
dati in base alle query che abbiamo impostato oppure per aggiornare le
modifiche. In ogni altro caso esso riflette i dati in maniera locale.
Nell'esempio lo riempiamo tramite il metodo Fill del DataAdapter
e gli associamo l'etichetta "posta" che casualmente corrisponde al nome della
tabella. In realta' un DataSet puo' contenere piu' tabelle ed e' bene
contraddistinguerle associandogli un identificativo; se volete, il nome della
tabella stessa. Il riempimento viene eseguito nel Form_Load cosi' da farlo
trovare gia' pronto agli altri controlli.
' Esempio 1
Private Sub btnPrev_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnPrev.Click
Me.BindingContext(DataSet_Posta.Posta).Position -= 1
End Sub
' Esempio 1
Private Sub btnNext_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnNext.Click
Me.BindingContext(DataSet_Posta.Posta).Position += 1
End Sub
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
OleDbDataAdapter1.Fill(DataSet_Posta, "posta")
' Esempio 1
lblIndice.DataBindings.Add("Text", DataSet_Posta.Posta, "indice")
txtMittente.DataBindings.Add("Text", DataSet_Posta.Posta, "mittente")
txtOggetto.DataBindings.Add("Text", DataSet_Posta.Posta, "oggetto")
txtTesto.DataBindings.Add("Text", DataSet_Posta.Posta, "testo")
' Esempio 2
cboSender.DataSource = DataSet_Posta.Posta
cboSender.DisplayMember = "mittente"
lstSubject.DataSource = DataSet_Posta.Posta
lstSubject.DisplayMember = "oggetto"
' Esempio 3
grdPosta.DataSource = DataSet_Posta.Posta
End Sub
Ultimo aggiornamento 13/01/2004
|