Форма 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