如何在不重复之前的文本的情况下将项目文本从 CheckedListBox 获取到 ListBox? VB.net

How to get item text from CheckedListBox to ListBox without repeating the before text? VB.net

我有一个包含 10 个名称 A 到 J 的 CheckedListBox(它是一个字符串,但在这里我只使用 abc),我想这样做以便每次用户检查某些内容时,文本将显示在列表框同时。我试过这个:

For i = 0 To chklistbxDrugAvailableList.Items.Count - 1
            Dim drugs As String = CType(chklistbxDrugAvailableList.Items(i), String)
            If chklistbxDrugAvailableList.GetItemChecked(i) Then
                listbxYourOrder.Items.Add(drugs)
            End If
           'drugs = nothing
Next

但是当我检查 A、B、C 时,列表框中的文本重复出现,如下所示:

A
A
B
A
B
C

我不知道为什么会这样。我没有将 drugs 声明为数组。即使我使用 drugs = nothing,它仍然给出重复值。

我该怎么办?对不起,如果这是一个菜鸟问题。

下面是我将如何做整件事:

Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
    'Clear the current ListBox contents.
    ListBox1.Items.Clear()

    'Get the indexes of the currently checked items.
    Dim checkedIndices = CheckedListBox1.CheckedIndices.Cast(Of Integer)()

    'Add the current index to the list if the item is being checked, otherwise remove it.
    checkedIndices = If(e.NewValue = CheckState.Checked,
                        checkedIndices.Append(e.Index),
                        checkedIndices.Except({e.Index}))

    'Get the checked items in order and add them to the ListBox.
    ListBox1.Items.AddRange(checkedIndices.OrderBy(Function(n) n).
                                           Select(Function(i) CheckedListBox1.Items(i)).
                                           ToArray())
End Sub

或者像这样:

Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
    'Get the indexes of the currently checked items.
    Dim checkedIndices = CheckedListBox1.CheckedIndices.Cast(Of Integer)()


    'Add the current index to the list if the item is being checked, otherwise remove it.
    checkedIndices = If(e.NewValue = CheckState.Checked,
                        checkedIndices.Append(e.Index),
                        checkedIndices.Except({e.Index}))

    'Get the checked items in order and add them to the ListBox.
    ListBox1.DataSource = checkedIndices.OrderBy(Function(n) n).
                                         Select(Function(i) CheckedListBox1.Items(i)).
                                         ToArray()
End Sub

不同的是,因为第二个选项使用了数据绑定,ListBox中的第一项将被默认选中。

它需要有点冗长的原因是 ItemCheck 事件在选中或取消选中项目之前引发。因此,我们需要先获取当前选中的项目,然后根据当前项目是处于选中状态还是未选中状态来添加或删除当前项目。

编辑:

这是一个不需要清除ListBox的选项:

Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
    Dim item = CheckedListBox1.Items(e.Index)

    If e.NewValue = CheckState.Checked Then
        ListBox1.Items.Add(item)
    Else
        ListBox1.Items.Remove(item)
    End If
End Sub

问题是这些项目将按照您检查它们的顺序出现在 ListBox 中,而不是它们出现在 CheckedListBox 中的顺序。其他选项使项目在两个列表中的顺序相同。

如果我理解你的问题,我会这样做:

   lstbxYourOrder.Items.Clear()
   For Each l As String In chklistbxDrugAvailableList.CheckedItems
         listbxYourOrder.Items.Add(l)
   Next