Быстрый способ заполнить несколько комбинированных списков в WinForms - PullRequest
0 голосов
/ 31 марта 2020

Я занимаюсь разработкой приложения Windows Forms на VB. NET с использованием. NET 4.7.2. На вкладке вкладки управления у меня есть 40 элементов управления ComboBox с DropDownStyle "DropDown". Когда я захожу на вкладку, я хочу запросить базу данных и получить результаты. Возвращено чуть более 5 тысяч строк. Эта операция совсем не занимает много времени. Затем я хочу, чтобы все ComboBox-ы использовали один и тот же List, DataTable или BindingList для доступных элементов. Каждый ComboBox должен иметь возможность выбирать другое значение, не обновляя все остальные ComboBox. Каждый раз, когда я пробовал это очень медленно. Я пробовал List (Of String), DataTable и BindingList (Of String); где я устанавливаю RaiseListChangeEvents в False перед установкой источника данных. Я также попытался установить свойство DisplayMember ComboBox в «Текст» до и после установки свойства DataSource. Ничто из этого не ускорило процесс.

Это мой текущий код:

    Private Sub RefreshBOXNComboBoxes()
    Dim lFibersMaster As List(Of String) = GetFISFiberIDs()
    For i As Integer = 1 To 40
        Dim strControlName As String = "cboBOXN_Slot_" & i.ToString().PadLeft(2, "0")
        Dim objCombo As ComboBox = DirectCast(tpBOXN.Controls(strControlName), ComboBox)
        Dim blFibers As New BindingList(Of String)(lFibersMaster)
        blFibers.RaiseListChangedEvents = False
        With objCombo
            .DataSource = blFibers
            .DisplayMember = "Text"
            .SelectedIndex = -1
        End With
    Next
End Sub
Private Function GetFISFiberIDs() As List(Of String)
    Dim ret As New List(Of String)()
    Dim strConnectionString = ConfigurationManager.ConnectionStrings("FIS").ConnectionString
    Using conFIS As New OracleConnection(strConnectionString)
        conFIS.Open()

        Dim strSQL = "SELECT DISTINCT SERIAL_FIBER_ID FROM FIS.FIB_DATA_HEADER ORDER BY SERIAL_FIBER_ID"
        Using cmdFIS As New OracleCommand(strSQL, conFIS)
            Using drFIS As OracleDataReader = cmdFIS.ExecuteReader()
                While drFIS.Read()
                    ret.Add(drFIS("SERIAL_FIBER_ID").ToString())
                End While
            End Using
        End Using
        conFIS.Close()
    End Using
    Return ret
End Function

Есть предложения?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Вы можете просто l oop над элементами управления TabPage и установить для каждого источника данных ComboBox значение List(Of String).

Private Sub RefreshBOXNComboBoxes()
    Dim lFibersMaster As List(Of String) = GetFISFiberIDs()
    For Each cb As ComboBox In TabPage1.Controls().OfType(Of ComboBox)
        cb.DataSource = lFibersMaster
    Next
End Sub
0 голосов
/ 01 апреля 2020

В итоге я принял некоторые ваши предложения и пришел к выводу, что ComboBox, вероятно, не был подходящим элементом управления для хранения более 5 КБ ListItems. Вместо этого я переключил 40 ComboBox на 40 TextBox. Я установил AutoCompleteMode на «Suggest», а AutoCompleteSource на «Custom Source» для всех 40 из них. С настроенным предложением, он действительно работает как ComboBox, очень быстро и делает то, что мне нужно.

Public colFISFibers As AutoCompleteStringCollection
Private Sub RefreshBOXNFISFiberControls()
    Dim lFibersMaster As List(Of String) = GetFISFiberIDs()
    colFISFibers = New AutoCompleteStringCollection()
    colFISFibers.AddRange(lFibersMaster.ToArray())

    For i As Integer = 1 To 40
        Dim strControlName As String = "txtBOXN_Slot_" & i.ToString().PadLeft(2, "0")
        Dim objTextBox As TextBox = DirectCast(tpBOXN.Controls(strControlName), TextBox)
        With objTextBox
            .AutoCompleteCustomSource = colFISFibers
            .Text = String.Empty
        End With
    Next
End Sub
Private Function GetFISFiberIDs() As List(Of String)
    Dim ret As New List(Of String)()
    Dim strConnectionString = ConfigurationManager.ConnectionStrings("FIS").ConnectionString
    Using conFIS As New OracleConnection(strConnectionString)
        conFIS.Open()

        Dim strSQL = "SELECT DISTINCT SERIAL_FIBER_ID FROM FIS.FIB_DATA_HEADER ORDER BY SERIAL_FIBER_ID"
        Using cmdFIS As New OracleCommand(strSQL, conFIS)
            Using drFIS As OracleDataReader = cmdFIS.ExecuteReader()
                While drFIS.Read()
                    ret.Add(drFIS("SERIAL_FIBER_ID").ToString())
                End While
            End Using
        End Using
        conFIS.Close()
    End Using
    Return ret
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...