如何在表单加载时访问多个动态创建的组合框?

How to access several dymanically created Combobox at form load?

我在加载表单时创建组合框,但问题是一旦我添加了一个新的 cb,我就无法访问(设置值、编辑属性等)之前的组合框。

见下例:

Sub Start_Whosebug()

    Dim strings() As String = {"Green", "Purple", "Red"}

    Dim x as integer
    For x = LBound(strings) To UBound(strings)
        NewDropDown(x,50,100,strings(x),strings(x))
    Next x

End Sub

Private Sub NewDropDown(ByVal Number As Integer, ByVal PosX As Integer, ByVal PosY As Integer, ByVal Name As String, ByVal Text As String)
            cbComboBox = New ComboBox
            cbComboBox.Location = New Point(150, PosY - 4%)
            cbComboBox.Name = Number
            cbComboBox.ForeColor = Color.White
            cbComboBox.BackColor = Color.DarkBlue
            cbComboBox.Text = Name
            cbComboBox.AutoSize = True
            Me.Controls.Add(cbComboBox)
End Sub

这就是发生的情况,我可以很好地创建组合框,添加值,但是如果我想编辑组合框绿色(因为它是第一个),我不能。 即使我尝试这样做:

Sub Test()
    UpdateComboBoxCurrentlySelected(Green, MyValueIwantSelected)
End Sub

Sub UpdateComboBoxCurrentlySelected(ByVal SetGrpName As ComboBox, ByVal CurrentItem As String)
        SetGrpName.Text = (CurrentItem)
        SetGrpName.SelectedText = (CurrentItem)
        SetGrpName.SelectedItem = (CurrentItem)
        SetGrpName.SelectedIndex = (CurrentItem)
        SetGrpName.SelectedValue = (CurrentItem)
End Sub

任何人都可以阐明这一点,这样我就会知道如何正确地做到这一点。

谢谢

您要么需要持有对要编辑的对象的引用:

'  At form level
Private dropdowns As Dictionary(Of String, Combobox) = New Dictionary(Of String, ComboBox)

'  Populate from Sub Start_Whosebug()
Dim dropdown As ComboBox = Nothing
' ...
dropdown = NewDropDown(x,50,100,strings(x),strings(x))
dropdowns.Add(dropdown.Name, dropdown)

' change UpdateComboBoxCurrentlySelected signature to
Sub UpdateComboBoxCurrentlySelected(ByVal SetGrpName As String, ByVal CurrentItem As String)
' get the dropdown by name
Dim dropdown as ComboBox = dropdowns(SetGrpName)
' ...

或者您可以遍历表单中的所有控件,查找具有您要求的名称的控件。

Dim foundControl As ComboBox = Nothing
For Each control As Control In Me.Controls
  If control.GetType Is GetType(ComboBox) AndAlso (control.Name = SetGrpName) Then
    foundControl = control
  End If
Next

If Not Nothing Is foundControl Then
  '  Do something with your control.
End If