Добрый день! Помогите пожалуйста советом.
Есть Datagridview, у которого в качестве datasource выступает datatable, заполненная из базы
1.
2.
3.
4.
5.
6.
7.
8.
Dim command As New SqlCommand(queryString, con)
con.Open()
Dim reader As SqlDataReader = command.ExecuteReader()
dt = New DataTable
dt.Load(reader)
------------
Datagridview.DataSource = dt
К событию Datagridview_CellEndEdit прикреплен обработчик события, который фиксирует изменения Datagridview в базе данных. Здесь все нормально.
Далее к форме я решил сделать фильтр следующим образом:
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Dim dt_filter As New DataTable
Dim str_filter As String = Me.find_cmb.SelectedValue & " like '%" & Me.txt_find.Text & "%'"
Dim foundRows() As DataRow = dt.Select(str_filter)
dt_filter.Columns.AddRange(New DataColumn() {
New DataColumn With {.ColumnName = "fld_1", .Caption = "fld_1", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_2", .Caption = "fld_2", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_3", .Caption = "fld_3", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_4", .Caption = "fld_4", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_5", .Caption = "fld_5", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_6", .Caption = "fld_6", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_7", .Caption = "fld_7", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_8", .Caption = "fld_8", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_9", .Caption = "fld_9", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_10", .Caption = "fld_10", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_11", .Caption = "fld_11", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_12", .Caption = "fld_12", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_13", .Caption = "fld_13", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_14", .Caption = "fld_14", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_15", .Caption = "fld_15", .DataType = GetType(Boolean)},
New DataColumn With {.ColumnName = "fld_16", .Caption = "fld_16", .DataType = GetType(Boolean)},
New DataColumn With {.ColumnName = "fld_17", .Caption = "fld_17", .DataType = GetType(Boolean)},
New DataColumn With {.ColumnName = "fld_18", .Caption = "fld_18", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_19", .Caption = "fld_19", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_20", .Caption = "fld_20", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_21", .Caption = "fld_21", .DataType = GetType(String)},
New DataColumn With {.ColumnName = "fld_22", .Caption = "fld_22", .DataType = GetType(String)}
})
If foundRows IsNot Nothing Then
For Each foundRow As DataRow In foundRows
Dim nw_row As DataRow = dt_filter.NewRow()
dt_filter.ImportRow(foundRow)
Next foundRow
End If
With Me.Datagridview
.DataSource = dt_filter
End With
Смысл фильтра в том, чтобы фильтрацию осуществлял клинет программы, а не БД.
Проблема: когда я редактирую Datagridview, то обработчик события обрабатывает корректно, все изменения в БД видны. Не видны изменения в datatable для Datagridview (Datagridview.DataSource = dt) и получается если отредактировать Datagridview, потом сделать фильтр, то изменения пропадают. Появляются только после перезагрузки из БД.
Что было попробовано и не помогло:
вместе с обработчиком события Datagridview_CellEndEdit вызывать метод
привязывать источник данных Datagridview через bindingsource.
Понимаю, что есть костыль в виде поиска по datatable и его "ручного" редактирования значения, но может кто-то подскажет более годное решение? Спасибо
Модератор: Тема перенесена из форума "Visual Basic".