none
Buscar un codigo en un Datagridview y seleccionar la fila al completo

    Question

  • Saludos

    En mi aplicacion, permito en cierto momento que se busque un elemento en concreto del DatagridView

    Se trata de buscar por una columna en concreto siempre, normalmente la primera y si lo encuentra que lo seleccione.

    El metodo de seleccion en los Datagridview de mi aplicacion es FullRowSelect

    Tengo este procedimiento, pero no termina de funcionar bien, ya que tengo celdas ocultas y a veces los campos "codigo" pueden coincidir, por ejemplo el tipo de curso con el codigo postal.

     

    Private Function BuscarEnDataGrid(ByVal busqueda As String, ByRef datagrid As DataGridView) As Boolean
        Try
          Dim encontrado As Boolean = False
          '
          ' validaciones
          '
          If String.IsNullOrEmpty(busqueda) Then
            MessageBox.Show("Debe ingresar un valor a buscar", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return False
          End If
    
          For Each cell As DataGridViewCell In datagrid.SelectedCells
            cell.Selected = False
          Next
    
          '
          ' aplico el filtro
          '
          Dim rows As List(Of DataGridViewRow) = (From item In datagrid.Rows.Cast(Of DataGridViewRow)() _
                                 Let clave = Convert.ToString(If(item.Cells("clnCodigoAula").Value, String.Empty)) _
                               Where clave = busqueda _
                               Select item).ToList
    
    
          For Each row As DataGridViewRow In rows
    
            Dim cells As List(Of DataGridViewCell) = (From item In row.Cells.Cast(Of DataGridViewCell)() _
                                    Let cell = Convert.ToString(item.Value) _
                                Where cell.Contains(busqueda) _
                                Select item).ToList()
    
            For Each item As DataGridViewCell In cells
              item.Selected = True
              encontrado = True
            Next
          Next
    
          Return encontrado
        Catch ex As Exception
          MsgBox("Se ha producido la siguiente excepción: " + vbCrLf + _
              ex.Message, CType(MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, MsgBoxStyle), "Error...")
          Return False
        End Try
      End Function

     

    Espero vuestra ayuda

     

    Un saludo y muchas gracias

    Tuesday, January 04, 2011 12:26 PM

Answers

  • hola

    pero alli se esta haciando uso de Linq para buscar por todas las columnas del DataGridView

     

    ademas porque aplcias dos veces el filtro, o sea primero haces

    Where clave = busqueda _

    en el primer linq y luego

    Where cell.Contains(busqueda) _

    en el segundo, esto no lo veo correcto, si filtras que sea en un solo lado y del resultado seleccionas y listo

    porque dos veces aplicas linq ?

     

    si estas seleccionado por fila podrias hacer directamente

    Dim rows As List(Of DataGridViewRow) = (From item In datagrid.Rows.Cast(Of DataGridViewRow)() _
                         Let clave = Convert.ToString(If(item.Cells("clnCodigoAula").Value, String.Empty)) _
                       Where clave = busqueda _
                       Select item).ToList


    For Each row As DataGridViewRow In rows
      row.Selected = True
    Next

    If rows.Count > 0 Then
      encontrado = True
    End If

     

    ojo en este caso hice una busqueda que coincida por eso deje el = en el Where, pero podrias suar tambien el Contains()

    igual sigo recomendando usar linq si es que puede hacerlo queda mucho mas prolijo en el codigo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Tuesday, January 04, 2011 2:01 PM
  • > En mi aplicacion, permito en cierto momento que se busque un elemento en concreto del DatagridView

    En el siguiente enlace encontrarás la manera de efectuar la búsqueda:

    Cómo buscar registros en un control DataGridView

     


    Enrique Martínez
      [MS MVP - VB]

    Tuesday, January 04, 2011 2:16 PM
    Moderator
  • Aunque hayas seleccionado la fila, si observas el DataGridView a la izquierda en la cabecera de la fila, verás el "Cursor" en la primera porque no has establecido que se mueva el cursor.

    incluye está linea:

    grid.CurrentCell = row.Cells(0)


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    Tuesday, January 04, 2011 2:32 PM
    Moderator

All replies

  • Hola Enrique, creo que has liado un poco el método.

    Lo primero, para quitar la seleccion no es necesario que pongas:

       For Each cell As DataGridViewCell In datagrid.SelectedCells
        cell.Selected = False
       Next

    Bastaría con poner: datagrid.ClearSelection()

    Después, si quieres hacer la función un poco más compleja, podrías pasarle el nombre de la columna a buscar:

    Function Buscar(ByVal TextoABuscar As String, ByVal Columna As String, ByRef grid As DataGridView) As Boolean
        Dim encontrado As Boolean = False
        If TextoABuscar = String.Empty Then Return False
        If grid.RowCount = 0 Then Return False
        grid.ClearSelection()
        If Columna = String.Empty Then
          For Each row As DataGridViewRow In grid.Rows
            For Each cell As DataGridViewCell In row.Cells
              If cell.Value.ToString() = TextoABuscar Then
                row.Selected = True
                Return True
              End If
            Next
          Next
        Else
          For Each row As DataGridViewRow In grid.Rows
            If row.IsNewRow Then Return False
            If row.Cells(Columna).Value.ToString() = TextoABuscar Then
              row.Selected = True
              Return True
            End If
    
          Next
        End If
        Return encontrado
      End Function
    


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    Tuesday, January 04, 2011 12:45 PM
    Moderator
  • Gracias, creo que esta funcion me la dio o la copie del Blog de Leandro

     

    Voy a probar esta que tu me dices, que por lo que veo lo que hace es "lo de toda la vida" recorrer el datagrid hasta que la encuentre

     

    Un saludo

    Tuesday, January 04, 2011 1:48 PM
  • hola

    pero alli se esta haciando uso de Linq para buscar por todas las columnas del DataGridView

     

    ademas porque aplcias dos veces el filtro, o sea primero haces

    Where clave = busqueda _

    en el primer linq y luego

    Where cell.Contains(busqueda) _

    en el segundo, esto no lo veo correcto, si filtras que sea en un solo lado y del resultado seleccionas y listo

    porque dos veces aplicas linq ?

     

    si estas seleccionado por fila podrias hacer directamente

    Dim rows As List(Of DataGridViewRow) = (From item In datagrid.Rows.Cast(Of DataGridViewRow)() _
                         Let clave = Convert.ToString(If(item.Cells("clnCodigoAula").Value, String.Empty)) _
                       Where clave = busqueda _
                       Select item).ToList


    For Each row As DataGridViewRow In rows
      row.Selected = True
    Next

    If rows.Count > 0 Then
      encontrado = True
    End If

     

    ojo en este caso hice una busqueda que coincida por eso deje el = en el Where, pero podrias suar tambien el Contains()

    igual sigo recomendando usar linq si es que puede hacerlo queda mucho mas prolijo en el codigo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Tuesday, January 04, 2011 2:01 PM
  • > En mi aplicacion, permito en cierto momento que se busque un elemento en concreto del DatagridView

    En el siguiente enlace encontrarás la manera de efectuar la búsqueda:

    Cómo buscar registros en un control DataGridView

     


    Enrique Martínez
      [MS MVP - VB]

    Tuesday, January 04, 2011 2:16 PM
    Moderator
  • Te pongo la función usando LINQ:

      Function Buscar2(ByVal TextoABuscar As String, ByVal Columna As String, ByRef grid As DataGridView) As Boolean
        Dim encontrado As Boolean = False
        If TextoABuscar = String.Empty Then Return False
        If grid.RowCount = 0 Then Return False
        grid.ClearSelection()
        If Columna = String.Empty Then
          Dim obj As IEnumerable(Of DataGridViewRow) = From row As DataGridViewRow In grid.Rows.Cast(Of DataGridViewRow)()
               From celda As DataGridViewCell In row.Cells
                Where celda.OwningRow.Equals(row) And celda.Value = TextoABuscar
                Select row
          If obj.Any() Then
            grid.Rows(obj.FirstOrDefault().Index).Selected = True
          End If
               
        Else
          Dim obj As IEnumerable(Of DataGridViewRow) = From row As DataGridViewRow In grid.Rows.Cast(Of DataGridViewRow)()
                           Where row.Cells(Columna).Value = TextoABuscar
                Select row
          If obj.Any() Then
            grid.Rows(obj.FirstOrDefault().Index).Selected = True
          End If
          
        End If
        Return encontrado
      End Function


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    Tuesday, January 04, 2011 2:18 PM
    Moderator
  • Bueno

    Tanto en el codigo de Javier como el de Leandro, hago esto

    Private Function BuscarEnDataGrid(ByVal TextoABuscar As String, ByVal Columna As String, ByRef datagrid As DataGridView) As Boolean
        Try
    
          Dim encontrado As Boolean = False
    
          datagrid.ClearSelection()
    
          If TextoABuscar = String.Empty Then Return False
    
          Dim rows As List(Of DataGridViewRow) = (From item In datagrid.Rows.Cast(Of DataGridViewRow)() _
               Let clave = Convert.ToString(If(item.Cells(Columna).Value, String.Empty)) _
              Where clave = TextoABuscar _
              Select item).ToList
    
    
          For Each row As DataGridViewRow In rows
            row.Selected = True
          Next
    
          If rows.Count > 0 Then
            encontrado = True
          End If
    
          Return encontrado
        Catch ex As Exception
          MsgBox("Se ha producido la siguiente excepción: " + vbCrLf + _
              ex.Message, CType(MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, MsgBoxStyle), "Error...")
          Return False
        End Try
      End Function

     

     

    encontrado = BuscarEnDataGrid(txtCodigo.Text, "clnCodigoAula", dgvListadoAulas)
    
       If encontrado Then
    		 'Copio los valores en las cajas
        txtCodigo.Text = dgvListadoAulas.CurrentRow.Cells("clnCodigoAula").Value
        txtNombreAula.Text = dgvListadoAulas.CurrentRow.Cells("clnNombreAula").Value
        cboTipoAula.SelectedValue = dgvListadoAulas.CurrentRow.Cells("clnCodigoTipoAula").Value
        txtObservaciones.Text = dgvListadoAulas.CurrentRow.Cells("clnObservacionesAula").Value

     

    En el grid me aparece seleccionada la fila correcta, pero en las cajas no me aparece bien su contenido, me copia la de la primera fila

     

    ¿Cual es el fallo?

    Tuesday, January 04, 2011 2:27 PM
  • ehh, pero estas usando el CurrentRow, o sea si es la primer fila la seleccionada, entocnes devolvera los valores de esta

    el codigo que modifique selecciona no solo una sino N filas que cpoincidan con la busqueda, por eso puse un For Each por cada fila encontrada en el linq

    estas usando

    For Each row As DataGridViewRow In rows
      row.Selected = True
    Next

    en donde rows es el resultado del linq ?

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Tuesday, January 04, 2011 2:30 PM
  • Aunque hayas seleccionado la fila, si observas el DataGridView a la izquierda en la cabecera de la fila, verás el "Cursor" en la primera porque no has establecido que se mueva el cursor.

    incluye está linea:

    grid.CurrentCell = row.Cells(0)


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    Tuesday, January 04, 2011 2:32 PM
    Moderator
  • Al buscar por la columna de la clave primaria solo me va a devolver una fila

     

    Lo he dejado asi

     

    Private Function BuscarEnDataGrid(ByVal TextoABuscar As String, ByVal Columna As String, ByRef datagrid As DataGridView) As Boolean
        Try
    
          Dim encontrado As Boolean = False
    
          datagrid.ClearSelection()
    
          If TextoABuscar = String.Empty Then Return False
    
          Dim rows As List(Of DataGridViewRow) = (From item In datagrid.Rows.Cast(Of DataGridViewRow)() _
               Let clave = Convert.ToString(If(item.Cells(Columna).Value, String.Empty)) _
              Where clave = TextoABuscar _
              Select item).ToList
    
    
          For Each row As DataGridViewRow In rows
            row.Selected = True
            datagrid.CurrentCell = row.Cells(0)
          Next
    
          If rows.Count > 0 Then
            encontrado = True
          End If
    
          Return encontrado
        Catch ex As Exception
          MsgBox("Se ha producido la siguiente excepción: " + vbCrLf + _
              ex.Message, CType(MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, MsgBoxStyle), "Error...")
          Return False
        End Try
      End Function

     

    ¿Como quedaria en caso de que quisiera seleccionar varias filas?  (es solo por curiosidad)

     

    Gracias a todos por vuestro interes

    Tuesday, January 04, 2011 2:41 PM
  • Tendrías que habilitar la opción MultiSelect del DataGridView, y la parte: datagrid.CurrentCell = row.Cells(0) sacarla fuera del bucle y hacerlo asi:

     datagrid.CurrentCell = rows.FirstOrDefault().Cells(0)


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    Tuesday, January 04, 2011 2:45 PM
    Moderator
  • Pues muchas gracias

    Hoy he aprendido algo nuevo (como casi todos los dias)

     

    Un saludo a todos

    Tuesday, January 04, 2011 2:47 PM
  • Es mi primera actuacion me siento honrrado de poder pertenecer a este foro

    favor necesito este codiguito pero en c#

    Fabrico un pequeño sistema de facturacion y quiero buscar los articulos introduciendo su codigo en la primera columna de un datagrid y me traiga el articulo si existe en base de datos.permitiendo seleccionar la cantidad de articulos que yo quiera.

    ademas quiero luego de realizada la transaccion el datagrid limpie todas las filas dejando las columnas nativas para seguir operando.

    mi base es sql 2008 express.

    muchas gracias

    espero mas adelente poder ayudar a la cumunidad.

    LEANDRO QUE TE DIOS TE BENDIGA ERES MI IDOLO, UN EXELENTE DESARROLLADOR Y UN GRANSER HUMANO, GRACIAS EN NOMBRE DE LA COMUNIDAD, TUS APORTE SON MAGNIFICOS.


    • Edited by BRIOSO RD Saturday, October 13, 2012 4:42 AM
    Saturday, October 13, 2012 4:32 AM