none
PROBLEMAS CON BINDINGSOURCE FILTER

    Pregunta

  • Estimados tengo un problema a la hora de filtrar un bindingsource, el filtro se realiza mediante un textbox.textchanged, necesito buscar el siguiente producto: "TEE PPR TERMOFUSION 32MM" colocando en el textbox "TEE%32", pero se cae al ingresar un valor despues del %.

    ojala me puedan ayudar, muchas gracias

    Private Sub txtFiltroMat_TextChanged(sender As Object, e As EventArgs) Handles txtFiltroMat.TextChanged If txtFiltroMat.Text = "" Then T_MATERIALESBindingSource.Filter = "" T_MATERIALESBindingSource.Sort = "DETALLE ASC" Else T_MATERIALESBindingSource.Filter = String.Format("DETALLE Like '%" & txtFiltroMat.Text & "%' OR CODIGO LIKE '%" & txtFiltroMat.Text & "%'") T_MATERIALESBindingSource.Sort = "DETALLE ASC" End If

    End Sub


    lunes, 29 de agosto de 2016 21:04

Respuestas

  • Hola Leo.Ponce,

    La manera que usas el String.Format no es el correcto, prueba haciendo esta modificación: 

    If txtFiltroMat.Text.Trim <> String.Empty Then
         T_MATERIALESBindingSource.Filter = String.Empty
    Else
        T_MATERIALESBindingSource.Filter = String.Format("(DETALLE LIKE '%{0}%') OR (CODIGO LIKE '%{0}%')",
                                                                  txtFiltroMat.Text)
    End If
    
       T_MATERIALESBindingSource.Sort = "DETALLE ASC"

    Dónde el valor {0} será reemplazado por el txtFiltroMat.Text, y como ambos tienen el mismo valor de Sort, asignarlo fuera del If-else.

    [-] ... pero se cae al ingresar un valor despues del %.

    Pero que error te muestra, debes comentarlo.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    martes, 30 de agosto de 2016 0:41
  • Hola:
    al ingresar "COD%6" debería mostrar:
    COD. 90º PVC 63MM

    NO, el comodin % no lo tienes que poner en el TextBox.
    Si quieres que te encuentre >COD. 90º PVC 63MM< en el Textbox pondrias alguna de estos valores.

    63MM
    PVC 6
    3MM

    Un saludo desde Bilbo
    Carlos
    martes, 30 de agosto de 2016 5:52

Todas las respuestas

  • Hola Leo.Ponce,

    La manera que usas el String.Format no es el correcto, prueba haciendo esta modificación: 

    If txtFiltroMat.Text.Trim <> String.Empty Then
         T_MATERIALESBindingSource.Filter = String.Empty
    Else
        T_MATERIALESBindingSource.Filter = String.Format("(DETALLE LIKE '%{0}%') OR (CODIGO LIKE '%{0}%')",
                                                                  txtFiltroMat.Text)
    End If
    
       T_MATERIALESBindingSource.Sort = "DETALLE ASC"

    Dónde el valor {0} será reemplazado por el txtFiltroMat.Text, y como ambos tienen el mismo valor de Sort, asignarlo fuera del If-else.

    [-] ... pero se cae al ingresar un valor despues del %.

    Pero que error te muestra, debes comentarlo.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    martes, 30 de agosto de 2016 0:41
  • aun me sale el mismo error 
    martes, 30 de agosto de 2016 1:10
  • Hola Leo.Ponce,

    En vez de escribir el %, prueba poniendo el guión bajo.

    RED%6 ahora envía RED_6

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    martes, 30 de agosto de 2016 1:51
  • no genera problemas, pero aun así no muestra el resultado
    martes, 30 de agosto de 2016 1:59
  • Leo.Ponce,


    No comprendo porque agregas comodines en el filtro si envías una expresión con comodines. 

    Sobre lo que tienes, intenta concatenar los comodines al valor:

    String.Format("(DETALLE LIKE '%' + {0} + '%') OR (CODIGO LIKE '%' + {0} + '%')",
                                                                  txtFiltroMat.Text)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    martes, 30 de agosto de 2016 2:50
  • mmm... no aun arroja error.

    de la sig. lista: 

    COD. 90º PVC 20MM

    COD. 45º PVC 20MM

    COD. 90º PVC 63MM

    al ingresar "COD%6" debería mostrar:

    COD. 90º PVC 63MM

    al realizar una consulta directa a la base de datos con sentencia SQL funcionaba, pero al realizar el filtro en el BindingSource.Filter, no funciona

    martes, 30 de agosto de 2016 3:16
  • Leo.Ponce,


    Efectivamente, hice unas pruebas con la propiedad RowFilter (DataView) y obtengo la misma excepción.

    Sin duda, la expresión que intentas ejecutar en t-sql retornará resultados, sin embargo por lo que pude leer al parecer no es posible colocar el wilcard '%' en medio de la cadena, fíjate en el siguiente enlace: How do I filter a c# datatable using a rowfilter with multiple asterisks?. En csharp-examples hay una serie de ejemplos de la sintaxis para filtros e indican los mismo: "...Wildcard in the middle of a patern 'va*lue' is not allowed." DataView RowFilter Syntax [C#]



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    martes, 30 de agosto de 2016 3:47
  • Hola:
    al ingresar "COD%6" debería mostrar:
    COD. 90º PVC 63MM

    NO, el comodin % no lo tienes que poner en el TextBox.
    Si quieres que te encuentre >COD. 90º PVC 63MM< en el Textbox pondrias alguna de estos valores.

    63MM
    PVC 6
    3MM

    Un saludo desde Bilbo
    Carlos
    martes, 30 de agosto de 2016 5:52