我正在使用VS Community 2017在VB中编写一个简单的Windows Form应用程序。
我有 64 个复选框,其中包含 64 个相关标签,命名为 chk1/lbl1 到 chk64/lbl64。选中复选框后,我想从字符串中提取一个字符并在标签中显示答案:例如,如果选中 chk12,我希望启用 lbl12 并且文本显示字符串的第 12 个字符。
为了节省编写 64 个单独的处理程序,我正在尝试在一个处理程序中完成。我可以提取选中的数字(例如 12(OK 并将其写入字符串,但是当我尝试操作标签控件时,出现"对象引用未设置为对象的实例"错误。
到目前为止,我想出的代码(主要是通过搜索(是:
Private Sub CheckedChanged(sender As Object, e As EventArgs) _
Handles chk1.CheckedChanged, chk2.CheckedChanged 'etc. to 64
' wanted behaviour
'If chk1.Checked Then
' lbl1.Enabled = True
' lbl1.Text = GetChar(userString, 1)
'End If
'If chk2Checked Then
' lbl2.Enabled = True
' lbl2.Text = GetChar(userString, 2)
'End If
' etc. (to 64)
Dim resultsLabel As String
Dim userCheckedBox As Integer
userCheckedBox = CInt(DirectCast(sender, CheckBox).Text)
resultsLabel = "lbl" & DirectCast(sender, CheckBox).Text
Me.Controls(resultsLabel).Enabled = True
Me.Controls(resultsLabel).Text = GetChar(userString, userCheckedBox)
End Sub
如果有人能用这个推动我,我将不胜感激。非常感谢!
有一个古老的技巧是使用复选框的 Tag 属性。
可以在设计时使用 WinForms 设计器将 Tag 属性设置为匹配的标签名称。所以在 chk1 中。标记属性,您将为所有 64 个复选框分配"lbl1"字符串,依此类推。
此时,事件处理程序中的代码只是
Dim chk = DirectCast(sender, CheckBox)
if chk IsNot Nothing Then
Me.Controls(chk.Tag.ToString()).Enabled = True
Me.Controls(chk.Tag.ToString()).Text = GetChar(userString, CInt(chk.Text))
End If