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找到合适的字典。它也可以使用一个类进行重构,这样他们就很难(也许)按照你的建议在一个类中转换我的结构来更新自己。解决了我的问题:当结构管理变得复杂时,创建一个类并在内部管理它。很高兴听到这个消息。这门课使它更加直截了当