Vb.net 当SelectedIndex事件激发时,修改包含combobox的结构字段

Vb.net 当SelectedIndex事件激发时,修改包含combobox的结构字段,vb.net,combobox,Vb.net,Combobox,我正在尝试创建一个由标签和值组成的通用小部件。该值由组合框设置。结构如下: Structure tParam Dim label As Label Dim comboBox As ComboBox Dim valueX As String End Structure Dim parameter1 As tParam 我想在触发SelectedIndexChanged事件时修改valueX 现在我已经准备好了 parameter1.label.text = "Id" p

我正在尝试创建一个由标签和值组成的通用小部件。该值由组合框设置。结构如下:

Structure tParam
    Dim label As Label
    Dim comboBox As ComboBox
    Dim valueX As String
End Structure

Dim parameter1 As tParam
我想在触发SelectedIndexChanged事件时修改valueX

现在我已经准备好了

parameter1.label.text = "Id"
parameter1.comboBox.Tag = parameter1 ' the struct itself
AddHandler parameter1.comboBox.SelectedIndexChanged, AddressOf updateParam
在处理程序中

Private Sub updateParam(sender As Object, e As System.EventArgs)
    Dim parameterX As tParam = sender.Tag

    With parameterX
        Select Case .label.Text
            Case "Id"
                parameter1.valueX = .comboBox.SelectedIndex
        End Select
   End Sub
问题是我有很多(>50)tParam类型的参数,我不喜欢用select case检查每个参数名称


请注意,我直接调用处理程序中的parameter1,因为parameterX(=sender.Tag)是只读的,因为对parameterX的任何更新都是本地的。

我不太清楚您想做什么,但是
tStruct.ComboBox.Tag=Me
似乎是一种复杂的跟踪小部件的方法。通过使用类,您可以内部化和简化一些您似乎正在尝试做的事情:

Public Class CBOWidgetItem

    Private WithEvents myCBO As ComboBox
    Private myLbl As Label

    Public Property Name As String
    Public Property Value As String

    Public Sub New(n As String, cbo As ComboBox, lbl As Label)
        Name = n
        myCBO = cbo
        myLbl = lbl
    End Sub

    Private Sub myCBO_SelectedIndexChanged(sender As Object,
                          e As EventArgs) Handles myCBO.SelectedIndexChanged
        Value = myCBO.SelectedIndex.ToString
    End Sub

    Public Overrides Function ToString() As String
        Return Name
    End Function

End Class
小部件能够自行处理值更改(同样,我不太清楚您在忙什么)。您可能有其他包装道具来公开小部件正在管理的某些信息:

Public ReadOnly Property LabelText As String
    Get
        If myLbl IsNot Nothing Then
            Return myLbl.Text
        Else
            Return ""
        End If
    End Get
End Property
要使用它:

' something to store them in:
Private widgets As List(Of CBOWidgetItem)
...
widgets = New List(Of CBOWidgetItem)

' long form
Dim temp As New CBOWidgetItem("ID", ComboBox1, Label1)
widgets.Add(temp)

' short form:
widgets.Add(New CBOWidgetItem("foo", ComboBox2, Label2))
如果你需要在其他地方找到这些人中的一个:

Dim find = "ID"
Dim specificItem = widgets.Where(Function(s) s.Name = find).FirstOrDefault
If specificItem IsNot Nothing Then
    Console.WriteLine(specificItem.Name)
End If

或者,您可以使用
字典(字符串,CBOWidgetItem)
并按名称取回它们。

如果您将这些东西存储在一个集合中,您可以很容易地找到正确的东西。字典是一种方法,列表可以使用linq找到合适的字典。它也可以使用一个类进行重构,这样他们就很难(也许)按照你的建议在一个类中转换我的结构来更新自己。解决了我的问题:当结构管理变得复杂时,创建一个类并在内部管理它。很高兴听到这个消息。这门课使它更加直截了当