Фильтрация данных по нескольким полям

Форма katalog позволяет отбирать данные по нескольким критериям. То есть, в форме есть три поля со списком, текстовое поле и флажок. Если эти поля не пустые, то строка условия должна содержать сложное условие, состоящее из простых операторов сравнения, связанных логическим И (and).

В данной форме реализован алгоритм составления строки условия для фильтрации, основанный на формировании двух массивов, соответствующих элементам управления для фильтрации. В булевском массиве в true устанавливается элемент массива, если соответствующий ему элемент управления не пустой. Второй массив типа String содержит операторы сравнения для каждого элемента. Из этого массива в строковую переменную добавляется значение, если соответствующий элемент булевского массива true. Данный алгоритм позволяет составлять строку для фильтрации по любому количеству полей.

Public Class katalog

'Заполнениеданными элементов управления формы

Private Sub katalog_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.КаталгЗапросTableAdapter.Fill(Me.КнигиDataSet.КаталгЗапрос)

Me.АвторыTableAdapter.Fill(Me.КнигиDataSet.Авторы)

Me.ЖанрTableAdapter.Fill(Me.КнигиDataSet.Жанр)

Me.ИздательствоTableAdapter.Fill(Me.КнигиDataSet.Издательство)

Me.КаталгЗапросTableAdapter.Fill(Me.КнигиDataSet.КаталгЗапрос)

cmbIzdat.SelectedIndex = -1

cmbGanr.SelectedIndex = -1

cmbAutor.SelectedIndex = -1

End Sub

'Обнуление элементов управления при отмене фильтра

Private Sub btCancelFiltr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCancelFiltr.Click

cmbIzdat.SelectedIndex = -1

cmbGanr.SelectedIndex = -1

cmbAutor.SelectedIndex = -1

txtYear.Text = ""

chSowrem.Checked = False

КаталгЗапросBindingSource.RemoveFilter()

End Sub

'Фильтрация начинается после изменения в любом элементе управления

Private Sub cmbIzdat_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbIzdat.SelectedIndexChanged

myDataSet()

End Sub

Private Sub cmbGanr_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbGanr.SelectedIndexChanged

myDataSet()

End Sub

Private Sub txtYear_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtYear.KeyDown

If e.KeyCode = Keys.Enter Then

myDataSet()

End If

End Sub

Private Sub txtYear_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtYear.Leave

myDataSet()

End Sub

Private Sub cmbAutor_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbAutor.SelectedIndexChanged

myDataSet()

End Sub

Private Sub chSowrem_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chSowrem.CheckedChanged

myDataSet()

End Sub

'Функция фильтра

Private Sub myDataSet()

Dim strSQL As String = ""

Dim strArray(4) As String 'строковый массив с условиями фильтра по всем полям

'Заполнения массива для фильтра

strArray(0) = "Жанр Like '" & cmbGanr.Text & "'"

strArray(1) = "ФИОАвтора Like '" & cmbAutor.Text & "'"

strArray(2) = "Издательство Like '" & cmbIzdat.Text & "'"

strArray(3) = "ГодИздания = " & txtYear.Text

strArray(4) = "Современ = " & chSowrem.Checked

Dim fl(4) As Boolean 'булевский массив для регистрации не пустых элементов управления

If cmbGanr.SelectedIndex <> -1 Then fl(0) = True

If cmbAutor.SelectedIndex <> -1 Then fl(1) = True

If cmbIzdat.SelectedIndex <> -1 Then fl(2) = True

If txtYear.Text <> "" Then fl(3) = True

If chSowrem.Checked Then fl(4) = True

'Формирование строки условия для фильтрации

Dim fl1 As Boolean = False 'флаг начала формирования строки

Dim i As Integer

For i = 0 To 4

If fl(i) And Not fl1 Then

strSQL = strArray(i)

fl1 = True

ElseIf fl(i) And fl1 Then

strSQL = strSQL & " and " & strArray(i)

End If

Next

'Применение фильтра по сформированной строке

КаталгЗапросBindingSource.Filter = strSQL

End SubEnd Class


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: