Фасетный поиск с использованием CheckedListBox в VB.net - PullRequest
0 голосов
/ 14 февраля 2020

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

Public Class Form1
    Dim main_value As String = Nothing
    Dim groupfunction_value As String = Nothing
    Dim form_value As String = Nothing
    Dim type_value As String = Nothing
    Dim variant_value As String = Nothing
    Dim finish_value As String = Nothing
    'Dim morb_value As String = Nothing
    Dim where_statement As String = Nothing
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Fill_checkboxes_no_value()
    End Sub
    Public Sub Get_checkbox_values()
        main_value = Nothing
        groupfunction_value = Nothing
        form_value = Nothing
        type_value = Nothing
        variant_value = Nothing
        finish_value = Nothing
        where_statement = Nothing

        If Me.MainListBox.CheckedItems.Count <> 0 Then
            For Each s As String In Me.MainListBox.CheckedItems
                main_value = main_value & "'" & s & "',"
            Next
            main_value = main_value.Remove(main_value.LastIndexOf(","), 1)
        End If
        If Me.GrpFnctListBox.CheckedItems.Count <> 0 Then
            For Each s1 As String In Me.GrpFnctListBox.CheckedItems
                groupfunction_value = groupfunction_value & "'" & s1 & "',"
            Next
            groupfunction_value = groupfunction_value.Remove(groupfunction_value.LastIndexOf(","), 1)
        End If
        If Me.FormListBox.CheckedItems.Count <> 0 Then
            For Each s2 As String In Me.FormListBox.CheckedItems
                form_value = form_value & "'" & s2 & "',"
            Next
            form_value = form_value.Remove(form_value.LastIndexOf(","), 1)
        End If
        If Me.TypeListBox.CheckedItems.Count <> 0 Then
            For Each s3 As String In Me.TypeListBox.CheckedItems
                type_value = type_value & "'" & s3 & "',"
            Next
            type_value = type_value.Remove(type_value.LastIndexOf(","), 1)
        End If
        If Me.VariantListBox.CheckedItems.Count <> 0 Then
            For Each s4 As String In Me.VariantListBox.CheckedItems
                variant_value = variant_value & "'" & s4 & "',"
            Next
            variant_value = variant_value.Remove(variant_value.LastIndexOf(","), 1)
        End If
        If Me.FinishListBox.CheckedItems.Count <> 0 Then
            For Each s5 As String In Me.FinishListBox.CheckedItems
                finish_value = finish_value & "'" & s5 & "',"
            Next
            finish_value = finish_value.Remove(finish_value.LastIndexOf(","), 1)
        End If


        If main_value <> Nothing Then
            where_statement = "column__24 IN (" & main_value & ") "
        End If
        If groupfunction_value <> Nothing Then
            If where_statement = Nothing Then
                where_statement = "column__26 IN (" & groupfunction_value & ") "
            Else
                where_statement = where_statement & "and column__26 IN (" & groupfunction_value & ") "
            End If
        End If


        If form_value <> Nothing Then
            If where_statement = Nothing Then
                where_statement = "column__25 IN (" & form_value & ") "
            Else
                where_statement = where_statement & "and column__25 IN (" & form_value & ") "
            End If
        End If

        If type_value <> Nothing Then
            If where_statement = Nothing Then
                where_statement = "column__30 IN (" & type_value & ") "
            Else
                where_statement = where_statement & "and column__30 IN (" & type_value & ") "
            End If
        End If

        If variant_value <> Nothing Then
            If where_statement = Nothing Then
                where_statement = "column__31 IN (" & variant_value & ") "
            Else
                where_statement = where_statement & "and column__31 IN (" & variant_value & ") "
            End If
        End If
        If finish_value <> Nothing Then
            If where_statement = Nothing Then
                where_statement = "column__21 IN (" & finish_value & ") "
            Else
                where_statement = where_statement & "and column__21 IN (" & finish_value & ") "
            End If
        End If
        If where_statement <> Nothing Then
            where_statement = " INNER JOIN SQL_Table_2 stk with (nolock) ON ext.column__03=stk.column_1 AND ext.column__04=stk.column_2 " &
                                "WHERE stk.make_or_buy='B' and " & where_statement
        End If
    End Sub
    Public Sub Fill_checkboxes_with_value(main As Boolean, groupfunction As Boolean, form As Boolean, type As Boolean, variant_ As Boolean, finish As Boolean)
        If main Then
            Dim main_sql_str As String = "SELECT DISTINCT column__24 as main FROM SQL_Table ext with (nolock)" & where_statement & " ORDER BY column__24"
            Dim main_ta As New SqlClient.SqlDataAdapter(main_sql_str, My.Settings.DBConnectionString)
            Dim main_dt As New DataTable
            main_ta.Fill(main_dt)
            Me.MainListBox.Items.Clear()
            For Each dr As DataRow In main_dt.Rows
                Me.MainListBox.Items.Add(dr(0).ToString.Trim)
            Next
            main_ta.Dispose()
            main_dt.Clear()
        End If
        If groupfunction Then
            Dim groupfunction_sql_str As String = "SELECT DISTINCT column__26 as groupfunction FROM SQL_Table ext with (nolock)" & where_statement & " ORDER BY column__26"
            Dim groupfunction_ta As New SqlClient.SqlDataAdapter(groupfunction_sql_str, My.Settings.DBConnectionString)
            Dim groupfunction_dt As New DataTable
            groupfunction_ta.Fill(groupfunction_dt)
            Me.GrpFnctListBox.Items.Clear()
            For Each dr As DataRow In groupfunction_dt.Rows
                Me.GrpFnctListBox.Items.Add(dr(0).ToString.Trim)
            Next
            groupfunction_ta.Dispose()
            groupfunction_dt.Clear()
        End If
        If form Then
            Dim form_sql_str As String = "SELECT DISTINCT column__25 as form FROM SQL_Table ext with (nolock)" & where_statement & " ORDER BY column__25"
            Dim form_ta As New SqlClient.SqlDataAdapter(form_sql_str, My.Settings.DBConnectionString)
            Dim form_dt As New DataTable
            form_ta.Fill(form_dt)
            Me.FormListBox.Items.Clear()
            For Each dr As DataRow In form_dt.Rows
                Me.FormListBox.Items.Add(dr(0).ToString.Trim)
            Next
            form_ta.Dispose()
            form_dt.Clear()
        End If
        If type Then
            Dim type_sql_str As String = "SELECT DISTINCT column__30 as [type] FROM SQL_Table ext with (nolock)" & where_statement & " ORDER BY column__30"
            Dim type_ta As New SqlClient.SqlDataAdapter(type_sql_str, My.Settings.DBConnectionString)
            Dim type_dt As New DataTable
            type_ta.Fill(type_dt)
            Me.TypeListBox.Items.Clear()
            For Each dr As DataRow In type_dt.Rows
                Me.TypeListBox.Items.Add(dr(0).ToString.Trim)
            Next
            type_ta.Dispose()
            type_dt.Clear()
        End If
        If variant_ Then
            Dim variant_sql_str As String = "SELECT DISTINCT column__31 as variant FROM SQL_Table ext with (nolock)" & where_statement & " ORDER BY column__31"
            Dim variant_ta As New SqlClient.SqlDataAdapter(variant_sql_str, My.Settings.DBConnectionString)
            Dim variant_dt As New DataTable
            variant_ta.Fill(variant_dt)
            Me.VariantListBox.Items.Clear()
            For Each dr As DataRow In variant_dt.Rows
                Me.VariantListBox.Items.Add(dr(0).ToString.Trim)
            Next
            variant_ta.Dispose()
            variant_dt.Clear()
        End If
        If finish Then
            Dim finish_sql_str As String = "SELECT DISTINCT column__21 as finish FROM SQL_Table ext with (nolock)" & where_statement & " ORDER BY column__21"
            Dim finish_ta As New SqlClient.SqlDataAdapter(finish_sql_str, My.Settings.DBConnectionString)
            Dim finish_dt As New DataTable
            finish_ta.Fill(finish_dt)
            Me.FinishListBox.Items.Clear()
            For Each dr As DataRow In finish_dt.Rows
                Me.FinishListBox.Items.Add(dr(0).ToString.Trim)
            Next
            finish_ta.Dispose()
            finish_dt.Clear()
        End If
    End Sub
    Private Sub Fill_checkboxes_no_value()

        Dim main_sql_str As String = "SELECT DISTINCT column__24 as main FROM SQL_Table ext with (nolock) " &
                                     "INNER JOIN SQL_Table_2 stk with (nolock) ON ext.column__03=stk.column_1 AND ext.column__04=stk.column_2 " &
                                     "WHERE stk.make_or_buy='B' ORDER BY column__24"
        Dim main_ta As New SqlClient.SqlDataAdapter(main_sql_str, My.Settings.DBConnectionString)
        Dim main_dt As New DataTable
        main_ta.Fill(main_dt)
        Me.MainListBox.Items.Clear()
        For Each dr As DataRow In main_dt.Rows
            Me.MainListBox.Items.Add(dr(0).ToString.Trim)
        Next
        main_ta.Dispose()
        main_dt.Clear()

        Dim groupfunction_sql_str As String = "SELECT DISTINCT column__26 as groupfunction FROM SQL_Table ext with (nolock) " &
                                              "INNER JOIN SQL_Table_2 stk with (nolock) ON ext.column__03=stk.column_1 AND ext.column__04=stk.column_2 " &
                                              "WHERE stk.make_or_buy='B' ORDER BY column__26"
        Dim groupfunction_ta As New SqlClient.SqlDataAdapter(groupfunction_sql_str, My.Settings.DBConnectionString)
        Dim groupfunction_dt As New DataTable
        groupfunction_ta.Fill(groupfunction_dt)
        Me.GrpFnctListBox.Items.Clear()
        For Each dr As DataRow In groupfunction_dt.Rows
            Me.GrpFnctListBox.Items.Add(dr(0).ToString.Trim)
        Next
        groupfunction_ta.Dispose()
        groupfunction_dt.Clear()

        Dim form_sql_str As String = "SELECT DISTINCT column__25 as form FROM SQL_Table ext with (nolock) " &
                                     "INNER JOIN SQL_Table_2 stk with (nolock) ON ext.column__03=stk.column_1 AND ext.column__04=stk.column_2 " &
                                     "WHERE stk.make_or_buy='B' ORDER BY column__25"
        Dim form_ta As New SqlClient.SqlDataAdapter(form_sql_str, My.Settings.DBConnectionString)
        Dim form_dt As New DataTable
        form_ta.Fill(form_dt)
        Me.FormListBox.Items.Clear()
        For Each dr As DataRow In form_dt.Rows
            Me.FormListBox.Items.Add(dr(0).ToString.Trim)
        Next
        form_ta.Dispose()
        form_dt.Clear()

        Dim type_sql_str As String = "SELECT DISTINCT column__30 as [type] FROM SQL_Table ext with (nolock) " &
                                     "INNER JOIN SQL_Table_2 stk with (nolock) ON ext.column__03=stk.column_1 AND ext.column__04=stk.column_2 " &
                                     "WHERE stk.make_or_buy='B' ORDER BY column__30"
        Dim type_ta As New SqlClient.SqlDataAdapter(type_sql_str, My.Settings.DBConnectionString)
        Dim type_dt As New DataTable
        type_ta.Fill(type_dt)
        Me.TypeListBox.Items.Clear()
        For Each dr As DataRow In type_dt.Rows
            Me.TypeListBox.Items.Add(dr(0).ToString.Trim)
        Next
        type_ta.Dispose()
        type_dt.Clear()

        Dim variant_sql_str As String = "SELECT DISTINCT column__31 as variant FROM SQL_Table ext with (nolock) " &
                                        "INNER JOIN SQL_Table_2 stk with (nolock) ON ext.column__03=stk.column_1 AND ext.column__04=stk.column_2 " &
                                        "WHERE stk.make_or_buy='B' ORDER BY column__31"
        Dim variant_ta As New SqlClient.SqlDataAdapter(variant_sql_str, My.Settings.DBConnectionString)
        Dim variant_dt As New DataTable
        variant_ta.Fill(variant_dt)
        Me.VariantListBox.Items.Clear()
        For Each dr As DataRow In variant_dt.Rows
            Me.VariantListBox.Items.Add(dr(0).ToString.Trim)
        Next
        variant_ta.Dispose()
        variant_dt.Clear()

        Dim finish_sql_str As String = "SELECT DISTINCT column__21 as finish FROM SQL_Table ext with (nolock) " &
                                       "INNER JOIN SQL_Table_2 stk with (nolock) ON ext.column__03=stk.column_1 AND ext.column__04=stk.column_2 " &
                                       "WHERE stk.make_or_buy='B' ORDER BY column__21"
        Dim finish_ta As New SqlClient.SqlDataAdapter(finish_sql_str, My.Settings.DBConnectionString)
        Dim finish_dt As New DataTable
        finish_ta.Fill(finish_dt)
        Me.FinishListBox.Items.Clear()
        For Each dr As DataRow In finish_dt.Rows
            Me.FinishListBox.Items.Add(dr(0).ToString.Trim)
        Next
        finish_ta.Dispose()
        finish_dt.Clear()
    End Sub
    Private Sub MainListBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles MainListBox.SelectedIndexChanged
        Get_checkbox_values()
        Fill_checkboxes_with_value(False, True, True, True, True, True)
    End Sub
    Private Sub GrpFnctListBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles GrpFnctListBox.SelectedIndexChanged
        Get_checkbox_values()
        Fill_checkboxes_with_value(True, False, True, True, True, True)
    End Sub
    Private Sub FormListBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles FormListBox.SelectedIndexChanged
        Get_checkbox_values()
        Fill_checkboxes_with_value(True, True, False, True, True, True)
    End Sub
    Private Sub TypeListBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TypeListBox.SelectedIndexChanged
        Get_checkbox_values()
        Fill_checkboxes_with_value(False, True, True, False, True, True)
    End Sub
    Private Sub VariantListBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles VariantListBox.SelectedIndexChanged
        Get_checkbox_values()
        Fill_checkboxes_with_value(False, True, True, True, False, True)
    End Sub
    Private Sub FinishListBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles FinishListBox.SelectedIndexChanged
        Get_checkbox_values()
        Fill_checkboxes_with_value(False, True, True, True, True, True)
    End Sub
End Class

Это первый раз, когда я создаю что-то подобное, и я не знаю, есть ли лучшие методы для достижения моего результата?

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

...