Member 13336882 Ответов: 1

Как мне вести колонку флажок элементом управления 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?(я имею в виду тот, который не фильтруется/тот, который при запуске)??

1 Ответов

Рейтинг:
1

A_Griffin

Хорошо - хорошо, если вы еще этого не сделали, вы должны сначала установить

userdatagrid.AllowUserToAddRows = False
либо в конструкторе форм, либо в событии загрузки форм.
Поместите это в событие Click вашей новой кнопки поиска:
Dim r As Integer, c As Integer
Dim bViz As Boolean = False
userdatagrid.CurrentCell = Nothing
For r = 0 To userdatagrid.Rows.Count - 1
   bViz = False
   For c = 0 To userdatagrid.Columns.Count - 1
      If userdatagrid.Rows(r).Cells(c).Value Like "*" & searcgcon.Text & "*" Then
         bViz = True
         Exit For
      End If
   Next
   userdatagrid.Rows(r).Visible = bViz
Next
Пользователи могут вернуться к исходному набору данных, просто очистив текстовое поле и выполнив поиск снова - или вы можете предоставить для этого отдельную кнопку.

Конечно, делая это таким образом, вы можете упростить свою исходную привязку данных, удалив ненужную форму предложения фильтрации.


Member 13336882

получение этой ошибки : оператор 'Like' не определен для типа 'Byte()' и строки "*a*".

Я забыл упомянуть, что у dgvw есть столбец изображений

A_Griffin

Ну тогда вам нужно будет отфильтровать столбцы по которым вы ищете чтобы включить только те которые имеют строковые значения
Для c = 0-userdatagrid.Столбцы.Количество - 1
Выберите чехол с
Case 2,4,7 ' whatever - индексы столбцов тех, у кого есть строковые значения
Если userdatagrid.Строки(r).ячейки(c).значение типа "*" & searcgcon.Текст & "*" затем
bViz = True
Выход Для
Конец, Если
Дело Другое
- не обращай внимания на эти колонки.
Следующий

Member 13336882

это новый код..не работает :

Дим р Как integer, C как целое
Dim bViz As Boolean = False
Для c = 0-userdatagrid.Столбцы.Количество - 1
Выберите чехол с
Кейс 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 ' whatever - индексы столбцов тех, у кого есть строковые значения
Если userdatagrid.Строки(r).ячейки(c).значение типа "*" & searcgcon.Текст & "*" затем
bViz = True
Выход Для
Конец, Если
Дело Другое

Конец Выбрать
- не обращай внимания на эти колонки.

Следующий

A_Griffin

ну, вам нужно отладить и выяснить, почему или где, по крайней мере.