0

別の選択に基づいてチェックリストボックス (CLB) を設定するのに苦労しています。また、最初の CLB のすべてのアイテムをチェック/チェック解除する [すべて選択] チェックボックスが上部にあることにも注意してください。コードは次のとおりです。

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 でチェックされた内容に基づいて、構造体の配列リストからの対応する値が 2 番目の CLB を埋める必要があります。次のコードは、「すべて選択」チェックボックスがクリックされるまで部分的に機能します。その時点で「すべて選択」がチェックされる前に他の値が選択されていた場合、2 番目の CLB には正しい数の対応する値が入力されますが、最新の値のみが入力されます。まだ選択されていないすべての項目の対応するすべての値の代わりに、最初の CLB の選択された項目。

どんな洞察も大歓迎です。

〜8日

4

1 に答える 1

0

ディクショナリを使用して、主要な clb1-item を対応する clb2-items にマップしました。正常に動作するサンプル コードを見てください。

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

よろしく、 ティム

編集: Generics を使用したくない場合は、代わりに Hashtable と 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
于 2010-03-24T22:08:15.620 に答える