如何保持checkedlistbox和结构同步

how to keep checkedlistbox and a structure in sync

我已经声明了一个结构

    Public Structure cList
        Public Name As String
        Public Path As String
        Public isChecked As Boolean
    End Structure

及其变量 -

    Public sourceList As New List(Of cList)
    Public source As cList

我有一个 CheckedListBox

What I want to achive is when any of element of checkedlistbox is selected or deselected it must reflact on

     sourceList.isChecked = False  'When Deselected

     sourceList.isChecked = True    'When Selected

好吧,这在这里无法实现,我在这个例子中使用了一种技巧。

    For index = 0 To sourceList.Count - 1
                source = sourceList(index)
                'by this way I can access every source(item) of sourceList
                 source.Name = "test"    
                 any changes
                 sourceList.Add(source)
                 'changes are reflecting to sourceList
            Next

为了实现 checkedListBox.CheckedItems 和 sourceList.isChecked 的同步,我编写了这段代码

      'First making isChecked value to false for every property in sourceList
            For index = 0 To sourceList.Count - 1
                source = sourceList(index)
                source.isChecked = False
                sourceList.Add(source)
            Next
     'Now assigning isChecked=true for Checked items of listbox
            For Each item As String In CheckedListBox1.CheckedItems
                For index = 0 To sourceList.Count - 1
                    source = sourceList(index)
                    If item = source.Name Then
                        source.isChecked = True
                        sourceList.Add(source)
                    End If
                Next
            Next

但它给出了运行时错误 选择或取消选择的每个项目都没有反映在其对应的 isChecked

有人帮忙吗??

这似乎工作得很好.. 表单加载事件处理程序只是用来填充 sourceList 并将其绑定到 CheckedListbox'. This of course populates theCheckedListBox`,其中包含 sourceList 中的项目名称

事件处理程序是重要的一点。如果 Checkbox 已经被选中,它将取消选中它并将在 sourceList 的 属性 'isChecked` 中具有相同索引值的项目标记为 false。如果该复选框已被取消选中,它将执行相反的操作。

Public Class cList
    Property Name As String
    Property Path As String
    Property IsChecked As Boolean
End Class

Public sourceList As New List(Of cList)
Public source As cList

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    sourceList.Add(New cList With {.Name = "first", .Path = "firstpath", .IsChecked = False})
    sourceList.Add(New cList With {.Name = "second", .Path = "secondpath", .IsChecked = False})
    sourceList.Add(New cList With {.Name = "third", .Path = "thirdpath", .IsChecked = False})
    CheckedListBox1.DataSource = sourceList
    CheckedListBox1.DisplayMember = "Name"
End Sub

Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
    If e.CurrentValue = CheckState.Checked Then
        e.NewValue = CheckState.Unchecked
        sourceList.Item(e.Index).IsChecked = False
    Else
        e.NewValue = CheckState.Checked
        sourceList(e.Index).IsChecked = True
    End If
    MessageBox.Show(sourceList(e.Index).Name & "  " & sourceList(e.Index).IsChecked)
End Sub