Un esempio di gestione del databinding Windows Forms ADO.NET e Access

Ho visto in giro che si fa ancora molta fatica a inquadrare la metodologia di implementazione di una applicazione Windows Forms che preveda l'utilizzo del databinding con ADO.NET e come fonte dati Access.
Ho realizzato questa piccola applicazione di esempio:

DataBinding Access

Per l’implementazione ho utilizzato il database NorthWind.mdb distribuito con la versione italiana di office.

Step per ricostruirsi il progetto:

  • Aprire un nuovo progetto Windows Forms VB.NET
  • Trascinare un oggetto OleDbDataAdapter sul form
  • Configurare il wizard perché punti alla tabella “Clienti”
  • Terminare la configurazione del DataAdapter facendo creare i command
  • Generare un dataset a partire dal dataadapter
  • Trascinare un oggetto DataView sul form
  • Impostare la proprietà Table del dataview con la tabella “clienti” (proprietà del dataset generato)
  • Aggiungere un oggetto datagrid alla form
  • Impostare DataSource del datagrid sull’oggetto dataview
  • Aggiungere labels e textbox per tutti i campi
  • Impostare sulle textbox il databinding (text) su un campo della dataview
  • Aggiungere una variabile in un’area di visibilità “tutta la classe”:  Private mBinding As BindingManagerBase

 

Oggetto toolbar

 

Per l’oggetto toolbar ho utilizzato una feature della reflection che consente di richiamare i metodi tramite il loro nome.

 

Inserire tanti bottoni con quanti sono quelli nell’immagine, dedicare ciascuno ad un particolare metodo

 

Metodo (Tag)

Descrizione

MoveFirst

Sposta il puntatore sul primo record

MoveNext

Sposta il puntatore di un record in avanti

MovePrevious

Sposta il puntatore di un record all’indietro

MoveLast

Sposta il puntatore all’ultimo record

NuovoRecord

Aggiunte una riga alla table clienti nel dataset

SalvaDati

Restituisce al database gli aggiornamenti

SalvaRecord

Termina l’editazione del record corrente

DeleteRecord

Cancella il record corrente

 

  Private Sub FrmBinding_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

        CaricaDati()

        mBinding = Me.BindingContext(DvClienti)

    End Sub

 

    Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick

        If e.Button.Tag Is Nothing Then Exit Sub

        Dim cmd As String = CType(e.Button.Tag, String)

        EseguiMetodo(Me, cmd)

    End Sub

    Private Sub CaricaDati()

        DsDati.Clienti.Rows.Clear()

        DaClienti.FillSchema(DsDati.Clienti, SchemaType.Source)

        DaClienti.Fill(DsDati.Clienti)

    End Sub

    Public Function EseguiMetodo(ByVal pObject As Object, ByVal pMetodo As String, Optional ByVal pParams() As Object = Nothing) As Object

        'Creazione di un oggetto "tipo quello passato"

        Dim objType As Type = pObject.GetType

        'Dichiaro un oggetto MethodInfo per memorizzare le informazioni sul metodo

        Dim objMethodInfo As System.Reflection.MethodInfo

        ' Get the MethodInfo for the current class. Binding Flags are specified to get the

        ' public and private Methods of this class. WhenPublic or Non-Public is specified

        ' in the BindingFlags, it is also necessary to specify Static or Instance

        objMethodInfo = objType.GetMethod(pMetodo, System.Reflection.BindingFlags.NonPublic Or _

            System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Static Or BindingFlags.Instance)

        Return objMethodInfo.Invoke(pObject, pParams)

    End Function

    Private Sub MoveFirst()

        mBinding.CancelCurrentEdit()

        mBinding.Position = 0

    End Sub

    Private Sub MoveLast()

        mBinding.Position = DsDati.Clienti.Rows.Count - 1

    End Sub

    Private Sub MovePrevious()

        mBinding.CancelCurrentEdit()

        If mBinding.Position > 0 Then

            mBinding.Position -= 1

        End If

    End Sub

    Private Sub MoveNext()

        mBinding.CancelCurrentEdit()

        If mBinding.Position + 1 < DsDati.Clienti.Rows.Count Then

            mBinding.Position += 1

        End If

    End Sub

    Private Sub NuovoRecord()

        mBinding.EndCurrentEdit()

        mBinding.AddNew()

    End Sub

    Private Sub SalvaDati()

        mBinding.EndCurrentEdit()

        DaClienti.Update(DsDati.Clienti)

    End Sub

    Private Sub SalvaRecord()

        mBinding.EndCurrentEdit()

    End Sub

    Private Sub DeleteRecord()

        mBinding.RemoveAt(mBinding.Position)

    End Sub

 

Download dell’esempio

Print | posted on venerdì 23 febbraio 2007 16:40

Feedback

# re: Un esempio di gestione del databinding Windows Forms ADO.NET e Access

Left by Daniele at 04/03/2007 02:48
Gravatar Questo si che può davvero di grande aiuto

Grazie Luciano

# re: Un esempio di gestione del databinding Windows Forms ADO.NET e Access

Left by Achille at 14/05/2007 20:05
Gravatar Mah ! C'è anche un wizard del tipo "premi un bottone per generare l' applicazione che ho in mente?"
Saluti

# re: Un esempio di gestione del databinding Windows Forms ADO.NET e Access

Left by Luciano Bastianello at 14/05/2007 20:25
Gravatar Battute a parte con il framework 2.0 questo post era riferito al framework 1.1 sono stati introdotti una serie di oggetti come bindingobject tableadapter, bindingnavigator che "mi" (ti) rendono in grado di riscrivere questo esempio senza scrivere una riga di codice o quasi.

# [VB.NET] Usare OLEDB in vb.net - Pagina 2 - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 01/02/2008 16:22
Gravatar [VB.NET] Usare OLEDB in vb.net - Pagina 2 - MasterDrive.it - Information Technology Developers Community

# re: Un esempio di gestione del databinding Windows Forms ADO.NET e Access

Left by sloors at 08/03/2008 22:05
Gravatar wanna! questo esempio è sicuramnte un aiuto di cui non puo' fare a meno un nuovo entrato nella comunita dei programmatori vb

# [VB08] dataset e roba varia | hilpers

Left by Pingback/TrackBack at 18/01/2009 16:48
Gravatar [VB08] dataset e roba varia | hilpers

# Controllo Data in VB.Net | hilpers

Left by Pingback/TrackBack at 23/01/2009 08:36
Gravatar Controllo Data in VB.Net | hilpers

# re: Un esempio di gestione del databinding Windows Forms ADO.NET e Access

Left by mary milano at 30/03/2009 14:35
Gravatar Fantastico... mi sono risparmiata un bel po' di lavoro con il tuo esempio...!!!
Ma se volessi trovare un record specifico ???
Grazie!
Mary

#  Lavorare su un Database : Inserimento, Eliminazione, Aggiornamento - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 10/04/2009 11:04
Gravatar Lavorare su un Database : Inserimento, Eliminazione, Aggiornamento - MasterDrive.it - Information Technology Developers Community

# re: Un esempio di gestione del databinding Windows Forms ADO.NET e Access

Left by Tiziano at 05/07/2009 21:35
Gravatar Devi dirlo che con il codice scritto in questo modo non si tiene minimamente conto delle variazioni che potrebbero aver compiuto altri utentiu sul database. In pratica si leggono i dati, si danno in pasto all'utente che può modificarli/cancellarli o inserirli (e magari impiega un'ora) e poi scarica la sua copia del database sul db access, sbattendosene se alcuno a modificato nel frattampo.....

# re: Un esempio di gestione del databinding Windows Forms ADO.NET e Access

Left by Luciano Bastianello at 05/07/2009 23:31
Gravatar Access NON è stato costruito per una gestione multiutenza, con vb6 almeno c'era il lock pessimistico, con ado.net proprio non ci siamo con la multiutenza, non esistono oggetti "connessi" e la filosofia è quella del lock ottimistico.
Con access in multiutenza ti devi "inventare" lato client una simulazione / gestione della concorrenza.
Di default ado.net restituisce errore se qualcuno ha modificato uno qualsiasi dei campi.
Per la multiutenza esiste ed è consigliato l'utilizzo di un "vero" database come sql server (express anche) mysql, postgresql, oracle firebird e altri, NON access.

Your comment:





 
Please add 5 and 6 and type the answer here:

Copyright © Luciano Bastianello

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski