adszone.org
venerdì 20 settembre 2024
"Il modo corretto di pensare il software"
home
consulenza  vb.net  contatti 
  Visual Basic .NET
  Databinding (Ado.Net)
Domande

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:

  1. lblIndice, txtMittente, txtOggetto, txtTesto, btnPrev, btnNext
  2. cboSender, lstSubject
  3. 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