Buscar en Datagrid

11/01/2005 - 18:23 por Elvio | Informe spam
Hola:
Deseo consultarles cual es la mejor manera de buscar en un datagrid enlazado
a un origen de datos, quisiera poder sincronizar las filas con el resultado
de las busqueda que seria desde un textbox.

Si tienen ejemplos o direcciones les agradeceria...

Un saludo Elvio

Preguntas similare

Leer las respuestas

#1 SqlRanger
12/01/2005 - 12:41 | Informe spam
Lo más fácil para buscar es usar el método Find del DataView. Pero esto
tiene sus limitaciones: el DataView subyacente al que está enlazado el
DataGrid tiene que estar ordenado por la columna de búsqueda. Imagina por
ejemplo que tengo un formulario con un Datagrid enlazado, donde tengo
puestas las propiedades DataSource a un DataSet y el DataMember a "Products"
. El dataset lo cargo mediante un dataAdapter que se trae los registros de
la tabla Products de la base de datos Northwind. En el formulario tengo
también una caja de texto donde el usuario pone el nombre de un producto y
un botón buscar. El usuario puede ordenar el datagrid por cualquier columna
usando el ratón, así que el DataView subyacente podría estar ordenado por
cualquier columna o por ninguna en absoluto. Así que lo más que puedo hacer
en el botón de búsqueda es lo siguiente:

Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnBuscar2.Click
Dim dg As DataGrid = Me.DataGrid1
' el currency manager maneja la posición actual y mantiene una
referencia al origen de datos (propiedad List)
Dim cm As CurrencyManager = dg.BindingContext(dg.DataSource,
dg.DataMember)
'así obtengo el dataview subyacente
Dim dv As DataView = cm.List
If dv.Sort = "[ProductName]" Then
Dim Index As Integer = dv.Find(Me.txtProductName.Text)
If Index = -1 Then
MsgBox("No encontrado")
Else
cm.Position = Index
End If
Else
MsgBox("No se puede buscar con Find")
End If

End Sub

El método Find me devuelve el índice del registro encontrado o -1 si no
encuentra ninguno. Puedo hacer ese índice la posición actual del enlace a
datos haciendo cm.Position = index y entonces el DataGrid mostrará ese como
registro actual porque esa es la posición actual. La pega es que si el
dataview subyacente no está ordenado por ProductName no lo puedo usar.

Ya que muchas veces no puedo usar Find para encontrar un registro porque el
dataview tiene que estar ordenado por la columna de búsqueda, tengo que
buscar otra alternativa. Dicha alternativa podría ser el método Select del
DataTable, que por cierto es mucho más flexible que Find, ya que permite
poner cualquier condición de búsqueda. Pero el método Select del DataTable
devuelve un array de DatRows y yo necesito saber la posición que ocupan los
datarows en el DataView subyancente del enlace a datos para establecer esa
posición como posición actual del CurrencyManager para así sincronizar con
el DataGrid. Lamentablemente no existe en ADO.NET ningún método de ninguna
clase que me dé la posición de un DataRow dentro de un DataView, así que hay
que buscarla manualmente. El siguiente método hace lo que andamos buscando:

Public Function BuscarEnDataGrid(ByVal dg As DataGrid, ByVal Criterio As
String) As Integer
Dim cm As CurrencyManager = dg.BindingContext(dg.DataSource,
dg.DataMember)
Dim dv As DataView = cm.List
Dim table As DataTable = dv.Table
Dim rows() As DataRow = table.Select(Criterio)
If rows Is Nothing OrElse rows.Length = 0 Then
Return -1
End If
Dim index As Integer = -1
Dim row As DataRow = rows(0)
For i As Integer = 0 To dv.Count - 1
If dv(i).Row Is row Then
index = i
Exit For
End If
Next
If index <> -1 Then
cm.Position = index
End If
Return index
End Function

El método busca el primer registro (DataRow) que cumpla la condición de
búsqueda en el datatable, si existe, busca su posición en el DataView, si la
encuentra (puede que no, porque el DataView puede estar filtrado) establece
esa posición como la actual del enlace a datos (CurrencyManager) para que se
sincronice el DataGrid (y todo lo que haya enlazado a lo mismo). Si el
registro no se encuentra, el método devuelve -1, si lo encuentra devuelve la
posición dentro del DataView.

Así el botón buscar podría quedar ahora así:

Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnBuscar.Click
If BuscarEnDataGrid(Me.DataGrid1, "ProductName='" &
Me.txtProductName.Text & "'") = -1 Then
MsgBox("No encontrado")
End If
End Sub

Saludos desde Madrid:

Jesús López
MVP Visual Basic
Mentor Asociado Solid Quality Learning
www.solidqualitylearning.com

PD: Agradecería saber si esta respuesta te ha servido


"Elvio" escribió en el mensaje
news:
Hola:
Deseo consultarles cual es la mejor manera de buscar en un datagrid
enlazado
a un origen de datos, quisiera poder sincronizar las filas con el
resultado
de las busqueda que seria desde un textbox.

Si tienen ejemplos o direcciones les agradeceria...

Un saludo Elvio



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida