我有一个USB控制器,来自P.I.的Xk-60。工程,配置和正常工作。 如果在控制器上按下某个键并根据返回的CID值选择一个案例,则会读取以下代码。一直都好到这里。 现在我想使用CID值动态地引用几个Checkbox。 我似乎找不到正确的方法......
这是无效的:
If e.PressState = True And **ctl.Checked** = False Then
Private Sub Xk60_80_1_ButtonChange(ByVal e As XK_60_80.XKeyEventArgs) Handles Xk60_80_1.ButtonChange
Select Case e.CID
Case 1001
Dim nbr As String = e.CID.ToString().Remove(0, 3)
Dim ctl() As Control = Me.Controls.Find("CheckBox" & nbr, True)
If e.PressState = True And ctl.Checked = False Then
CheckBox1.Checked = True
ElseIf e.PressState = True And CheckBox1.Checked = True Then
CheckBox1.Checked = False
End If
End Select
End Sub
答案 0 :(得分:2)
Controls.Find
会返回Control()
,因此可能会有多个控件。如果你想要第一个:
Dim checkBoxControl = TryCast(ctl.ElementAtOrDefault(0), CheckBox)
CheckBox1.Checked = e.PressState AndAlso
checkBoxControl IsNot Nothing AndAlso
Not checkBoxControl.Checked
请注意,我使用了AnsAlso
而不是And
这是一个短路算子,如果不满足先前的条件,它就会停止。否则,如果NullReferenceException
已经checkBoxControl.Checked
,您将在checkBoxControl
获得Nothing
。因此,请使用AndAlso
(和OrElse
)。
答案 1 :(得分:2)
Me.Controls.Find
返回一组控件。
另外Control
没有Checked
- 属性,因此最好只搜索CheckBox
类型的控件并使用第一个找到的具有相应名称的控件:
Dim ctl As CheckBox = Me.Controls.OfType(Of CheckBox).
First(Function(c) c.Name = "CheckBox" & nbr)
If e.PressState = True AndAlso ctl IsNot Nothing AndAlso ctl.Checked = False Then
CheckBox1.Checked = True
ElseIf e.PressState = True And CheckBox1.Checked = True Then
CheckBox1.Checked = False
End If
使用Tim Schmelter的答案中已经提到过的短路也更好。