Member 14621280 Ответов: 1

Проблема с фильтром Combobox?


Я сделал фильтрацию для следующей таблицы доступа, и она была успешно отфильтрована, но у меня есть сомнения?

1. Если я фильтрую в имени комбо, то должен показать все связанные с Мани элементы всего столбца
2. например, если я искал понедельник в день combobox и я хочу выбрать Mani в имени combo. Так что все Мани, день и сумма должны фильтроваться....

Проблема : если я фильтрую имя, то это был только столбец имени фильтра, если я фильтрую столбец дня, то это был только столбец дня фильтра... Пожалуйста, помогите в этом

ID	Name	Day	Amount
1	Mani	Monday	50
2	Subash	Tuesday	100
3	Mani	Tuesday	100
4	subash	Mondy	50
5	Mani	Wednesday	100
6	Subash	Wednesday	50
7	Mani	Thursday	100
8	Mani	Friday	10
9	Mani	Saturday	30
10	Subash	Saturday	20
11	Subash	Sunday	100


Что я уже пробовал:

Imports System.Data.OleDb

Public Class Form1
    Dim cmd As OleDbCommand
    Dim dr As OleDbDataReader
    Dim sql As String
    Dim str As String
    Dim da As New OleDbDataAdapter
    Dim ds As New DataSet
    Dim row As DataRow
    Dim dt As New DataTable
    Dim bs As New BindingSource
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        LD()
        fillcombo()
        fillcombo1()
        fillcombo2()
    End Sub

    Public Sub LD()
        ConnD()
        sql = "select ID,Name,Day,Amount from Empdata"
        cmd = New OleDbCommand(sql, conn)
        da = New OleDbDataAdapter(sql, conn)
        da.Fill(dt)
        bs.DataSource = dt
        dr = cmd.ExecuteReader()
        dg1.DataSource = bs
    End Sub



    Public Sub fillcombo()
        ConnD()
        Try
            sql = "select distinct Name FROM Empdata"
            cmd = New OleDbCommand(sql, conn)
            dr = cmd.ExecuteReader()
            compbo.Items.Clear()

            Do While dr.Read
                compbo.Items.Add(dr.GetValue(0).ToString)

            Loop

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        conn.Close()
        conn.Dispose()
        conn = Nothing
    End Sub

    Public Sub fillcombo1()
        ConnD()
        Try
            sql = "select distinct Day FROM Empdata"
            cmd = New OleDbCommand(sql, conn)
            dr = cmd.ExecuteReader()
            ComboBox3.Items.Clear()

            Do While dr.Read
                ComboBox3.Items.Add(dr.GetValue(0).ToString)

            Loop

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        conn.Close()
        conn.Dispose()
        conn = Nothing
    End Sub
    Public Sub fillcombo2()
        ConnD()
        Try
            sql = "select distinct Amount FROM Empdata"
            cmd = New OleDbCommand(sql, conn)
            dr = cmd.ExecuteReader()
            ComboBox2.Items.Clear()

            Do While dr.Read
                ComboBox2.Items.Add(dr.GetValue(0).ToString)

            Loop

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        conn.Close()
        conn.Dispose()
        conn = Nothing
    End Sub

    Private Sub compbo_SelectedIndexChanged(sender As Object, e As EventArgs) Handles compbo.SelectedIndexChanged
        ConnD()

        Try

            bs.Filter = "Name like '%" + compbo.Text + "%'"
            dg1.DataSource = bs

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


        conn.Close()
        dg1.Visible = True
    End Sub

    Private Sub ComboBox3_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox3.SelectedIndexChanged
        ConnD()

        Try

            bs.Filter = "Day like '%" + ComboBox3.Text + "%'"
            dg1.DataSource = bs

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


        conn.Close()
        dg1.Visible = True
    End Sub

    Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
        ConnD()

        Try

            bs.Filter = "Amount like '%" + ComboBox2.Text + "%'"
            dg1.DataSource = bs

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


        conn.Close()
        dg1.Visible = True
    End Sub
End Class

1 Ответов

Рейтинг:
0

Wendelius

Если я правильно понял ваш вопрос, проблема заключается в том, что вы используете каждый combobox в качестве отдельного фильтра, который удаляет все предыдущие фильтры

Если вы хотите использовать все из них, я предлагаю вам обрабатывать все варианты выбора полей со списком в одном методе, а внутри этого метода вы используете все варианты выбора из всех полей со списком.

Рассмотрим следующий псевдокод

method FilteringCombo_SelectedIndexChanged
  filter as string = ""

  if FilterCombo1.SelectedIndex >= 0 then
     filter = "Amount like '%" + FilterCombo1.Text + "%'"
  end if

  if FilterCombo2.SelectedIndex >= 0 then
     if filter <> "" then
        filter = filter & " AND "
     end if
     filter = "Day like '%" + FilterCombo2.Text + "%'"
  end if

  if FilterCombo3.SelectedIndex >= 0 then
     if filter <> "" then
        filter = filter & " AND "
     end if
     filter = "Name like '%" + FilterCombo3.Text + "%'"
  end if
  
  bs.Filter = filter
end method


Member 14621280

Привет венделиус

это частная функция или публичная суб (метод FilteringCombo_SelectedIndexChanged)

Member 14621280

Я не могу понять, как это пишется ... где я должен это делать

Member 14621280

Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) обрабатывает ComboBox2.SelectedIndexChanged
Тусклый фильтр в виде строки = ""



Если ComboBox2.SelectedIndex >= 0, то
filter = "Amount like '%" + ComboBox2.Text + "%'"
Конец, Если

Если ComboBox3.SelectedIndex >= 0, то
Если фильтр < & gt; "" То
filter = Фильтр & " и "
Конец, Если
фильтр = "день, как '%" + ComboBox3.Текст + "%'"
Конец, Если

Если compbo.SelectedIndex >= 0 тогда
Если фильтр < & gt; "" То
filter = Фильтр & " и "
Конец, Если
filter = "Name like '%" + compbo.Текст + "%'"
Конец, Если

bs.Filter = Фильтр
Конец Подводной Лодки



Я уже писал это но каждый раз когда я должен идти первый combobox выбрать снова имя и снова я должен нажать 2 й 3 й combobox должен выбрать тогда он будет фильтровать но дело в том

1. Когда я фильтрую день и сумму, она не будет фильтроваться
2. Если я иду и выбираю фильтр имени, то снова я должен выбрать 2 и сумму, т. е. 3-й combobox, тогда он будет фильтровать
3. но после фильтрации правильное совпадение не появляется, как если бы я фильтровал все 50 сумм на имя Мани, то было показано все Мани и весь день и суммы
4. Точного совпадения не случилось

Wendelius

Похоже, что вы все еще обрабатываете только один из полей со списком в этом событии. Попробуйте изменить код для обработки всех полей со списком в одном событии

Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged, ComboBox3.SelectedIndexChanged, compbo.ComboBox2_SelectedIndexChanged

Member 14621280

ладно