如何修改现有代码实现基于DataGridView1 Column1值的搜索?
实现基于DataGridView Column1值的数据搜索功能
看起来你已经搞定了通过ID加载数据到DataGridView的逻辑,现在要基于DataGridView里的Column1做搜索,这里有两种常用的实现思路,根据你的场景选就行:
方法一:本地筛选已加载的数据(适合小数据集)
如果你的DataGridView已经加载了所有需要筛选的数据,直接在本地做筛选就好,不用再跑数据库,速度快还省资源。
你可以加一个专门的搜索输入框(比如命名为TextBox_Search),然后给它的TextChanged事件写逻辑:
Private Sub TextBox_Search_TextChanged(sender As Object, e As EventArgs) Handles TextBox_Search.TextChanged ' 先拿到DataGridView绑定的DataTable Dim boundTable As DataTable = TryCast(DataGridView1.DataSource, DataTable) If boundTable Is Nothing Then Return ' 搜索框为空时,显示所有数据 If String.IsNullOrWhiteSpace(TextBox_Search.Text) Then boundTable.DefaultView.RowFilter = String.Empty Else ' 这里做模糊匹配,如果你要精确匹配就改成 "[Column1] = '{TextBox_Search.Text}'" ' 注意列名如果有空格或者特殊字符,一定要用[]括起来 boundTable.DefaultView.RowFilter = $"[Column1] LIKE '%{TextBox_Search.Text}%'" End If ' 重新绑定视图(其实设置RowFilter后DataGridView会自动更新,这步可选) DataGridView1.DataSource = boundTable.DefaultView End Sub
这种方式的局限是只能筛选当前DataGridView里已经加载的数据,如果你的初始查询只拉了部分数据,那搜不到数据库里其他符合条件的内容。
方法二:从数据库重新查询(适合大数据集或需要最新数据)
如果要搜索全数据库里符合Column1条件的数据,或者需要确保数据是最新的,那可以复用你原来的数据库查询逻辑,修改SQL语句就行——但一定要改成参数化查询,避免SQL注入!
同样加个搜索框和搜索按钮(比如Button_Search),按钮点击事件代码如下:
Private Sub Button_Search_Click(sender As Object, e As EventArgs) Handles Button_Search.Click Dim connectionString As String = "DataSource=IP;InitialCatalog=DB;UserID=sa;Password=password" ' 参数化SQL,避免注入风险 Dim searchSql As String = "SELECT * FROM [Table] WHERE Column1 LIKE @SearchContent" ' Using语句会自动释放资源,比手动关闭连接更可靠 Using sqlConn As New SqlConnection(connectionString) Using sqlCmd As New SqlCommand(searchSql, sqlConn) ' 添加参数,%用于模糊匹配,不需要的话直接传TextBox的内容就行 sqlCmd.Parameters.AddWithValue("@SearchContent", $"%{TextBox_Search.Text}%") Dim dataAdapter As New SqlDataAdapter(sqlCmd) Dim dataSet As New DataSet() dataAdapter.Fill(dataSet, "Table") DataGridView1.DataSource = dataSet.Tables(0) End Using End Using End Sub
重要提醒:
你原来的代码直接把TextBox1.Text拼到SQL里,这是非常危险的SQL注入漏洞,不管是原来的ID查询还是现在的搜索,都要改成上面的参数化写法,防止恶意攻击。
如果想要实时搜索(输入时自动更新结果),可以把这段查询逻辑放到TextBox_Search的TextChanged事件里,但建议加个Timer延迟个300ms左右,避免每输入一个字符就触发一次数据库请求,影响性能。
内容的提问来源于stack exchange,提问作者Omar Yassen
相关产品推荐
相关产品推荐

