2012-12-03 69 views
0

我很努力想弄清楚如何搜索List(Of Checkbox)以獲取特定的複選框名稱。我想搜索現有列表,並將與特定名稱匹配的複選框添加到另一個列表。在現有的名單,我添加複選框以名字例如:chkClass11,chkClass12,chkClass21等如何正確使用List(Of T).Contains方法?

我的代碼如下:

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,我只是有一個問題填充新列表lstGroupChe ckboxes。新列表的格式有問題嗎?

+0

是否可以向我們展示lstCheckboxes的聲明? – Mr47

+0

你使用什麼版本的.net?爲什麼不使用linq? – linkerro

+0

我已添加您所請求的聲明代碼。我不太清楚如何使用linq。我正在使用VB 2010. – J2Tuner

回答

1

使用.Where()或.Any()而不是.Contains()。這整個如果塊:

If lstCheckboxes.Contains(strCheckBoxName) Then 

(整個塊,而不僅僅是線)能夠成爲:

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

更換整個操作循環與此:

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

如果我刪除整個塊,此代碼將使我陷入無限循環。當lstCheckboxes不包含名稱爲strCheckBoxName的複選框時,如何退出我的Do ... Loop? – J2Tuner

+0

你有一個無限循環,因爲你的循環沒有條件。 Exit Do代碼是一種很奇怪的寫法。我建議完全刪除循環,並修改我發佈的代碼以允許任何類號。即刻編輯即刻顯示。 –

+0

明白了。現在它更有意義。我真的很努力尋找名單上的信息。你知道我在哪裏可以找到更多關於這方面的信息嗎? – J2Tuner

0

這將創建一個匹配所有複選框的列表:

lstCheckboxes.Where(function(x) x.Name=="chkClass" & intGroupNumber & intClassNumber).ToList() 
+0

我沒有能夠得到這個工作。它給了我下面的錯誤:「重載解析失敗,因爲沒有可訪問的'哪裏可以用這些參數調用」 – J2Tuner

相關問題