none
Buscar en un Datagridview sin filtrar

    Question

  • Saludos

     

    Tengo un DatagridView cuyo DataSource es un List of()

    Lo que quiero es que al escribir un valor en una caja de texto y pulsar un boton, busque el elemento en el DataGridView y se posicione en dicha fila

    Por lo que he estado leyendo, la unica forma de hacerlo es buscando fila por fila, pero antes de implementar dicha solucion, prefiero preguntaros.

    Recordad que no quiero filtrar los datos del DataGridView

    Muchas gracias

     

    Monday, November 29, 2010 12:45 AM

Answers

All replies

  • hola

    no te animas ha realxziando por emdio de linq ?

    DataGridView – Búsqueda con Linq

    en el ejmeplo se resaltan todas las filas que se encuentran, pero podrias ahcerlo solo de una si tomar solo la primer coindicdencia o sea el indice cero del resultado de la busqueda y seleccioans ese unico item, o sea en tu caso no harias un For Each por cada item encontrado, tomaria solo el primero

    podrias usar tambien el FirstOrDefault () para tener solo un item de la busqueda en el grisview y seleccionar ese unico registro

     

    si notas que no se posiciona porque hay muchos registros puede que necesites usar FirstDisplayedScrollingRowIndex

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Monday, November 29, 2010 1:20 AM
  • Curioso. Funciona perfectamente

    Una pregunta

     

    .... Where clave.Contains(busqueda) ... esta secuencia busca cualquier subcadena, pero yo quiero que por ejemplo al meterle un codigo postal (zip code) me lo encuentre exactamente

     

    Otra cosa es que comentas que no haria falta hacer el For Each

    For Each item As DataGridViewCell In cells

                    item.Selected = True

            Next

    No se como quitar esa sentencia para que me seleccione solo el primero

     

    MUCHAS GRACIAS

    Monday, November 29, 2010 2:20 AM
  • hola

    al meterle un codigo postal (zip code) me lo encuentre exactamente

    reemplaza el Contains() por un =

    ...Where clave = busqueda ....

     

    No se como quitar esa sentencia para que me seleccione solo el primero

    Dim cell As DataGridViewCell = cells.FirstOrDefault()

    If cell IsNot Nothing Then

        cell.Selected = True

    End If

     

    saludois


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Monday, November 29, 2010 2:58 AM
  • "Enrique Serra Zamora" preguntó:

    > Tengo un DatagridView cuyo DataSource es un List of()Ç
    >
    > Lo que quiero es que al escribir un valor en una caja de texto y pulsar
    > un boton, busque el elemento en el DataGridView y se posicione en dicha fila

    En el siguiente enlace lo explico utilizando EXCLUSIVAMENTE código de Visual Basic .net:

    Cómo buscar registros en un control DataGridView

     


    Enrique Martínez [MS MVP - VB]
    Monday, November 29, 2010 7:03 AM
  • hola

    al meterle un codigo postal (zip code) me lo encuentre exactamente

    reemplaza el Contains() por un =

    ...Where clave = busqueda ....

     

    No se como quitar esa sentencia para que me seleccione solo el primero

    Dim cell As DataGridViewCell = cells.FirstOrDefault()

    If cell IsNot Nothing Then

        cell.Selected = True

    End If

     

    saludois


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Asi ha quedado mi codigo

     

     Private Sub btnBuscarCodigoPostal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarCodigoPostal.Click
    
        Dim busqueda As String = txtCodigoPostal.Text
    
        Dim encontrado As Boolean = False
    
        '
    
        ' validaciones
    
        '
    
        If String.IsNullOrEmpty(busqueda) Then
    
          MessageBox.Show("Debe ingresar un valor a buscar", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
    
          Return
    
        End If
    
    
    
        For Each cell As DataGridViewCell In dgvListadoCursos.SelectedCells
    
          cell.Selected = False
    
        Next
    
    
    
        '
    
        ' aplico el filtro
    
        '
    
        Dim rows As List(Of DataGridViewRow) = (From item In dgvListadoCursos.Rows.Cast(Of DataGridViewRow)() _
    
                               Let clave = Convert.ToString(If(item.Cells("clnCodigoPostal").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
    
    
    
        If encontrado Then
    
          'DesHabilito las cajas
    
          Call DesHabilitarCajasTexto()
    
    
    
          Call HabilitarBotonesOperacionBarra()
    
          dgvListadoCursos.Enabled = True
    
    
    
          btnBuscarCodigoPostal.Visible = False
    
        Else
    
          MsgBox("No se encontro ninguna coincidencia.")
    
          txtCodigoPostal.Focus()
    
          Return
    
    
    
        End If
    

    Creo que se puede quitar algo mas, pero al tocar me da fallos aunque sean cambios logicos

    ¿Que opinais?

    Monday, November 29, 2010 10:11 AM
  • Gracias SoftJaen, pero me parece mas directo el metodo de Leandro, aunque he visto algunas cosas interesantes en lo que me has dicho
    Monday, November 29, 2010 10:14 AM
  • "Enrique Serra Zamora" escribió:

    > Gracias SoftJaen, pero me parece mas directo el metodo de Leandro, ...

    ¡Jejeje! Pues nada, ¡tu mismo!

     


    Enrique Martínez [MS MVP - VB]
    Monday, November 29, 2010 12:43 PM
  • Holaa! Podrías ayudarme?
    En mi caso yo también necesito encontrar un dato, la diferencia es que yo no estoy utilizando una base de datos SQL, sino que mi cita es directa de excel.

    Esté es mi código

    Imports System.Data
    Imports System.Data.OleDb
    Imports System.Data.Odbc




    Public Class Form1


        Public Sub Exportar_Excel(ByVal dgv As DataGridView, ByVal pth As String)


            Dim xlApp As Object = CreateObject("Excel.Application")
            'crear una nueva hoja de calculo 
            Dim xlWB As Object = xlApp.WorkBooks.add
            Dim xlWS As Object = xlWB.WorkSheets(1)

            'exportamos los caracteres de las columnas 
            For c As Integer = 0 To DataGridView1.Columns.Count - 1
                xlWS.cells(1, c + 1).value = DataGridView1.Columns(c).HeaderText
            Next
            'exportamos las cabeceras de columnas 
            For r As Integer = 0 To DataGridView1.RowCount - 1
                For c As Integer = 0 To DataGridView1.Columns.Count - 1
                    xlWS.cells(r + 2, c + 1).value = DataGridView1.Item(c, r).Value
                Next
            Next
            'guardamos la hoja de calculo en la ruta especificada 
            xlWB.saveas(pth)
            xlWS = Nothing
            xlWB = Nothing
            xlApp.quit()
            xlApp = Nothing
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim save As New SaveFileDialog
            save.Filter = "Archivo Excel | *.xlsx"
            If save.ShowDialog = Windows.Forms.DialogResult.OK Then
                Exportar_Excel(Me.DataGridView1, save.FileName)
            End If
        End Sub

        'Dim save As New SaveFileDialog
        'save.Filter = "Archivo Excel | *.xlsx"
        'If save.ShowDialog = Windows.Forms.DialogResult.OK Then
        '    Exportar_Excel(Me.DataGridView1, save.FileName)
        'End If

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click


            Dim stRuta As String = ""
            Dim openFD As New OpenFileDialog()
            With openFD
                .Title = "Seleccionar archivos"
                .Filter = "Archivos Excel(*.xls;*.xlsx)|*.xls;*xlsx|Todos los archivos(*.*)|*.*"
                .Multiselect = False
                .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.Desktop
                If .ShowDialog = Windows.Forms.DialogResult.OK Then
                    stRuta = .FileName
                End If
            End With

            Dim cadenaConexion As String = _
            "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=D:\ReportesExcel\REPORTES CERRADOS 1-150114 mod.xlsx;" & _
            "Extended Properties='Excel 12.0 Xml;HDR=Yes'"



            Using cnn As New OleDbConnection(cadenaConexion)
                Try

                    Dim cmd As OleDbCommand = cnn.CreateCommand()
                    cmd.CommandText = "SELECT * FROM [ejemplo$]"

                    Dim Ds As New DataSet
                    Dim da As New OleDbDataAdapter
                    Dim dt As New DataTable()
                    cnn.Open()
                    cmd.Connection = cnn
                    da.SelectCommand = cmd
                    da.Fill(Ds)
                    dt = Ds.Tables(0)
                    Me.DataGridView1.Columns.Clear()
                    Me.DataGridView1.DataSource = dt


                Catch ex As Exception

                End Try

            End Using
        End Sub

        Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

        End Sub

        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

            DataGridView1.Columns(0).Visible = False
            DataGridView1.Columns(1).Visible = False
            DataGridView1.Columns(2).Visible = False
            DataGridView1.Columns(3).Visible = False
            DataGridView1.Columns(5).Visible = False
            DataGridView1.Columns(6).Visible = False
            DataGridView1.Columns(7).Visible = False
            DataGridView1.Columns(9).Visible = False


        End Sub

        Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

        End Sub

        Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

        End Sub

        Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        End Sub

        Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
            Dim A As New Impresion
            A.ShowDialog()
        End Sub
    End Class
    Wednesday, January 29, 2014 2:24 AM