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

Vb.net Visual Basic:从复选框控件派生的变量引用标签控件,vb.net,checkbox,Vb.net,Checkbox,我正在使用VS Community 2017在VB中编写一个简单的Windows窗体应用程序 我有64个复选框和64个相关标签,分别命名为chk1/lbl1和chk64/lbl64。选中复选框时,我希望从字符串中提取一个字符并在标签中显示答案:例如,如果选中chk12,我希望启用lbl12,文本显示字符串的第12个字符 为了避免编写64个单独的处理程序,我尝试在一个处理程序中完成。我可以提取选中的数字(例如12)并将其写入字符串,但当我尝试操作label控件时,会出现“对象引用未设置为对象实例”

我正在使用VS Community 2017在VB中编写一个简单的Windows窗体应用程序

我有64个复选框和64个相关标签,分别命名为chk1/lbl1和chk64/lbl64。选中复选框时,我希望从字符串中提取一个字符并在标签中显示答案:例如,如果选中chk12,我希望启用lbl12,文本显示字符串的第12个字符

为了避免编写64个单独的处理程序,我尝试在一个处理程序中完成。我可以提取选中的数字(例如12)并将其写入字符串,但当我尝试操作label控件时,会出现“对象引用未设置为对象实例”错误

到目前为止,我(主要是在这里搜索)得到的代码是:


如果有人能把我推过这条线,我将非常感激。非常感谢

使用复选框的Tag属性有一个老把戏。
可以在设计时使用WinForms Designer将标记属性设置为匹配的标签名称。因此,在chk1.Tag属性中,您将为所有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

使用复选框的Tag属性有一个老把戏。
可以在设计时使用WinForms Designer将标记属性设置为匹配的标签名称。因此,在chk1.Tag属性中,您将为所有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

resultslab=“lbl”&DirectCast(发件人,复选框).Name.SubString(3)复选框的文本应该是什么?如果您没有将该属性设置为1到64之间的数字,然后尝试使用该无效文本生成标签的名称,该怎么办?然后将此行拆分为Me.Controls(resultsLabel).Enabled=True两行。Dim lbl=DirectCast(Me.Control(resultsLabel),Label))并检查是否在集合中找到了预期的标签,如果是,则可能错误在GetChar中。您是指Dim lbl=DirectCast(Me.Controls(resultsLabel),Label)的一行,以及lbl.Enabled=True的下一行吗?是的。然后使用调试器检查变量lbl是否为nothing。如果是,这意味着您的控件collectionresultsLabel=“lbl”和DirectCast(发件人,复选框)。Name.SubString(3)复选框的文本应该是什么?如果您没有将该属性设置为1到64之间的数字,然后尝试使用该无效文本生成标签的名称,该怎么办?然后将此行拆分为Me.Controls(resultsLabel).Enabled=True两行。Dim lbl=DirectCast(Me.Control(resultsLabel),Label))并检查是否在集合中找到了预期的标签,如果是,则可能错误在GetChar中。您是指Dim lbl=DirectCast(Me.Controls(resultsLabel),Label)的一行,以及lbl.Enabled=True的下一行吗?是的。然后使用调试器检查变量lbl是否为nothing。如果是,这意味着您的控件集合中没有具有该名称属性的标签如果我只是操作复选框,我可以看到这将如何工作,但看不到它将如何写入标签?代码从标记属性中静态存储的值读取标签的全名。它会将GetChar的返回值写入由chk.Tag属性标识的标签。太棒了,我可以看出这将解决我的问题!仍然得到一个对象错误,但例如“lbl1”现在正确地传递到上面找到的chk.TagAs。似乎您没有一个属性名设置为lbl1的标签,默认为label1等。是的,我认为需要进行一些简化,因为现在很明显,我已经把事情复杂化了。感谢你的指点,Steve。如果我只是操作复选框,我可以看到这将如何工作,但看不到它将如何写入标签?代码从Tag属性中静态存储的值读取标签的全名。它会将GetChar的返回值写入由chk.Tag属性标识的标签。太棒了,我可以看出这将解决我的问题!仍然得到一个对象错误,但例如“lbl1”现在正确地传递到上面找到的chk.TagAs。似乎您没有一个属性名设置为lbl1的标签,默认为label1等。是的,我认为需要进行一些简化,因为现在很明显,我已经把事情复杂化了。谢谢你的指点,史蒂夫。