2. DataGrid. Наложение фильтров на источники строк.
Давайте немного
модернизируем класс, который мы написали в прошлом примере.
Напишем функцию, которая
будет принимать в качестве аргумента строку фильтра и возвращать объект DataView, который также может
являться источником строк для компонента DataGrid:
'Records filters (Get The Filter String,
return DataView) Public Function
ApplyFilter(ByVal FilterString As String) As DataView If Not mDataSet Is Nothing Then ApplyFilter
= New
DataView(mDataSet.Tables("Employers")) Try
ApplyFilter.RowFilter = FilterString Catch e As
Exception
MsgBox(e.Message) End Try End If End
Function |
Как видно из текста функции, у объекта DataView есть
свойство RowFilter,
которое определяет условие отображения строк. Значение для него задаем в блоке try .. catch и
в случае если пользовательский фильтр не является допустимым, выводим сообщение
об ошибке.
Добавим на форму четыре кнопки и компонент ComboBox. Назовем их BtnSetFilter, BtnDeleteFilter, BtnFillDataSet,
FilterText. Кнопки BtnSetFilter, BtnDeleteFilter задают и удаляют фильтры для компонента mDataGrid из FilterText (ComboBox).
BthFillDataSet – заполняет сначала объект DataSet, а потом устанавливает
его в качестве источника строк для компонента DataGrid.
Зададим несколько примеров фильтров при создании
формы:
'fill FilterText values FilterText.Text = "emp_no>10" FilterText.Items.Add("emp_no>10") FilterText.Items.Add("emp_no<10") FilterText.Items.Add("first_name like
'K%'") |
Реализуем обработку событий для кнопок:
'Set the RowFilter Private Sub
BtnSetFilter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnSetFilter.Click 'set filtered DataView as mDataGrid DataSource If Len(FilterText.Text) > 0 Then Dim tmpDataView As
DataView
tmpDataView = TDataSetObj.ApplyFilter(FilterText.Text) If tmpDataView.Count > 0 Then
mDataGrid.DataSource = tmpDataView Else
MsgBox("No rows", MsgBoxStyle.Information And MsgBoxStyle.OKOnly,
"Apply Filter") End If Else
MsgBox("Set then filter", MsgBoxStyle.Exclamation,
"Filter") End If End Sub 'Delete the filter Private Sub
BtnDeleteFilter_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles BtnDeleteFilter.Click
mDataGrid.DataSource = TDataSetObj.mDataSet.Tables(0) End Sub 'Fill Data Source Again Private Sub
BtnFillDataSet_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles
BtnFillDataSet.Click
TDataSetObj.FillDataSet()
mDataGrid.DataSource = TDataSetObj.mDataSet.Tables("Employers") End Sub |
Все достаточно просто и кодирование
сводится к минимуму.
Загрузить архив с примером, Класс TDataSetObject.vb