¿Como sincronizar Grilla y Dataset?

17/02/2006 - 21:29 por Juan Carlos | Informe spam
Hola:

Mi problema es el siguiente: en un formulario he puesto los datos de un
registro
y en una grilla me salen todos los registros. Si pulso en cualquier registro
de
la grilla me pone los datos textbox del formulario. El problema viene,
cuando
ordeno la grilla por algún campo, entonces no coinciden el registro que
selecciono en la grilla con los datos que me pone en los textbox. ¿Como
puedo
hacer para sincronizar el dataset con los datos de la grilla, cuendo está la
ordeno por cualquier campo?.

Un Saludo y muchas gracias.
Juan Carlos
 

Leer las respuestas

#1 Luis Miguel Blanco
25/02/2006 - 12:29 | Informe spam
Hola de nuevo Juan Carlos

La solución que te propuse en mi anterior mensaje no contemplaba el hecho de
que utilizaras las cabeceras de columna del DataGrid para realizar la
ordenación, por lo que te ofrecí un medio genérico de afrontar el problema,
dado que no habías mencionado la forma de ordenar los datos que estabas
empleando.

Con el detalle más preciso de la situación que me explicas ahora, creo que
estamos de suerte y podemos también resolverlo, aunque la solución no pasa
por "luchar" con el DataGrid sino con el objeto que actúa como su fuente de
datos, te explico por partes:

Cuando cargas de datos un DataGrid, habrás observado que cada vez que
hacemos clic en una cabecera de columna, el propio DataGrid se encarga de
ordenar los datos por dicha columna, sin embargo, el control no ofrece un
evento específico para el clic sobre la cabecera, sino que tenemos el Click
genérico sobre el DataGrid. Esto hace que abordar el problema desde el
DataGrid se complique.

Pero ¿y si nos fijamos en los eventos de la fuente de datos del DataGrid?.
En el ejemplo que te propuse en mi mensaje anterior, pudimos comprobar que
era posible asignar un objeto DataView a la propiedad DataSource del grid;
desviemos pues la atención a este objeto, más concretamente a sus eventos,
donde podremos ver que disponemos del evento ListChanged, que se produce cada
vez que la lista de datos que contiene el DataView cambia, ¿y cuándo ocurre
esto?, al hacer clic en una cabecera del DataGrid.

Dado lo anterior, si utilizamos un DataView para cargar de datos el grid
(cosa que ya estamos haciendo), y escribimos un manipulador de evento para
DataView.ListChanged, en el que llamemos al método que se encarga de obtener
los datos de la fila del grid (mejor dicho del DataView) en la que estamos
posicionados, habremos solucionado el problema.

Como detalle final, si te interesa saber si la ordenación de la columna es
ascendente o descendente, puedes consultar la propiedad Sort del objeto
DataView, cuando sea ascendente, te devolverá el nombre del campo (siempre
entre corchetes), por ejemplo: "[City]", cuando sea descendente se añadirá la
subcadena DESC, por ejemplo: "[City] DESC".

A continuación te acompaño el fuente completo, basado en el ejemplo del
mensaje anterior, pero incluyendo los cambios necesarios para contemplar la
ordenación al hacer clic en las cabeceras de las columnas del grid.

'//////////////////////////////////////////////////////////////////////
Public Class Form1
Inherits System.Windows.Forms.Form

Private WithEvents dvVistaDatosGrid As DataView
Private Sub Form1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim oConexion As New SqlConnection
oConexion.ConnectionString = "Server=(local);" & _
"Database=Northwind;uid=sa;pwd=;"

Dim oDataAdapter As SqlDataAdapter
oDataAdapter = New SqlDataAdapter("SELECT * FROM Customers",
oConexion)

Dim oDataSet As DataSet
oDataSet = New DataSet
oDataAdapter.Fill(oDataSet, "Customers")
oDataAdapter = Nothing

dvVistaDatosGrid = oDataSet.Tables("Customers").DefaultView
Me.DataGrid1.DataSource = dvVistaDatosGrid
End Sub

Private Sub DataGrid1_CurrentCellChanged(ByVal sender As Object, ByVal e
As System.EventArgs) Handles DataGrid1.CurrentCellChanged
DatosRegistro()
End Sub

Private Sub DatosRegistro()
Dim nNumfila As Integer = Me.DataGrid1.CurrentRowIndex
Dim sCampo1 As String
Dim sCampo2 As String

sCampo1 = dvVistaDatosGrid.Item(nNumfila).Row.Item("CustomerID")
sCampo2 = dvVistaDatosGrid.Item(nNumfila).Row.Item("CompanyName")

Me.TextBox1.Text = nNumfila & "-" & sCampo1 & "-" & sCampo2
End Sub

Private Sub dvVistaDatosGrid_ListChanged(ByVal sender As Object, ByVal e
As System.ComponentModel.ListChangedEventArgs) Handles
dvVistaDatosGrid.ListChanged
Me.DatosRegistro()
End Sub
End Class
'//////////////////////////////////////////////////////////////////////

Espero que con esto ya puedas arreglar el problema.

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"elturle" wrote:

Hola Luis Miguel:

He probado lo que me dices, pero el problema es que yo no tengo ningún boton para ordenar, sino que ordeno dando en las etiquetas de la grilla. Lo que me haría falta es lo siguiente:
- Si hay algún evento que salte cuendo cambio la ordenación de la grilla.
- Y si hay alguna instrucción para que me de el campo y tipo de ordenación (Asc ó Des) que tiene la grilla para poder pasársela la misma ordenación a vista de la tabla.

Si sabes como puedo hacer esto anterior, creo que tendría el problem solucionado.

Un Saludo y Muchas Gracias.
Juan Carlos

Preguntas similares