Filtros en datagriview

27/05/2010 - 22:30 por Elisa | Informe spam
Hola grupo,

Tengo que hacer filtros sobre todos los campos de un datagridview, mi
pregunta es si se puede hacer de alguna forma que trabaje como los filtros
del EXCEL.


Muchísimas gracias,

Preguntas similare

Leer las respuestas

#1 SoftJaén
28/05/2010 - 17:12 | Informe spam
"Elisa" preguntó:

Tengo que hacer filtros sobre todos los campos de un datagridview, mi
pregunta es si se puede hacer de alguna forma que trabaje como los
filtros del EXCEL.



Hola, Elisa:

Como los filtros de Microsoft Excel, me parece a mí que va a ser que no. :-)

Si el control DataGridView se encuentra enlazado a un objeto DataTable,
puedes utilizar el método «Select» de dicho objeto para seleccionar las
filas que coincidan con un criterio particular.

Por ejemplo, imagina que tienes la tipica tabla de Clientes, y deseas
obtener aquellos cuyo Nombre comience por «Talleres». Simplemente
ejecutarías:

Private Sub Button1_Click( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles Button1.Click

' Referenciamos el objeto asociado
' con el control DataGridView.
'
Dim source As Object = DataGridView1.DataSource

Dim dt As DataTable = Nothing

If (TypeOf (source) Is DataView) Then
dt = DirectCast(source, DataView).Table

ElseIf (TypeOf (source) Is DataTable) Then
dt = DirectCast(source, DataTable)

Else
' Es otro origen de datos diferente.
Return
End If

Dim dv As DataView = GetDataView(dt, "Nombre Like 'Talleres%'")

If (dv Is Nothing) Then
' No hay ningún registro coincidente;
' el control DataGridView estará enlazado
' al objeto DataTable general.
'
DataGridView1.DataSource = m_dt

Else
' Hay registros; enlazo el control
' DataGridView con el objeto DataView.
'
DataGridView1.DataSource = dv
End If

End Sub


Para conocer los filtros de expresión que puedas utilizar, abre la ayuda de
Visual Studio y busca la propiedad Expression de la clase DataColumn.

El ejemplo asume a que a nivel del formulario tienes declarada la siguiente
variable objeto:

Private m_dt As DataTable

Dicha variable objeto será la que en principio estará enlazada con el
control DataGridView, así como cuando no existan registros que cumplan con
el criterio de filtro especificado.

Verás que utilizo una función llamada GetDataView, que como su nombre
indica, devuelve un objeto DataView con el resultado de aplicar el filtro
especificado. Dicha función sería la siguiente:

Private Function GetDataView( _
ByVal dt As DataTable, _
ByVal filterExpression As String) As DataView

' Verificamos los valores pasados.
'
If (dt Is Nothing) OrElse _
(filterExpression = String.Empty) Then _
Return Nothing

' Seleccionamos los registros de clientes
' cuyo nombre comienze por ACEITES
'
Dim rows() As DataRow = dt.Select(filterExpression)

' Si no existen registros, abandonamos
' el procedimiento.
'
If (rows.Length = 0) Then Return Nothing

' Clonamos el objeto DataTable.
'
Dim dtTemp As DataTable = dt.Clone()

' Añadimos los regitros seleccionados al
' objeto DataTable clonado.
'
For Each row As DataRow In rows
dtTemp.ImportRow(row)
Next

' Devolvemos el objeto DataView
'
Return New DataView(dtTemp)

End Function

¡En fin! Adapta el ejemplo a tus necesidades.

Un saludo

Enrique Martínez
[MS MVP - VB]
Respuesta Responder a este mensaje
#2 Elisa
28/05/2010 - 18:14 | Informe spam
El problema es que el resultado del select que rellena tiene muchas columnas
y el usuario quiere hacer filtros por todos los campos, porque también son
muchas filas en algunos casos pueden se 100. Poe eso me interesaría algo
pareceido a los filtros de excel sino no se me ocurre otra forma de hacerlo
tendría que repetir el select principal por cada campo.

Muchas gracias


"SoftJaén" wrote:

"Elisa" preguntó:
>
> Tengo que hacer filtros sobre todos los campos de un datagridview, mi
> pregunta es si se puede hacer de alguna forma que trabaje como los
> filtros del EXCEL.

Hola, Elisa:

Como los filtros de Microsoft Excel, me parece a mí que va a ser que no. :-)

Si el control DataGridView se encuentra enlazado a un objeto DataTable,
puedes utilizar el método «Select» de dicho objeto para seleccionar las
filas que coincidan con un criterio particular.

Por ejemplo, imagina que tienes la tipica tabla de Clientes, y deseas
obtener aquellos cuyo Nombre comience por «Talleres». Simplemente
ejecutarías:

Private Sub Button1_Click( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles Button1.Click

' Referenciamos el objeto asociado
' con el control DataGridView.
'
Dim source As Object = DataGridView1.DataSource

Dim dt As DataTable = Nothing

If (TypeOf (source) Is DataView) Then
dt = DirectCast(source, DataView).Table

ElseIf (TypeOf (source) Is DataTable) Then
dt = DirectCast(source, DataTable)

Else
' Es otro origen de datos diferente.
Return
End If

Dim dv As DataView = GetDataView(dt, "Nombre Like 'Talleres%'")

If (dv Is Nothing) Then
' No hay ningún registro coincidente;
' el control DataGridView estará enlazado
' al objeto DataTable general.
'
DataGridView1.DataSource = m_dt

Else
' Hay registros; enlazo el control
' DataGridView con el objeto DataView.
'
DataGridView1.DataSource = dv
End If

End Sub


Para conocer los filtros de expresión que puedas utilizar, abre la ayuda de
Visual Studio y busca la propiedad Expression de la clase DataColumn.

El ejemplo asume a que a nivel del formulario tienes declarada la siguiente
variable objeto:

Private m_dt As DataTable

Dicha variable objeto será la que en principio estará enlazada con el
control DataGridView, así como cuando no existan registros que cumplan con
el criterio de filtro especificado.

Verás que utilizo una función llamada GetDataView, que como su nombre
indica, devuelve un objeto DataView con el resultado de aplicar el filtro
especificado. Dicha función sería la siguiente:

Private Function GetDataView( _
ByVal dt As DataTable, _
ByVal filterExpression As String) As DataView

' Verificamos los valores pasados.
'
If (dt Is Nothing) OrElse _
(filterExpression = String.Empty) Then _
Return Nothing

' Seleccionamos los registros de clientes
' cuyo nombre comienze por ACEITES
'
Dim rows() As DataRow = dt.Select(filterExpression)

' Si no existen registros, abandonamos
' el procedimiento.
'
If (rows.Length = 0) Then Return Nothing

' Clonamos el objeto DataTable.
'
Dim dtTemp As DataTable = dt.Clone()

' Añadimos los regitros seleccionados al
' objeto DataTable clonado.
'
For Each row As DataRow In rows
dtTemp.ImportRow(row)
Next

' Devolvemos el objeto DataView
'
Return New DataView(dtTemp)

End Function

¡En fin! Adapta el ejemplo a tus necesidades.

Un saludo

Enrique Martínez
[MS MVP - VB]




.

Respuesta Responder a este mensaje
#3 SoftJaén
28/05/2010 - 18:29 | Informe spam
"Elisa" escribió:

El problema es que el resultado del select que rellena tiene muchas
columnas y el usuario quiere hacer filtros por todos los campos,
porque también son muchas filas en algunos casos pueden se 100.
Poe eso me interesaría algo pareceido a los filtros de excel sino
no se me ocurre otra forma de hacerlo tendría que repetir el select
principal por cada campo.




No le pidas peras al olmo, porque ésto es lo que hay.

Como comprenderás, el control DataGridView no es una hoja de cálculo de
Microsoft Excel y tiene limitaciones importantes. Es obligación del
programador hacer que el control se asemeje en la medida de las
posibilidades a una hoja de cálculo.

Para filtrar, ya te he comentado el método que tienes que utilizar, al cual
le puedes pasar como criterio el valor de varios campos:

' Obtenemos los clientes de los talleres
' existentes en Madrid.
'
Dim dv As DataView = _
GetDataView(dt, _
"Nombre Like 'Talleres%' AND Poblacion = 'Madrid'")

Enrique Martínez
[MS MVP - VB]
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida