我正在使用VS Community 2017在VB中编写一个简单的Windows窗体应用程序。
我有64个带有64个关联标签的复选框,名为chk1 / lbl1,最高为chk64 / lbl64。选中复选框后,我想从字符串中提取字符并在标签中显示答案:例如如果选中chk12,我希望启用lbl12并显示文本以显示字符串的第12个字符。
为了节省写入64个单独的处理程序,我试图在一个中完成。我可以提取已检查的数字(例如12)确定并将其写入字符串,但是当我尝试操作标签控件时,我得到的对象引用未设置为对象的实例'错误。
到目前为止,我提出的代码(主要是在这里搜索)是:
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
如果有人能用这个推动我的话,我将非常感激。非常感谢!
答案 0 :(得分:4)
使用复选框的Tag属性有一个老技巧
您可以使用WinForms Designer在设计时将Tag属性设置为匹配的标签名称。因此,在chk1.Tag属性中,您将分配“lbl1”字符串,依此类推所有64个复选框。
此时,事件处理程序中的代码只是
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