【问题标题】:Multi Select List Box多选列表框
【发布时间】:2011-07-26 04:24:44
【问题描述】:

我在表单上有一个列表框,它可以很好地完成我想做的事情。

我想编辑表单上的项目,这意味着填充列表框,然后选择相关项目。

我的列表框包含一个项目尺寸列表,我想选择属于正在编辑的项目的尺寸。

请有大神指点一下。

我尝试了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

【问题讨论】:

  • 是这段代码导致了问题:'Else Me.lstItemSizes.SetSelected(i, False)'
  • @Richard- 不是您循环的方式,您应该首先根据项目大小的计数进行循环,然后再根据列表框中的项目计数。在我的示例中查看我的第三次编辑

标签: vb.net winforms listbox multi-select


【解决方案1】:

您是否将选择模式设置为多?

您需要指定以允许多选。

那么你可以这样做:

Dim i as Integer=0

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

这是一个屏幕截图:

在列表框上设置属性后,根据您要选择的值调用 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 是一个只有 3 个项目的列表:2、6 和 20。 我将这些项目添加到 l 这只是一个列表对象。 所以现在我必须循环使用这 3 个数字并与我的列表框进行比较。与您在列表框上循环然后考虑列表对象相反。

请注意,在我的 for 循环中,一旦找到列表中的项目,我就不再需要循环,所以我 exit for。这确保了我不会超过所需的循环量。一旦找到该项目,然后返回列表对象计数的计数。

在这里运行我的代码后的结果

【讨论】:

  • 我想显示所有可能的尺寸,但只选择与项目相关的尺寸。例如。该列表可能包含 5 个尺寸,但其中只有 3 个与我正在加载的项目相关。
  • @Richard,你可以这样做,但首先在列表框的属性中,你必须确保 SelectionMode 设置为 multisimple。
  • 我已经粘贴了我的代码和问题。 SelectionMode 设置为 MultiExtended
  • @Richard - 您是否调试并找出发生这种情况的原因,如果您尝试调试它,您的答案就在那里。
【解决方案2】:

您必须更改 ListBox.SelectionMode 属性才能启用多选。
可能的值由SelectionMode enum 给出,如下:

:不能选择任何项目
一个:只能选择一个项目
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 属性,而不是使用代码进行设置。

【讨论】:

    【解决方案3】:

    根据 MSDN,SetSelected() 可用于选择多个项目。只需对需要选择的每个项目重复调用即可。这是他们使用的示例:

    ' Select three items from the ListBox.
    listBox1.SetSelected(1, True)
    listBox1.SetSelected(3, True)
    listBox1.SetSelected(5, True)
    

    供参考,this is the MSDN article

    【讨论】:

      【解决方案4】:

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

      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- 只是为了让您知道您可能不需要为此创建答案,只需在 cmets 中声明您只需要退出即可。不过,我很高兴您的问题得到了解决!
      猜你喜欢
      • 1970-01-01
      • 2012-12-25
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 2015-08-02
      相关资源
      最近更新 更多