Получить элементы и индекс динамического c comboBox в VB.NET - PullRequest
0 голосов
/ 21 марта 2020

Я создал список из восьми динамических c comboBox через функцию combox1Gen (), а затем я загрузил в них элементы из текстового файла значений через функцию loadComboboxItems (). На каждом соответствующем элементе списка comboBox мне нужно отобразить значение и его индекс. какой код следует поместить внутри ComboTName_SelectedIndexChanged ()? Есть еще одна проблема. Мои комбо-боксы с предметами загружаются очень медленно висячим способом. что не так с моим кодом? Мой код ниже:

Public ComboBoxesTname As New List(Of ComboBox)


       Dim i As Integer = 0
        Do While i <= 7
            Combo1Gen(i)
            i = i + 1
        Loop
        loadComboboxItems()   



Private Function Combo1Gen(ByVal n As Integer) As Boolean
        Try 
            Dim newCombo As New ComboBox
            With newCombo
                .Name = "MyComboBox1" & n.ToString
                .Left = 110
                .Top = 120 + (52 * n) + 20
                .Width = 180
                .Height = 20
                .Visible = True
            End With
            ComboBoxesTname.Add(newCombo) 
            GroupBox1.Controls.Add(newCombo)
            GroupBox1.AutoSize = True
            AddHandler newCombo.SelectedIndexChanged, AddressOf ComboTName_SelectedIndexChanged
            Return True
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
            Return False
        End Try
    End Function

       Private Function loadComboboxItems() As Boolean
        Try

            Dim listT As New List(Of String)()
            listT = ReadVars.readVars(GetFolderPath.GetFolderPath("\vars\"), "items.txt")
            For i = 0 To ComboBoxesTname.Count - 1
                ComboBoxesTname(i).Items.AddRange(listT.ToArray)
            Next
            Return True
        Catch ex As Exception
            Debug.WriteLine(ex.ToString)
            MessageBox.Show("Error: " & Err.ToString)
            Return False
        End Try
        Return False
    End Function

Private Sub ComboTName_SelectedIndexChanged()

End Sub

1 Ответ

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

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

См. Комментарии и пояснения в строке.

Public ComboBoxesTname As New List(Of ComboBox)

Private Sub LoadCombos()
    For i = 0 To 7
        Combo1Gen(i)
    Next
    loadComboboxItems()
End Sub

'Since you never use the return value I changed this to a Sub
Private Sub Combo1Gen(ByVal n As Integer)
    Dim newCombo As New ComboBox
    With newCombo
        .Name = "MyComboBox1" & n.ToString
        .Left = 110
        .Top = 10 + (52 * n) + 20
        .Width = 180
        .Height = 20
        .Visible = True
    End With
    ComboBoxesTname.Add(newCombo)
    GroupBox1.Controls.Add(newCombo)
    GroupBox1.AutoSize = True
    AddHandler newCombo.SelectedIndexChanged, AddressOf ComboTName_SelectedIndexChanged
End Sub

'Since I don't have access to ReadVars I created an arbitrary array to test
Private listT As String() = {"Mathew", "Mark", "Luke", "John"}
'You should have readVars return an array of strings
'Create this once as a Form level variable so you don't have to read the file over and over
'Private listT As String() = ReadVars.readVars(GetFolderPath.GetFolderPath("\vars\"), "items.txt")

'Since you never use the return value I changed this to a Sub
Private Sub loadComboboxItems()
    For i = 0 To ComboBoxesTname.Count - 1
        ComboBoxesTname(i).Items.AddRange(listT)
    Next
End Sub

'Added the appropriate parameters
Private Sub ComboTName_SelectedIndexChanged(sender As Object, e As EventArgs)
    'Cast sender to a ComboBox so we can use the Properties of a ComboBox
    Dim Combo = DirectCast(sender, ComboBox)
    Dim Name = Combo.Name
    Dim Item = Combo.SelectedItem
    MessageBox.Show($"The selected item in {Name} is {Item}")
End Sub


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    LoadCombos()
End Sub

РЕДАКТИРОВАТЬ

В ответ на ваш вопрос в комментариях. Я добавил Function и несколько изменений в ComboTName_SelectedIndexChanged

Private Sub ComboTName_SelectedIndexChanged(sender As Object, e As EventArgs)
    'Cast sender to a ComboBox so we can use the Properties of a ComboBox
    Dim Combo = DirectCast(sender, ComboBox)
    Dim Name = Combo.Name
    Dim N As Integer = GetValueOfN(Name)
    Dim Item = Combo.SelectedItem
    MessageBox.Show($"The selected item in {Name} is {Item} The number of the combo cox is {N}")
End Sub

Private Function GetValueOfN(ComboName As String) As Integer
    Dim NumString = ComboName.Substring(ComboName.IndexOf("1") + 1)
    Return CInt(NumString)
End Function
...