Visual Basic:从复选框控件派生的变量引用标签控件

时间:2017-12-30 16:27:34

标签: vb.net checkbox

我正在使用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

如果有人能用这个推动我的话,我将非常感激。非常感谢!

1 个答案:

答案 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