使用字符串引用控件

时间:2018-04-05 14:31:07

标签: .net vb.net

我有一个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

2 个答案:

答案 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的答案中已经提到过的短路也更好。