none
Filtrar datos en un BindingSource usando Filter RRS feed

  • Pregunta

  • La expresion que se envia en BindingSource.Filter es una cadena indicando las condiciones del filtro, no tengo inconvenientes al usar un campo string pero al usar un campo numerico no puedo lograr el efecto que necesito de ir filtrando a medida que voy escribiendo. cod_gru es el campo numerico de mi tabla:

    Filtro = String.Format("{0} = {1}", "cod_gru", Me.TextBox1.Text) esto para campos numericos
    Filtro = String.Format("{0} LIKE '%{1}%'", "nom_gru", Me.TextBox1.Text) esto para campos strings, FUNCIONA PERFECTO

     

    BindingSource.Filter = Filtro

    me despliega los datos solo cuando coinciden 100% el cod_gru con el texto del textbox.

    Usar Srt(cod_gru) de un error.

    Alguien me puede orientar en este tema?

    Gracias.

    BindingSource.Filter = Filtro

    me despliega los datos solo cuando coinciden 100% el cod_gru con el texto del textbox.

    Usar Srt(cod_gru) de un error.

    Alguien me puede orientar en este tema?

    Gracias.

     

    martes, 11 de agosto de 2009 4:33

Respuestas

  • Hola, Jaime:

    Si el origen de datos del objeto BindingSource es un objeto DataSet, DataTable o DataView, entiendo que te debería de funcionar la sintaxis que estás utilizando para filtrar los valores de un campo numérico.

    No obstante, haz una prueba encerrando entre comillas simples el valor del control TextBox, vaya a ser que los valores númericos NO SEAN ENTEROS:

         Filtro = String.Format("{0} = '{1}'", "cod_gru", Me.TextBox1.Text)

    Si son valores decimales, en el control TextBox deberás escribir el separador decimal establecido en la configuración regional. Si es la coma, tendrás que escribir la coma, y el punto en caso contrario.

    Ahora bien, si no utilizas la comilla simple y los valores son decimales, entonces tienes que especificar el punto como separador decimal.

    > al usar un campo numerico no puedo lograr el efecto que necesito
    > de ir filtrando a medida que voy escribiendo

    Es que con valores númericos no puedes filtrar conforme vas escribiendo, ya que estás ejecutando una condición de IGUALDAD:

         cod_gru = valor_numérico


    Es decir, el valor del campo TIENE QUE SER IGUAL al número especificado, no como si fuera parecido al número especificado, que es otra cuestión bien distinta. :-)

    Y una comparación LIKE, si el campo es numérico, no se puede utilizar de la misma manera que se hace con un campo alfanumérico.

    > Usar Srt(cod_gru) de un error.

    Esto sí que no lo entiendo. Si por "Srt" te refieres a la clásica función "CStr", no comprendo cómo puedes obtener un error, porque ni sería necesario llamar a dicha función, ya que "cod_gru", se supone que es un valor alfanumérico. :-)

    Un saludo

    NOTA: Si la respuesta te ha sido de utilidad, no olvides de marcarla como satisfactoria.


    Enrique Martínez [MS MVP - VB]
    martes, 11 de agosto de 2009 5:29
    Moderador
  • Puedes convertir la expresión y filtrar el campo como si fuera de texto.

    Por ejemplo:

     

    Filtro = string.Format("CONVERT(camponumerico, System.String) LIKE '%{0}%'", valor)

    Así lo haces en una sola línea.

     

    Así lo hago yo, espero te sirva.

     

    Alejandro Ospina

    viernes, 18 de febrero de 2011 20:56
  • "Jaime65" escribió:

    > lo que pasa es que no logro el efecto que deseo cuando tengo campos numericos en la tabla.

    En este caso no era necesario que explicaras lo que deseas hacer, porque desde un primer momento me dí cuenta de lo que querías, y así te lo hice saber en mi anterior respuesta. :-)

    > si en el .Filter coloco  Filtro = String.Format("{0}  LIKE '%{1}%", "CStr(cod_gru)", 
    > Me.TextBox1.Text) me da error porque la sentencia CStr dentro de las comillas
    > dobles no es evaluada.

    Esa expresión de filtro no es válida cuando se desea filtrar campos numéricos, simplemente porque el operador LIKE no está soportado, ya que únicamente funciona con tipos de datos alfanuméricos, por lo que me imagino que estarás obteniendo la excepción «No se puede realizar la operación 'Like' en System.Single y System.String», si el campo a filtrar es del tipo de dato Single.

    Asimismo, tampoco es necesario que utilices la función CStr en una expresión de filtro, ni incluso para especificar el valor del filtro, porque se entiende que el valor lo estás tomando desde la propiedad Text de un control TextBox, por tanto, el valor ya es un valor alfanumérico. Y menos aún es necesario que llames a la función CStr para convertir a alfanumérico el valor del nombre del campo que deseas filtrar, porque éste también es un valor alfanumérico. El filtro se tiene que componer de la siguiente expresión:

         Nombre_Campo   Operador    Valor

    Para conocer la sintaxis que puedes utilizar en una expresión de filtro, consulta en la ayuda de Visual Studio la propiedad «Expression» de un objeto DataColumn.

    > Crees que hay otra forma de hacerlo?

    Si quieres ir filtrando conforme escribes los valores en el control TextBox, no te queda más remedio que utilizar el operador LIKE, pero insisto en que éste únicamente funciona con tipos de datos alfanuméricos (String), por tanto, si la columna "cod_gru" pertenece a un objeto DataTable, lo único que tienes que hacer es definir dicha columna con el tipo de dato String, de ésta manera podrás utilizar la siguiente expresión de filtro:

         Filtro = String.Format("{0} LIKE '%{1}%'", "cod_gru", Me.TextBox1.Text)

    Si en tu proyecto estás utilizando un origen de datos, ábrelo con el diseñador, selecciona la columna "cod_gru", pulsa F4, y en la propiedad DataType indicas System.String.









    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Jaime65 lunes, 21 de septiembre de 2009 2:29
    miércoles, 12 de agosto de 2009 6:29
    Moderador

Todas las respuestas

  • Hola, Jaime:

    Si el origen de datos del objeto BindingSource es un objeto DataSet, DataTable o DataView, entiendo que te debería de funcionar la sintaxis que estás utilizando para filtrar los valores de un campo numérico.

    No obstante, haz una prueba encerrando entre comillas simples el valor del control TextBox, vaya a ser que los valores númericos NO SEAN ENTEROS:

         Filtro = String.Format("{0} = '{1}'", "cod_gru", Me.TextBox1.Text)

    Si son valores decimales, en el control TextBox deberás escribir el separador decimal establecido en la configuración regional. Si es la coma, tendrás que escribir la coma, y el punto en caso contrario.

    Ahora bien, si no utilizas la comilla simple y los valores son decimales, entonces tienes que especificar el punto como separador decimal.

    > al usar un campo numerico no puedo lograr el efecto que necesito
    > de ir filtrando a medida que voy escribiendo

    Es que con valores númericos no puedes filtrar conforme vas escribiendo, ya que estás ejecutando una condición de IGUALDAD:

         cod_gru = valor_numérico


    Es decir, el valor del campo TIENE QUE SER IGUAL al número especificado, no como si fuera parecido al número especificado, que es otra cuestión bien distinta. :-)

    Y una comparación LIKE, si el campo es numérico, no se puede utilizar de la misma manera que se hace con un campo alfanumérico.

    > Usar Srt(cod_gru) de un error.

    Esto sí que no lo entiendo. Si por "Srt" te refieres a la clásica función "CStr", no comprendo cómo puedes obtener un error, porque ni sería necesario llamar a dicha función, ya que "cod_gru", se supone que es un valor alfanumérico. :-)

    Un saludo

    NOTA: Si la respuesta te ha sido de utilidad, no olvides de marcarla como satisfactoria.


    Enrique Martínez [MS MVP - VB]
    martes, 11 de agosto de 2009 5:29
    Moderador
  • Hola Enrique.

    Gracias por tu respuesta. el codigo si me funciona, lo que pasa es que no logro el efecto que deseo cuando tengo campos numericos en la tabla. Este efecto si lo consigo ý perfectamente cuando los campos son strings. La idea es que a medida que voy ingresando caracteres en mi TextBox estos se vayan filtrando, te pongo un ejemplo: si tengo 3 registros (100, 201, 202) e ingreso el numero 1 en mi TextBox, en mi GridView me aparecen los 2 primeros, si digito un 1 y un 0 osea 10 ya solo me aparece el primero, si digito el 2 me aparecen los 2 ultimos, etc...

    si en el .Filter coloco  Filtro = String.Format("{0}  LIKE '%{1}%", "CStr(cod_gru)", Me.TextBox1.Text) me da error porque la sentencia CStr dentro de las comillas dobles no es evaluada.

    Crees que hay otra forma de hacerlo?

    Saludos,
    Jaime.
    miércoles, 12 de agosto de 2009 2:04
  • "Jaime65" escribió:

    > lo que pasa es que no logro el efecto que deseo cuando tengo campos numericos en la tabla.

    En este caso no era necesario que explicaras lo que deseas hacer, porque desde un primer momento me dí cuenta de lo que querías, y así te lo hice saber en mi anterior respuesta. :-)

    > si en el .Filter coloco  Filtro = String.Format("{0}  LIKE '%{1}%", "CStr(cod_gru)", 
    > Me.TextBox1.Text) me da error porque la sentencia CStr dentro de las comillas
    > dobles no es evaluada.

    Esa expresión de filtro no es válida cuando se desea filtrar campos numéricos, simplemente porque el operador LIKE no está soportado, ya que únicamente funciona con tipos de datos alfanuméricos, por lo que me imagino que estarás obteniendo la excepción «No se puede realizar la operación 'Like' en System.Single y System.String», si el campo a filtrar es del tipo de dato Single.

    Asimismo, tampoco es necesario que utilices la función CStr en una expresión de filtro, ni incluso para especificar el valor del filtro, porque se entiende que el valor lo estás tomando desde la propiedad Text de un control TextBox, por tanto, el valor ya es un valor alfanumérico. Y menos aún es necesario que llames a la función CStr para convertir a alfanumérico el valor del nombre del campo que deseas filtrar, porque éste también es un valor alfanumérico. El filtro se tiene que componer de la siguiente expresión:

         Nombre_Campo   Operador    Valor

    Para conocer la sintaxis que puedes utilizar en una expresión de filtro, consulta en la ayuda de Visual Studio la propiedad «Expression» de un objeto DataColumn.

    > Crees que hay otra forma de hacerlo?

    Si quieres ir filtrando conforme escribes los valores en el control TextBox, no te queda más remedio que utilizar el operador LIKE, pero insisto en que éste únicamente funciona con tipos de datos alfanuméricos (String), por tanto, si la columna "cod_gru" pertenece a un objeto DataTable, lo único que tienes que hacer es definir dicha columna con el tipo de dato String, de ésta manera podrás utilizar la siguiente expresión de filtro:

         Filtro = String.Format("{0} LIKE '%{1}%'", "cod_gru", Me.TextBox1.Text)

    Si en tu proyecto estás utilizando un origen de datos, ábrelo con el diseñador, selecciona la columna "cod_gru", pulsa F4, y en la propiedad DataType indicas System.String.









    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Jaime65 lunes, 21 de septiembre de 2009 2:29
    miércoles, 12 de agosto de 2009 6:29
    Moderador
  • No si ya lo tendrás solucionado, pero yo lo hago así para filtrar resultados, lo que hago es comprar el tipo de datos de la columna y ordenar ascendentemente, no filtra los numericos pero te pirmite buscarlos de una forma rapida eliminado los importes inferiores de la lista

     

     

    nomcamp es el nombre del campo de la base de dados

    tipusDades es el tipo de datos que contiene la columna

     

    tipusDades =

    Me.DataSource.current(e.ColumnIndex).GetType.ToString

     

    Me

     

    .Sort((Me.Columns(tmp)), System.ComponentModel.ListSortDirection.Ascending)

     

    Select Case tipusDades

     

    Case "System.String"

     

    Me.DataSource.filter = nomcamp + " like '*" + campbusqueda.Text + "*'"

     

    Case "System.Int32"

     

    Me.DataSource.filter = nomcamp + " =" + campbusqueda.Text

     

    Case "System.Double"

     

    Me.DataSource.filter = nomcamp + " >=" + Replace(campbusqueda.Text, ",", ".")

     

    Case "System.Single"

     

    Me.DataSource.filter = nomcamp + " >=" + Replace(campbusqueda.Text, ",", ".")

     

    End Select

    martes, 4 de mayo de 2010 7:22
  • "Eargemi" escribió:

    > No si ya lo tendrás solucionado ...

    Hola:

    Según el usuario Jaime65, parece ser que el problema se encuentra solucionado desde el pasado día 21 de septiembre de 2009.

    Un saludo

     


    Enrique Martínez [MS MVP - VB]
    martes, 4 de mayo de 2010 13:16
    Moderador
  • Hola amigos,

    En efecto, esa fue la solucion que ocupé, use un select case/end select para cada opción de tipo variable que quiero filtrar de la manera que lo hace EARGEMI. No pude hacerlo en una sola linea com era mi intención.

    Saludos amigos y gracias.

    Jaime Mora JMG.

     

    martes, 4 de mayo de 2010 15:38
  • Puedes convertir la expresión y filtrar el campo como si fuera de texto.

    Por ejemplo:

     

    Filtro = string.Format("CONVERT(camponumerico, System.String) LIKE '%{0}%'", valor)

    Así lo haces en una sola línea.

     

    Así lo hago yo, espero te sirva.

     

    Alejandro Ospina

    viernes, 18 de febrero de 2011 20:56
  • Gracias, funciona bien, es lo más acertado.
    sábado, 14 de mayo de 2011 1:09
  • Se que ya paso mucho tiempo de esto pero yo apenas estoy empezando un programa que requería un filtro así; llegue a este foro y según yo no leí o encontré algo que me solucionara (tal vez no leí todas las respuestas); en fin después de mucho investigar y mover por aquí quitarle por allá llegue a esta linea que me funciona perfectamente por si a alguien le sirve le dejooel dato:

    Me.ClientesBindingSource.Filter = "RazonSocial Like '%" & TextBox1.Text & "%'"

    Lógicamente tienes se tiene que adaptar al caso de c/u en mi programa la tabla se llama "Clientes" Y el campo al que se filtra "RazonSocial".

    jueves, 3 de marzo de 2016 23:41