Есть множество способов сделать это, и то, как вы подходите к проблеме, может зависеть от ряда взаимосвязанных факторов;Сколько записей будет возвращено в разумных пределах каждый раз, когда пользователь выполняет поиск?Должен ли список по умолчанию загружаться со ВСЕМИ записями и фильтроваться только по запросу, или он должен загружаться emply и возвращать только запрошенные записи?При разумных условиях использования, будет ли DGV загружен всем содержимым таблицы или только несколькими записями, пост-поиск?
Эти и другие соображения могут повлиять или не повлиять на то, как вы решите заполнить и выполнить фильтрацию.операция.
Этот пример является довольно элементарным подходом и не использует некоторые тонкости ADO.NET, такие как DataSet, TableADapter и тому подобное.Вместо этого он выполняет фильтрацию в качестве операции «beck-end», отправляя параметризованный запрос и возвращая набор результатов в виде DataTable, который затем может быть установлен непосредственно в качестве источника данных для вашего элемента управления DGV.Я не буду удивлен, если это откроет аргумент (я имею в виду, дебаты) о путях и средствах получения данных с помощью ADO.NET.,.
В любом случае, есть и другие варианты, и я не могу быть уверен, что будет наиболее практичным и / или эффективным, учитывая мои ограниченные знания вашего дизайна.Одним из примеров может быть получение полностью заполненной DataTable в качестве члена частного класса в форме, а затем выполнение операций DataView.RowFilter с ней, используя выходные данные в качестве источника данных для вашей таблицы.Это имеет свои плюсы и минусы;В первую очередь это может быть лучше для наборов результатов ограниченного размера или для случаев, когда доступ к данным на внутреннем сервере страдает узкими местами производительности.
Замечание: мой глупый пример здесь, по сути, уточняет поиск при каждом изменении текста в текстовом поле.В зависимости от ваших потребностей вы можете настроить его так, чтобы поиск не выполнялся, пока пользователь не нажмет кнопку или клавишу ввода.
ПРИМЕЧАНИЕ. Это всего лишь один пример, и любой подобный код должен быть усовершенствован с учетом обработки исключений и адаптирован к требованиям производительности вашего проекта!
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim dgv As DataGridView = Me.DataGridView1
Me.UpdateSearch("")
End Sub
'A Function which returns a DataTable, to be used as the DataSource for a DataGridView:
Private Function ClientsDataTable(ByVal SearchCriteria As String) As DataTable
'The default popoulation of your Grid Control will determine how you
'contruct your SQL and/or set up you parameter(s); If you want it BLANK until the user enters a value in
'your textbox, you will need to modify some of the logic here . . . THIS extra-simple example
'fills the DGV with ALL records in the table if no parameter (and empty String) is passed:
Dim SQL As String = _
"SELECT ClientID, LastName, FirstName " & _
"FROM tblClient " & _
"WHERE LastName Like @LastName & '%'"
Dim dt As New DataTable
Using cn As New OleDb.OleDbConnection(My.Settings.CreateThisConnection)
Using cmd As New OleDb.OleDbCommand(SQL, cn)
cmd.Parameters.AddWithValue("@LastName", SearchCriteria)
cn.Open()
Dim dr As OleDbDataReader = cmd.ExecuteReader
dt.Load(dr)
dr.Close()
cn.Close()
End Using
End Using
Return dt
End Function
Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Me.UpdateSearch(Me.TextBox1.Text.Trim)
End Sub
Private Sub UpdateSearch(ByVal SearchCriteria As String)
Me.DataGridView1.DataSource = ClientsDataTable(SearchCriteria)
End Sub
End Class