0

List(Of Checkbox) で特定のチェックボックス名を検索する方法を見つけようとして苦労しています。既存のリストを検索し、特定の名前に一致するチェックボックスを別のリストに追加したいと考えています。既存のリストに、chkClass11、chkClass12、chkClass21 などの名前のチェックボックスを追加しました。

私のコードは次のとおりです。

Dim lstCheckboxes As New List(Of CheckBox)
Dim lstGroupCheckboxes As New List(Of CheckBox)

Do While intNextGroupNumber <= intTotalGroups
    Dim grpNewGroupBox = New GroupBox
    grpNewGroupBox.Name = "grpGroup" & intNextGroupNumber
    grpNewGroupBox.Text = "Group " & intNextGroupNumber
    grpNewGroupBox.Location = New Point(intCurrentXPosition, intCurrentYPosition)
    grpNewGroupBox.Size = New Size(intGroupBoxWidth, intGroupBoxHeight)
    grpNewGroupBox.AutoSize = True
    strGroupBoxNameAddArray(intArrayLocation) = "grpGroup" & intNextGroupNumber

    Do While intCurrentRow < intTotalRows
        Dim chkClassCheckBox = New CheckBox
        chkClassCheckBox.Name = "chkClass" & intNextGroupNumber & intCurrentRow
        chkClassCheckBox.Text = m_DataTableClass.Rows(intCurrentRow).Item("ClassName")
        chkClassCheckBox.Location = New Point(intCurrentXPosition, intCurrentCBYPosition)
        grpNewGroupBox.Controls.Add(chkClassCheckBox)
        lstCheckboxes.Add(chkClassCheckBox)
        intCurrentCBYPosition += 30
        intCurrentRow += 1
        intArrayLength += 1
    Loop

    Me.Controls.Add(grpNewGroupBox)

    strGroupNamesArray(1, intNextGroupNumber - 1) = grpNewGroupBox.Name ' Add group names to array to sort checked checkboxes into

    intCurrentRow = 0
    intNextGroupNumber += 1
    intCurrentGroupBoxHeight = grpNewGroupBox.Height
    intCurrentYPosition = intCurrentYPosition + intCurrentGroupBoxHeight + 50
    intCurrentCBYPosition = 15
    intArrayLocation += 1
Loop

intArrayLocation = 0

'Search strGroupBoxNameArray for next group and then insert strGroupBoxNameAddArray values
For Each Group In strGroupBoxNameAddArray
    intClassNumber = 1
    Try
        strGroupName = strGroupBoxNameAddArray(intArrayLocation)
        intGroupNumber = Microsoft.VisualBasic.Right(strGroupName, 1)

        If Not dicGroups.ContainsKey(Group) Then
            Do
                Try
                    strCheckBoxName = "chkClass" & intGroupNumber & intClassNumber
                    If lstCheckboxes.Contains(strCheckBoxName) Then
                        lstGroupCheckboxes.Add(lstCheckboxes.Item("chkClass" & intGroupNumber & intClassNumber))
                    Else
                        Exit Do
                    End If
                    intClassNumber += 1
                Catch
                    MessageBox.Show(ErrorToString)
                    Exit Do
                End Try
            Loop
            dicGroups.Add(Group, lstGroupCheckboxes)
        End If
        intArrayLocation += 1
    Catch
        MessageBox.Show(ErrorToString)
        Exit For
    End Try
Next

リストに関する適切な参考資料はありますか? リストがどのように機能するかを正確に説明する資料を見つけるのに苦労しています。

ありがとう!

私は以下を置き換えました:

Do
    Try
        strCheckBoxName = "chkClass" & intGroupNumber & intClassNumber
        If lstCheckboxes.Contains(strCheckBoxName) Then
            lstGroupCheckboxes.Add(lstCheckboxes.Item("chkClass" & intGroupNumber & intClassNumber))
        Else
            Exit Do
        End If
        intClassNumber += 1
    Catch
        MessageBox.Show(ErrorToString)
        Exit Do
    End Try
Loop

以下を使用します。

lstGroupCheckboxes.AddRange(lstCheckboxes.Where(Function(cb) cb.Name.StartsWith("chkClass" & intGroupNumber)))

しかし、次の行に問題があります。

dicGroups.Add(Group, lstGroupCheckboxes)

このディクショナリ キーにリスト lstCheckboxes を入力する際に​​問題はありませんでしたが、新しいリスト lstGroupCheckboxes を入力する際に​​問題が発生しただけです。新しいリストの形式に何か問題がありますか?

4

2 に答える 2

1

.Contains() の代わりに .Where() または .Any() を使用します。この If ブロック全体:

If lstCheckboxes.Contains(strCheckBoxName) Then

(その行だけでなく、ブロック全体)は次のようになります。

lstGroupCheckboxes.AddRange(lstCheckboxes.Where(Function(cb) cb.Name = strCheckBoxName))

Do ... ループ全体を次のように置き換えます。

lstGroupCheckboxes.AddRange(lstCheckboxes.Where(Function(cb) cb.Name.StartsWith("chkClass" & intGroupNumber))
于 2012-12-03T16:14:50.177 に答える
0

これにより、一致するすべてのチェックボックスのリストが作成されます。

lstCheckboxes.Where(function(x) x.Name=="chkClass" & intGroupNumber & intClassNumber).ToList()
于 2012-12-03T16:18:21.773 に答える