2010-03-24 66 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