Modify a structure field containing combobox when SelectedIndex event fires

╄→гoц情女王★ 提交于 2020-01-06 02:25:28

问题


I am trying to have a generic widget composed of a label and a value. The value is set by a combobox. Here is the structure:

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

Dim parameter1 As tParam

I'd like to modify the valueX as the SelectedIndexChanged event is fired.

For now I have set

parameter1.label.text = "Id"
parameter1.comboBox.Tag = parameter1 ' the struct itself
AddHandler parameter1.comboBox.SelectedIndexChanged, AddressOf updateParam

and in the handler

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

The problem is that I have a lot (>50) parameters of type tParam and I like not to check every parameter name with the select case.

Note that I am calling directly parameter1 in the handler, because parameterX (=sender.Tag) is read-only, as any update to parameterX is local.


回答1:


I cant quite tell what you are trying to do, but tStruct.ComboBox.Tag = Me seems a convoluted way to track your widgets. Using a class, you could internalize and simplify some of what it seems you are trying to do:

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

The widget is able to handle the Value change itself (again, I dont quite know what you are up to). You might have other wrapper props to expose certain info the widget is managing:

Public ReadOnly Property LabelText As String
    Get
        If myLbl IsNot Nothing Then
            Return myLbl.Text
        Else
            Return ""
        End If
    End Get
End Property

To use it:

' 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))

Elsewhere if you need to find one of these guys:

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

Alternatively, you could use a Dictionary(Of String, CBOWidgetItem) and get them back by name.



来源:https://stackoverflow.com/questions/33784711/modify-a-structure-field-containing-combobox-when-selectedindex-event-fires

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!