Как мне вести колонку флажок элементом управления datagridview состояния checkstate при фильтрации VB.NET
У меня есть dgvw.Он загружает данные из базы данных sql.Теперь я добавил столбец checkbox в dgvw.В моей winform также есть текстовое поле, которое используется для поиска в/фильтрации datagridview. Вот мой код:
Private Sub Contact_Load(sender As Object, e As EventArgs) Handles MyBase.Load filterdata("") Private Sub filterdata(valuetosearch As String) con.Open() Dim cmd As New SqlCommand("Select * from Contacts where CONCAT([Unique id],Prefix,[First name],[Last name],Gender,Title,Company,Phone,Mobile,Fax,[b.email],[p.email],Reference,Address,[Address 2],Country,City,Zip,Facebook,GooglePlus,Instagram,Twitter,Website,Salary,Currency,[Group],[Id/Status],Note,[Added by]) like '%" & valuetosearch & "%' ", con) Dim reader As SqlDataReader = cmd.ExecuteReader Dim dt As New DataTable dt.Load(reader) userdatagrid.AutoGenerateColumns = True userdatagrid.DataSource = dt userdatagrid.Refresh() con.Close() End Sub Private Sub searcgcon_TextChanged(sender As Object, e As EventArgs) Handles searcgcon.TextChanged If searcgcon.Text = "" Then filterdata("") entrylabel.Text = "There are/is " & userdatagrid.Rows.Count & " contact entries" Else filterdata(searcgcon.Text) entrylabel.Text = "There are/is " & userdatagrid.Rows.Count & " contact entries that contain your query :" & searcgcon.Text End If End Sub
Проблема с этим кодом заключается в том, что предположим, что я установил флажок строки, а затем пытаюсь ввести что-то в текстовое поле/Фильтр с помощью текстового поля.Но как только я начинаю печатать, флажок, который был установлен ранее, становится непроверенным.Я знаю, что где-то ошибаюсь.Я получил этот код с youtube и stackoverflow.Так что, пожалуйста, помогите мне.Как я могу поддерживать checkstate во время фильтрации ?
Что я уже пробовал:
На других форумах мне говорили, что моя ошибка заключается в том, что я продолжаю загружать данные из реальной базы данных, а не из отфильтрованной. Я явно понятия не имею, что делать и что менять в коде.Любая помощь будет оценена по достоинству!
A_Griffin
Не знаю, почему вы чувствуете необходимость в условии If в searcgcon.Код события TextChanged, но в любом случае... когда вы фильтруете, datagrid повторно заполняется после нового поиска, поэтому, конечно, любые флажки вернутся в свое состояние по умолчанию, если вы каким-то образом не сохраните его сначала. Вы можете, если это однопользовательское приложение, добавить столбец в таблицу базы данных, соответствующий проверенному состоянию каждой строки, и сохранить его там. Или иметь доступный массив или список, в котором можно сохранить значения идентификаторов проверенных строк, а затем сравнить их при повторной привязке (событие DataRowBound)
Member 13336882
неужели нет другого выхода, сэр?Другие форумы предложили мне изучить Dataview,defaultview и rowfilter.Они сказали,что после изучения их я смогу достичь своей цели...не могли бы вы объяснить, как эти три связаны с моей проблемой ?
A_Griffin
Это не поможет решить вашу проблему, хотя может сделать ваш код более эффективным. Сделайте ваши данные глобально доступными, а затем в searcgcon.Событие TextChanged вы можете вместо повторного вызова базы данных привязать к отфильтрованному DataView исходного набора данных. Однако, привязка к сетке равно снимите флажки. Вам нужно каким-то образом сохранить их состояние перед повторной привязкой к вашим отфильтрованным результатам поиска.
Или ... вместо того чтобы снова искать в базе данных, выполните цикл по каждой ячейке в datagridview и проверьте ее содержимое в соответствии с критериями поиска - и установите видимость строк = независимо от того, найдено ли совпадение. Но это может быть несколько трудоемким для большого набора данных и не очень хорошо работать при каждом нажатии клавиши. Если вы используете такой подход, то вам лучше иметь отдельную кнопку поиска, которую они должны нажимать, а не делать это на каждом событии TextChanged.
Member 13336882
oke...so теперь я использую кнопку поиска.Не могли бы вы помочь мне с каким-нибудь кодом ? а что происходит, когда пользователь заканчивает поиск и хочет вернуться к основному datagridview/datatable ? как я могу настроить кнопку Очистить текстовое поле, а также сохранить состояние флажка и дать мне исходный datagridview/dataview?(я имею в виду тот, который не фильтруется/тот, который при запуске)??