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



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

最新更新