vb.net search datagridview find bind

Buscar a través de columnas en una vista de cuadro de datos usando el cuadro de texto(vb.net)



search datagridview (2)

¿Cómo busco columnas en una vista de cuadrícula de datos usando un cuadro de texto? Estoy usando vb.net 2010. Tengo una Datagridview con una fuente de datos. Debajo está mi código para poblar mi datagridview. La vista de cuadrícula tendrá 4 columnas.

Private Sub LoadProducts() Dim CS As String = ConfigurationManager.ConnectionStrings("HRMS.My.MySettings.ResortDBConnectionString").ConnectionString Using con As SqlConnection = New SqlConnection(CS) Dim da As SqlDataAdapter = New SqlDataAdapter("sp_NET_GetProducts_CompanyID", con) da.SelectCommand.CommandType = CommandType.StoredProcedure da.SelectCommand.Parameters.AddWithValue("@CompanyID", CInt(ConfigurationManager.AppSettings("CompanyID"))) Dim ds As DataSet = New DataSet da.Fill(ds) ds.Tables(0).TableName = "Products" dgvProducts.DataSource = ds.Tables("Products") dgvProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill dgvProducts.AllowUserToResizeColumns = True dgvProducts.Refresh() End Using End Sub

Requisitos : En mi forma tendré un textbox y un button . El cuadro de texto proporcionará la cadena de búsqueda. Necesito una manera de resaltar la fila cuando se encuentra una cadena.

No quiero abrir otra conexión solo para buscar una cadena en un conjunto de datos. ¿Es posible buscar valores de cadena directamente en la vista de cuadrícula de datos?


Aquí tiene un código de muestra que hace lo que quiere:

Dim toSearch As String = "this" Dim colNum As Integer = 0 Dim res = ds.Tables("Products").AsEnumerable.Where(Function(x) x.Item(colNum).ToString() = toSearch).ToArray For Each item In res Dim curRow As Integer = ds.Tables("Products").Rows.IndexOf(item) dgvSuppliers.Rows(curRow).DefaultCellStyle.BackColor = Color.Yellow Next

El código anterior busca la cadena "this" en la primera columna de la Table "Products" y cambia el BackColor de las filas coincidentes a Amarillo.

NOTA: esta respuesta tiene la intención de responder la pregunta del OP de la forma en que generalmente se entiende "buscar un término en una fuente de datos", es decir, al confiar en una consulta. Además, las personas tienden a preferir soluciones que implican un menor número de líneas. Estas dos razones explican por qué confié en este enfoque (esto junto con la mudez del OP). El OP ha decidido contestar a sí mismo lo que ha considerado mejor. Personalmente prefiero soluciones iterativas como la que publicó (aunque considero que este enfoque es evidente para cualquiera que use DataGridView ). En cualquier caso, nada se puede decir a priori sobre qué opción es más eficiente sin conocer las condiciones exactas (tamaño). El objetivo de esta nota es resaltar que no recomiendo confiar en los enfoques basados ​​en LINQ de forma regular, simplemente escribí lo que el OP aparentemente estaba buscando (desafortunadamente, soy bastante malo al interpretar las expectativas de las personas que no explican claramente lo que está buscando y evitando cualquier tipo de comunicación).


Puede usar BindingSource para su requerimiento. Así que su código se verá a continuación,

  • Declarar (Público)

    Dim ds As New DataSet Dim bndSourceGrid As New BindingSource()

  • Complete dgvProducts con BindingSource

    Private Sub LoadProducts() Dim CS As String = ConfigurationManager.ConnectionStrings("HRMS.My.MySettings.ResortDBConnectionString").ConnectionString Using con As SqlConnection = New SqlConnection(CS) Dim da As SqlDataAdapter = New SqlDataAdapter("sp_NET_GetProducts_CompanyID", con) da.SelectCommand.CommandType = CommandType.StoredProcedure da.SelectCommand.Parameters.AddWithValue("@CompanyID", CInt(ConfigurationManager.AppSettings("CompanyID"))) da.Fill(ds) ds.Tables(0).TableName = "Products" ''/*-------------------------------------------- bndSourceGrid.DataSource = ds.Tables("Products") dgvProducts.DataSource = bndSourceGrid ''/*-------------------------------------------- dgvProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill dgvProducts.AllowUserToResizeColumns = True dgvProducts.Refresh() End Using End Sub

  • goto txtboxSerach y en su evento TextChanged

    Private Sub txtboxSeracht_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtSearchCust.TextChanged ''/*here "Name" is the column that you want filter/search bndSourceGrid.Filter = String.Format("{0} LIKE ''{1}%''", "Name", txtboxSerach.Text) ''/* sorting method ascending/descending bndSourceGrid.Sort = "Name ASC" End Sub

  • ir a txtboxSerach y en su evento Validado

    Private Sub txtboxSerach_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtboxSerach.Validated If txtboxSerach.Text = String.Empty Then bndSourceGrid.RemoveFilter() Else bndSourceGrid.Filter = String.Format("{0} = ''{1}''", "Name", txtboxSerach.Text) bndSourceGrid.Sort = "Name ASC" End If End Sub

  • Resultado
    mi DataGridView se ve a continuación

    ID Name Other --------------- 0 Abcd 321 1 Abdc 546 2 Bcdsf 1005


    Cuando empiezo a escribir la letra A en txtBoxSerach

    ID Name Other --------------- 0 Abcd 321 1 Abdc 546