多选列表框

3
我在一个表单上有一个列表框,它对我想做的事情很有效。我想要编辑表单上的项目,这意味着要填充列表框,然后选择相关项目。我的列表框包含一系列项目尺寸,我想要选择属于正在编辑的项目的尺寸。请问有人能给我一些指针吗?我尝试了 me.lstItemSizes.SetSelected(i,true) ,但这只适用于单个项目。任何帮助都将不胜感激。以下是我的代码:
    Private Sub SelectItemSizes(ByVal itemID As Integer)

    Dim itemSizes As IList(Of ItemSize) = _sizeLogic.GetItemSizes(itemID)

    Me.lstItemSizes.SelectionMode = SelectionMode.MultiExtended

    If (itemSizes.Count > 0) Then

        For i As Integer = 0 To Me.lstItemSizes.Items.Count - 1

            For x As Integer = 0 To itemSizes.Count - 1

                If (CType(Me.lstItemSizes.Items(i), PosSize).SizeID = itemSizes(x).SizeID) Then
                    Me.lstItemSizes.SetSelected(i, True)
                Else
                    Me.lstItemSizes.SetSelected(i, False)
                End If

            Next

        Next

    End If

End Sub

这段代码是导致问题的原因: '否则 Me.lstItemSizes.SetSelected(i, False)' - Richard.Gale
@Richard- 不是的,你的循环方式有问题,应该先根据项目大小计数进行循环,然后再根据列表框中的项目计数进行循环。请参考我在示例中的第三次编辑。 - JonH
4个回答

9

你是否将selectionmode设置为multi?

为了允许多项选择,您需要指定它。

然后您可以执行以下操作:

Dim i as Integer=0

For i=0 To Me.listBox.SelectedItems.Count -1
  'display the listbox value
next i

以下是屏幕截图:

enter image description here

在设置列表框属性后,根据您想要选择的值调用setselected。

me.lstItemSizes.SetSelected(3,true)
me.lstItemSizes.SetSelected(4,true)
me.lstItemSizes.SetSelected(9,true)

在这里,您可以添加20个数字,并仅选择偶数。

    Dim i As Integer

            'load the list with 20 numbers
            For i = 0 To 20
                Me.ListBox1.Items.Add(i)
            Next

            'now use setselected
            'assume only even are selected
            For i = 0 To 20
                If i Mod 2 = 0 Then
                    Me.ListBox1.SetSelected(i, True)
                End If
            Next

第三次编辑

看看你的循环方式,假设我创建了一个整数列表,我的 VB.NET 有点生疏,我主要使用 C# 进行开发。但是假设你这样做:

     Dim l As New List(Of Integer)

            l.Add(2)
            l.Add(6)
            l.Add(20)

您的列表中只有三个项目,因此首先基于列表上的项目循环,然后在列表框中的项目中,您将其相反。看这个:

 Dim i As Integer
        Dim l As New List(Of Integer)

        l.Add(2)
        l.Add(6)
        l.Add(20)

        'load the list with 20 numbers
        For i = 0 To 20
            Me.ListBox1.Items.Add(i)
        Next

        Dim lCount As Integer = 0

        For lCount = 0 To l.Count - 1
            For i = 0 To 20
                If i = l.Item(lCount) Then
                    Me.ListBox1.SetSelected(i, True)
                    Exit For
                End If
            Next
        Next

在代码中,我的l是一个包含三个项目的列表:2、6和20。 我将这些项目添加到只是一个列表对象的l中。 所以现在我必须使用这3个数字循环并与我的listbox进行比较。你的做法恰好相反,你正在循环你的listbox,然后考虑列表对象。
请注意,在我的for循环中,一旦找到列表中的项目,我就不需要再循环了,因此我使用exit for。这确保我没有过度执行所需的循环次数。一旦找到项目,请退出并返回列表对象计数。
运行我的代码后,结果如下图所示

我想显示所有可能的尺寸,但只选择与该商品相关的尺寸。例如,列表可能包含5种尺寸,但只有其中3种与我正在加载的商品相关。 - Richard.Gale
@Richard,你可以这样做,但首先在列表框的属性中,你必须确保SelectionMode设置为multisimple。 - JonH
SelectionMode 被设置为 MultiExtended。 - Richard.Gale
@Richard - 你调试过并找出为什么会发生这种情况了吗?你的答案就在那里,如果你尝试调试它的话。 - JonH

3
您需要更改ListBox.SelectionMode属性以启用多选。
可能的值由SelectionMode枚举给出,如下所示:

None:无法选择任何项目
One:只能选择一个项目
MultiSimple:可以选择多个项目
MultiExtended:可以选择多个项目,并且用户可以使用ShiftCtrl和箭头键进行选择

因此,您只需将以下行添加到已有代码中即可:
' Change the selection mode (you could also use MultiExtended here)
lstItemSizes.SelectionMode = SelectionMode.MultiSimple;

' Select any items of your choice
lstItemSizes.SetSelected(1, True)
lstItemSizes.SetSelected(3, True)
lstItemSizes.SetSelected(8, True)

另外,您可以在设计时设置SelectionMode属性,而不是使用代码。


0

因为我的代码有以下循环:

For i As Integer = 0 To Me.lstItemSizes.Items.Count - 1

        For x As Integer = 0 To itemSizes.Count - 1

            If (CType(Me.lstItemSizes.Items(i), PosSize).SizeID = itemSizes(x).SizeID) Then
                Me.lstItemSizes.SetSelected(i, True)
            Else
                Me.lstItemSizes.SetSelected(i, False)
            End If

        Next

    Next

第一个循环遍历可用的尺寸,第二个循环用于比较物品的尺寸。
有以下代码:
Else
 Me.lstItemSizes.SetSelected(i, False)
End If

这意味着即使项目i被选中,它也可以被取消选择。

解决方案: 删除Me.lstItemSizes.SetSelected(i, False)或包括Exit For


@Richard- 只想让你知道,你可能不需要为此创建答案,只需在评论中说明你只需要退出即可。虽然我很高兴你已经解决了这个问题! - JonH

0
根据MSDN的说明,SetSelected()可以用于选择多个项目。只需为需要选择的每个项目重复调用即可。这是他们使用的示例:
' Select three items from the ListBox.
listBox1.SetSelected(1, True)
listBox1.SetSelected(3, True)
listBox1.SetSelected(5, True)

供参考,这是MSDN文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接