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