2010-03-24 53 views
0

我在填充checkedlistbox(CLB)方面存在困難,這是基於在另一個選擇中做出的選擇。還應該注意的是,我在頂部有一個「全選」複選框,用於選中/取消選中第一個CLB中的所有項目。代碼如下:使用另一個(checkedlistbox)填充一個checkedlistbox

Private Sub chkSelectAll_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkSelectAll.CheckedChanged 
    For i As Integer = 0 To clb1.Items.Count - 1 
     clb1.SetItemChecked(i, chkSelectAll.Checked) 
    Next 
    If chkSelectAll.Checked = False Then 
     clb2.Items.Clear() 
    End If 
End Sub 

Private Sub clb1_ItemCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckEventArgs) Handles clb1.ItemCheck 
    Dim i As Integer = clb1.SelectedIndex 

    For j As Integer = 0 To al_2.Count - 1 
     If i = -1 Then 
      For k As Integer = 0 To al_2.Count - 1 
       If Not clb2.Items.Contains(al_2(k).sDate) Then 
        clb2.Items.Add(al_2(k).sDate) 
       Else : k += 1 
       End If 
      Next 
     ElseIf (e.NewValue = CheckState.Checked And al_2(j).sName = al_1(i)) Then 
      clb2.Items.Add(al_2(j).sDate) 
     ElseIf (e.NewValue = CheckState.Unchecked And al_2(j).sName = al_1(i)) Then 
      clbProdBkups.Items.Remove(al_2(j).sDate) 
     End If 
    Next 
End Sub 

第一個CLB在按鈕單擊事件中填充了數值的數組列表。根據第一個CLB中檢查的內容,來自結構數組列表的相應值應填充第二個CLB。下面的代碼部分工作,直到點擊「全選」複選框,如果在選中「全選」之前選擇了其他值,則第二個CLB被填充正確數量的對應值,但只有最近一次選擇第一個CLB的項目,而不是所有尚未選擇的項目的所有對應值。

任何見解將不勝感激。

〜第八

回答

0

我已經使用的字典映射鍵CLB1項到相應CLB2項。 看一看我的示例代碼運行正常:

Private mytable As New Generic.Dictionary(Of String, List(Of String)) 

    Sub New() 
     ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. 
     InitializeComponent() 

     mytable.Add("Object A", New List(Of String)(New String() {"Object A1", "Object A2", "Object A3"})) 
     mytable.Add("Object B", New List(Of String)(New String() {"Object B1", "Object B2", "Object B3"})) 
     mytable.Add("Object C", New List(Of String)(New String() {"Object C1", "Object C2", "Object C3"})) 
     mytable.Add("Object D", New List(Of String)(New String() {"Object D1", "Object D2", "Object D3"})) 
     mytable.Add("Object E", New List(Of String)(New String() {"Object E1", "Object E2", "Object E3"})) 

     For Each key As String In mytable.Keys 
      Me.clb1.Items.Add(key, False) 
     Next 
    End Sub 

    Private Sub chkSelectAll_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChkSelectAll.CheckedChanged 
     For i As Int32 = 0 To Me.clb1.Items.Count - 1 
      Me.clb1.SetItemChecked(i, ChkSelectAll.Checked) 
     Next 
    End Sub 

    Private Sub clb1_ItemCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckEventArgs) Handles clb1.ItemCheck 
     Dim key As String = DirectCast(Me.clb1.Items(e.Index), String) 
     If e.NewValue = CheckState.Checked Then 
      For Each value As String In mytable(key) 
       Me.Clb2.Items.Add(value, False) 
      Next 
     Else 
      For Each value As String In mytable(key) 
       Me.Clb2.Items.Remove(value) 
      Next 
     End If 
    End Sub 

問候, 添

編輯: 當你不想使用泛型可以使用哈希表和ArrayList來代替。 我的示例代碼幾乎相同。 看一看:

Private mytable As New Hashtable() 

    Sub New() 
     ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. 
     InitializeComponent() 

     mytable.Add("Object A", New ArrayList(New String() {"Object A1", "Object A2", "Object A3"})) 
     mytable.Add("Object B", New ArrayList(New String() {"Object B1", "Object B2", "Object B3"})) 
     mytable.Add("Object C", New ArrayList(New String() {"Object C1", "Object C2", "Object C3"})) 
     mytable.Add("Object D", New ArrayList(New String() {"Object D1", "Object D2", "Object D3"})) 
     mytable.Add("Object E", New ArrayList(New String() {"Object E1", "Object E2", "Object E3"})) 

     For Each key As String In mytable.Keys 
      Me.clb1.Items.Add(key, False) 
     Next 
    End Sub 

    Private Sub chkSelectAll_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChkSelectAll.CheckedChanged 
     For i As Int32 = 0 To Me.clb1.Items.Count - 1 
      Me.clb1.SetItemChecked(i, ChkSelectAll.Checked) 
     Next 
    End Sub 

    Private Sub clb1_ItemCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckEventArgs) Handles clb1.ItemCheck 
     Dim key As String = DirectCast(Me.clb1.Items(e.Index), String) 
     If e.NewValue = CheckState.Checked Then 
      For Each value As String In mytable(key) 
       Me.Clb2.Items.Add(value, False) 
      Next 
     Else 
      For Each value As String In mytable(key) 
       Me.Clb2.Items.Remove(value) 
      Next 
     End If 
    End Sub 
+0

感謝您的及時回覆添但unfortunatley這個程序是工作,老闆是一個堅持,我只使用數組,的ArrayList,結構和哈希表「的稠度的緣故「* grrr *。我目前正在將您的方法應用到我被「允許」使用的工具中。我們將看到它是如何從這裏開始的。 〜8th – 8thWonder 2010-03-25 16:20:19

+0

你可以使用一個Hashtable和一個Arraylist來代替我的Dictionary和List(String)。它幾乎相同。 – 2010-03-25 18:49:03

+0

小心示範?我吮吸哈希表:( – 8thWonder 2010-03-26 13:10:36