none
Poner 2 filtros ala vez usando textbox, en un datagridview RRS feed

  • Pregunta

  • Bueno lo que logre fue filtrar un datagridview:al escribir el nombre del cliente, en el datagridview me aparecia sola los registros que contenian ese nombre
    en la columna nombre obviamente
    Lo que yo quiero es que una vez que me haiga filtrado por el nombre, tambien me filtre por el producto, este es mi codigo:

    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Data.DataColumn
    Public Class UC_Cliente_proforma
        Dim con As New Class_conexion
        Private BindingSource1 As Windows.Forms.BindingSource = New BindingSource
        Public Sub Aplicar_Filtro()
            ' filtrar por el campo nombre del cliente
            ''''''''''''''''''''''''''''''''''''''''''''''''''''  
            Dim ret As Integer = Filtrar_DataGridView("nombre", txt_buscar.Text.Trim, BindingSource1, Me.dgv_cliente,
                CType(Me.cbo_condi.SelectedIndex, e_FILTER_OPTION))
            If ret = 0 Then
                ' si no hay registros cambiar el color del txtbox  
                Me.txt_buscar.BackColor = Color.Red
            Else
                Me.txt_buscar.BackColor = Color.White
            End If
            ' visualizar la cantidad de registros  
            Me.Text = ret & " Registros encontrados"
    
        End Sub
    
        Enum e_FILTER_OPTION
            SIN_FILTRO = 0
            CADENA_QUE_COMIENCE_CON = 1
            CADENA_QUE_NO_COMIENCE_CON = 2
            CADENA_QUE_CONTENGA = 3
            CADENA_QUE_NO_CONTENGA = 4
            CADENA_IGUAL = 5
        End Enum
        Private Sub txt_buscar_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_buscar.TextChanged
            Aplicar_Filtro()
        End Sub
    
        Private Sub UC_Cliente_proforma_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.Width = 477
            Me.Height = 638
            Try
                Dim da As New SqlDataAdapter("listar_para_actualizar", con.conectar)
                'establecer que el tipo de comando es un Procedimiento Almacenado
                da.SelectCommand.CommandType = CommandType.StoredProcedure
                Dim tabla As New DataTable
                ' llenarlo  
                da.Fill(tabla)
    
                ' enlazar el DataTable al BindingSource  
                BindingSource1.DataSource = tabla
    
                ' agregar las opciones al combobox  
                With (Me.cbo_condi)
                    'cargar los items de opciones para filtrar  
                    .Items.Add("No filtrar")
                    .Items.Add("Que comience con")
                    .Items.Add("Que No comience con")
                    .Items.Add("Que contenga")
                    .Items.Add("Que No contenga")
                    .Items.Add("Que sea igual")
    
                    .DropDownStyle = ComboBoxStyle.DropDownList
                    .SelectedIndex = 1
                End With
                ' errores  
            Catch ex As Exception
                MsgBox(ex.Message.ToString)
            End Try
        End Sub
    
        Function Filtrar_DataGridView(ByVal Columna As String, ByVal texto As String, ByVal BindingSource As BindingSource, ByVal DataGridView As DataGridView, _
            Optional ByVal Opcion_Filtro As e_FILTER_OPTION = Nothing) As Integer
    
            ' verificar que el DataSource no esté vacio  
            If BindingSource1.DataSource Is Nothing Then
                Return 0
            End If
    
            Try
    
                Dim filtro As String = String.Empty
    
                ' Seleccionar la opción   
                Select Case Opcion_Filtro
                    Case e_FILTER_OPTION.CADENA_QUE_COMIENCE_CON
                        filtro = "like '" & texto.Trim & "%'"
                    Case e_FILTER_OPTION.CADENA_QUE_NO_COMIENCE_CON
                        filtro = "Not like '" & texto.Trim & "%'"
                    Case e_FILTER_OPTION.CADENA_QUE_NO_CONTENGA
                        filtro = "Not like '%" & texto.Trim & "%'"
                    Case e_FILTER_OPTION.CADENA_QUE_CONTENGA
                        filtro = "like '%" & texto.Trim & "%'"
                    Case e_FILTER_OPTION.CADENA_IGUAL
                        filtro = "='" & texto.Trim & "'"
                End Select
                ' Opción para no filtrar  
                If Opcion_Filtro = e_FILTER_OPTION.SIN_FILTRO Then
                    filtro = String.Empty
                End If
    
                ' armar el sql  
                If filtro <> String.Empty Then
                    filtro = "[" & Columna & "]" & filtro
                End If
    
                ' asigar el criterio a la propiedad Filter del BindingSource  
                BindingSource.Filter = filtro
                ' enlzar el datagridview al BindingSource  
                DataGridView.DataSource = BindingSource.DataSource
    
                ' retornar la cantidad de registros encontrados  
                Return BindingSource.Count
    
                ' errores  
            Catch ex As Exception
                MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
            End Try
            Return 0
        End Function

    Que es lo que debo agregar para que me filtre tambien por producto, lo que yo hice, fue copiar todo denuevo, pero ya no para filtrar el nombre del cliente, sino para filtrar el nombre del producto, y me salio, pero de otra manera, osea.. Primero le muestro la interfaz para explicarlo mejor:

    Bueno  en la imagen he escrito la palabra "H" y me filtro todos los CLIENTES que empiezan con "H", y lo que yo quiero es que dentro de ese filtrado me vuelva a filtrar el producto, cosa que por logica, solo quede un registro(una fila) ya que el mismo cliente no puede comprar el mismo producto con diferente proforma(para eso esta el campo cantidad), todo eso ya esta normalizado
    y lo que yo hice copiando el mismo codigo pero esta ves para producto, me filtraba pero no me lo filtraba de lo que estaba ya filtrado, si no que buscaba denuevo y me filtraba solo el producto:
    Asi como esta imagen:



    Y bueno por eso borre el codigo y lo deje asi como estaba con solo un filtro, espero que me ayuden pleaseee..

    sábado, 28 de abril de 2012 22:13

Todas las respuestas

  • no hace falta concatenar el like para crear filtros condicionales

    puedes usar parametros para lograrlo

    Filtros Condicionales (1/2)

    puedes implementarlo como comento en el articulo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 28 de abril de 2012 22:25
  • Si amigo, es muy interesante el enlace que me mando, seria cuestion de revisarlo detenidamente, ya que no se mucho de creacion de clases y Ud. ha creado muchas, Pero bueno en estos dias investigare esa manera de filtrar pero
    para mañana tengo que presentar un trabajo,
    No se si me pueda ayudar con el codigo que publique, se que solo le falta unas cuantas cosas, se lo agradeceria sobremanera please..
    es lo unico que me falta..: (
    Bueno Igualmente muy agradecido por todas las veces que me ha respondido .xD¡
    Saludos
    domingo, 29 de abril de 2012 1:25
  • pero no te centres en la creacion de clases si ese es el problema

    centrate en como se armar el WHERE en la query

    y como se usa el cmd.Parameters.AddWithValue() usando o no el DbNull.Value para habilitar el parametro como filtro o no

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 29 de abril de 2012 2:43
  • bueno mire..
    el codigo que le escribi arriba, es para filtrar por el nombre del cliente..
    pero que pasa si el mismo cliente quiere 50 productos, entonces, no voya estar buscando entre los 50 registros el producto que quiero, por eso es que lo quiero filtrar por nombre primero, y despues por producto, a lo que ya esta filtrado,
    pero con la misma filosofia de ese codigo de arriba, como dije anteriormente yo copie el mismo codigo pero esta vez para el nombre del producto, y pense que me filtraria el producto, y si mi lo filtra pero lo que yo quiero es que me lo filtre de lo que ya esta filtrado, anteriomente por el nombre..
    Y sobre los parametros, bueno voya investigar ojala me alcance el tiempo,
    Creo que a ese codigo de arriba que yo inserte le falta solo unas cuantas lineas..
    Y bueno espero haber me hecha una mano, pero de todas maneras tomare en cuenta lo de los parametros. Gracias.xD
    domingo, 29 de abril de 2012 3:51
  • Porque no haces la consulta con las dos condiciones, WHERE condicion1 AND condicion2

    Por ejemplo:

    dim SQL as string=""
    If txtNombre.text<>"" then sql=Condicion1
    If txtProducto.text<>"" then
       If sql<>"" then sql &=" AND "
       Sql &= Condocion2
    End if

    If sql="" then ' cancelar consulta, no hay datos a buscar

    .... WHERE sql

    Esta consulta te buscara solo por el nombre, solo por el producto o por nombre y producto





    • Editado ToniAG domingo, 29 de abril de 2012 8:17
    domingo, 29 de abril de 2012 8:13