Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Crear databinding en tiempo de ejecución

170 views
Skip to first unread message

jcpinto

unread,
Oct 18, 2008, 10:20:49 AM10/18/08
to
Hola chicos!
Tengo una aplicación en VS2008, en VB, con base de datos Acces. El
acceso a la base de datos lo hago en tiempo de ejecución. Quisiera
saber si se puede crear un databinding en tiempo de ejecución, para
asociarlo a un datagridview. Un saludo a todos y muchas gracias de
antemano.

Juan Carlos Pinto.

SoftJaén

unread,
Oct 18, 2008, 11:52:19 AM10/18/08
to
"jcpinto" escribió:

> Tengo una aplicación en VS2008, en VB, con base de datos Acces. El
> acceso a la base de datos lo hago en tiempo de ejecución. Quisiera
> saber si se puede crear un databinding en tiempo de ejecución, para
> asociarlo a un datagridview.

Si estamos hablando de enlazar el control DataGridView a un origen de datos,
por supuesto que lo puedes enlazar en tiempo de ejecución. Simplemente
tienes que especificar un objeto adecuado a la propiedad «DataSource» del
control DataGridView. Lo único que tienes que procurar es que el objeto que
le indiques a la propiedad «DataSource» implemente alguna de las siguientes
interfaces:

- La interfaz IList, incluidas las matrices unidimensionales.
- La interfaz IListSource, como las clases DataTable y DataSet.
- La interfaz IBindingList, como la clase BindingList<(Of <(T>)>).
- La interfaz IBindingListView, como la clase BindingSource.

Por ejemplo, si tienes configurado un objeto BindingSource, enlazarías el
control DataGridView en tiempo de ejecución de la siguiente manera:

DataGridView1.DataSource = objetoBindingSource

Y si es un objeto DataTable:

DataGridView1.DataSource = objetoDataTable

¡Así de fácil! :-)

Un saludo

--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.

jcpinto

unread,
Oct 18, 2008, 12:14:05 PM10/18/08
to
On 18 oct, 17:52, SoftJaén <grupo_notic...@softjaen.es> wrote:
> "jcpinto" escribió:
>
> > Tengo una aplicación en VS2008, en VB, con base de datos Acces. El
> > acceso a la base de datos lo hago en tiempo de ejecución. Quisiera
> > saber si se puede crear un databinding en tiempo de ejecución, para
> > asociarlo a un datagridview.
>


Hola Enrique!

Verás, yo siempre he utilizado databinding en tiempo de diseño. Pero
esta vez tengo que hacerlo en tiempo de ejecución. El tema es llenar
un datagridview con una tabla de una base de datos acces, y poder
añadir filas, modificarla, etc, y que se vaya modificando
automaticamente el datatable, osea, igual que usando bindingsource y
bindingnavigator. Porque si hago la conexion DataGridView1.DataSource
= objetoDataTable, lleno el datagridview, pero nada más, pero no
siguen enlazados... Y no se como crear el bindingsource y que esté
enlazado al datagridview...

Un saludo.

SoftJaén

unread,
Oct 18, 2008, 12:46:24 PM10/18/08
to
"jcpinto" escribió:

> yo siempre he utilizado databinding en tiempo de diseño. Pero esta vez
> tengo que hacerlo en tiempo de ejecución. El tema es llenar un
> datagridview con una tabla de una base de datos acces, y poder añadir
> filas, modificarla, etc, y que se vaya modificando automaticamente el
> datatable, osea, igual que usando bindingsource y bindingnavigator. Porque
> si hago la conexion DataGridView1.DataSource = objetoDataTable, lleno el
> datagridview, pero nada más, pero no siguen enlazados... Y no se como
> crear el bindingsource y que esté enlazado al datagridview...

¡Vamos a ver! Mientras que hayas especificado un valor a la propiedad
«DataSource» del control DataGridView, el control permanecerá enlazado a
dicho objeto hasta que establezcas a «Nothing» el valor de la mencionada
propiedad. Otra cosa muy distinta es que tú quieras actualizar la base de
datos con los datos existentes actualmente en el control DataGridView.

Para ésto último, tienes que utilizar POR NARICES un objeto que se conoce
como un «adaptador de datos», en tu caso, un objeto OleDbDataAdapter, que es
el objeto que hace de puente entre la base de datos de Access y nuestra
aplicación.

Imagina que tienes la típica tabla de Clientes en tu base de Access, tabla
que tendrá que tener establecida una clave principal, porque de lo
contrario, olvídate de todo porque no vas a poder actualizar los datos.
Deseas mostrar los datos de la tabla Clientes en un control DataGridView que
va a estar enlazado a un objeto BindingSource, por tanto, a nivel de la
clase Form declararíamos un objeto BindingSource:

Private bs As BindingSource

En el evento «Form_Load» cargaríamos los datos en el control DataGridView de
la siguiente manera:

Private Sub Form1_Load( ... )

' Creamos una nueva instancia del objeto BindingSource
'
bs = New BindingSource

Using cnn As New OleDbConnection( _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis documentos\Bd1.mdb;")

Try
Dim sql As String = "SELECT * FROM Clientes"
Dim da As New OleDbDataAdapter(sql, cnn)

Dim dt As DataTable = New DataTable("Clientes")

da.Fill(dt)

' Enlazamos el objeto BindingSource
'
bs.DataSource = dt

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Using

' Enlazamos el control DataGridView
'
DataGridView1.DataSource = bs

End Sub

¡Bien! Ya tenemos los datos de los clientes en el control DataGridView.
Ahora, cuando hagamos clic en un botón, vamos a actualizar la tabla de
Clientes con los datos existentes actualmente en el objeto DataGridView:

Private Sub Button1_Click( ...)

' Referenciamos el objeto DataTable al que se encuentra
' enlazado el control BindingSource
'
Dim dt As DataTable = DirectCast(bs.DataSource, DataTable)

' Actualizamos los datos.
'
UpdateOleDb(dt, _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis documentos\Bd1.mdb;", _
"SELECT * FROM Clientes")

End Sub

Ahora ya sólo queda escribir el procedimiento «UpdateOleDb», que será el que
se encarge de enviar a la base de datos los datos existentes en el objeto
DataTable pasado al procedimiento, junto con la cadena de conexión
utilizada, así como la consulta SQL de selección que utilizamos en el evento
«Form_Load» para obtener los datos de la tabla Clientes:


Private Sub UpdateOleDb(ByVal dt As DataTable, _
ByVal connString As String, _
ByVal sql As String)

' Configuramos la conexión.
'
Using cnn As New OleDbConnection(connString)

Try
' Creamos un adaptador de datos
'
Dim da As New OleDbDataAdapter(sql, cnn)

' Rellenamos el objeto DataTable con los datos
' de la consulta SQL.
'
da.Fill(dt)

' Creo un objeto CommandBuilder para actualizar los datos
'
Dim cmdBuilder As New OleDbCommandBuilder(da)
With da
.InsertCommand = cmdBuilder.GetInsertCommand
.DeleteCommand = cmdBuilder.GetDeleteCommand
.UpdateCommand = cmdBuilder.GetUpdateCommand
End With

' Enviamos los cambios a la base de datos
'
Dim n As Int32 = da.Update(dt)

' Mostramos los registros afectados.
'
MessageBox.Show("Nº de registros afectados: " & n.ToString)

Catch ex As Exception
MessageBox.Show(ex.Message, "Actualizar Datos")

End Try

End Using

End Sub

¡Eso es todo! Vuelvo a insistirte que la tabla de la base de datos que
desees actualizar tiene que tener establecida su correspondiente clave
principal, porque de lo contrario no vas a poder configurar el objeto
OleDbCommandBuilder que he utilizado en el procedimiento «UpdateOleDb» para
actualizar la base de datos.

Como complemento al ejemplo que te he expuesto, no estaría de más que
abrieras la ayuda de Visual Studio y estudiaras el objeto OleDbDataAdapter,
de esa manera conocerás cómo funciona dicho objeto. ;-)

0 new messages