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ónID Name Other --------------- 0 Abcd 321 1 Abdc 546 2 Bcdsf 1005
Cuando empiezo a escribir la letraA
en txtBoxSerachID Name Other --------------- 0 Abcd 321 1 Abdc 546