1

CheckBoxes がチェックされているかどうかを分析する必要があります。TabPage には 10 個の CB があり、順番に名前が付けられています (cb1、cb2、cb3 など)。

 For Each c As CheckBox In TabPage4.Controls
        If c.Checked Then
            hello = hello + 1
        End If
    Next

上記を試しましたが、未処理の例外エラーが発生します。

An unhandled exception of type 'System.InvalidCastException' occurred in WindowsApplication2.exe 
Additional information: Unable to cast object of type 'System.Windows.Forms.Label' to type 'System.Windows.Forms.CheckBox'.
4

3 に答える 3

1

ページには他のコントロールがある可能性があるため、それぞれがチェックされているかどうかを確認する必要があります。

For Each c As Control In TabPage4.Controls
    if Typeof c is CheckBox then
        if Ctype(c, Checkbox).Checked Then
            hello +=1
        End If
    End If
Next

VS のバージョンによっては、これが機能する場合があります (LINQ が必要です)。

For Each c As CheckBox In TabPage4.Controls.OfType(Of CheckBox)()
     If c.Checked Then
        hello += 1                ' looks dubious
    End If
Next

編集

Ctypeあなたの配列は基本的にCtlをCheckに変換するだけなので(CTypeが行うこと)、より高価な方法であるため、その部分に何か問題があったと思います。Ctypeが気に入らない場合(および2番目の方法を使用できない場合):

Dim chk As CheckBox
For Each c As Control In TabPage4.Controls
    if Typeof c is CheckBox then
        chk  =  Ctype(c, Checkbox)
        if chk.Checked Then
            hello +=1
        End If
    End If
Next

配列も余分なオブジェクト参照もありません。

于 2013-11-02T15:16:15.160 に答える
1

この場合は必要ないかもしれませんが、「順番に」取得する必要がある場合があります。次に例を示します。

    Dim cb As CheckBox
    Dim hello As Integer
    Dim matches() As Control
    For i As Integer = 1 To 10
        matches = Me.Controls.Find("cb" & i, True)
        If matches.Length > 0 AndAlso TypeOf matches(0) Is CheckBox Then
            cb = DirectCast(matches(0), CheckBox)
            If cb.Checked Then
                hello = hello + 1
            End If
        End If
    Next
于 2013-11-02T16:37:37.263 に答える