Множественный список выбора - PullRequest
3 голосов
/ 30 марта 2011

У меня есть поле со списком в форме, и оно отлично работает для того, что я хочу сделать.

Я хочу изменить элементы в форме, это означает заполнение списка и затем выбор соответствующих элементов.

Мой список содержит список размеров элементов, я хочу выбрать размеры, которые относятся к редактируемому элементу.

Пожалуйста, кто-нибудь может дать мне несколько советов.

Я пытался 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

Ответы [ 4 ]

7 голосов
/ 30 марта 2011

Вы установили режим выделения на несколько?

Необходимо указать это, чтобы разрешить множественный выбор.

Тогда вы можете сделать:

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

3-е редактирование

Посмотрите, как вы зацикливаетесь, давайте предположим, что я создаю список целых чисел, мой 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

В коде my l список всего из 3 пунктов: 2, 6 и 20. Я добавляю эти элементы в l, который является просто объектом списка. Так что теперь я должен циклически использовать эти 3 числа и сравнить с моим списком. Это происходит наоборот, вы зацикливаетесь на списке и затем учитываете объект списка.

Обратите внимание, что в моем цикле for после того, как элемент в моем списке найден, мне больше не нужно выполнять цикл, поэтому я exit for. Это гарантирует, что я не запоздаю необходимое количество циклов. Когда предмет найден, вернитесь к счетчику вашего списка объектов.

После запуска моего кода вот результат

enter image description here

2 голосов
/ 30 марта 2011

Вам необходимо изменить свойство ListBox.SelectionMode , чтобы включить множественный выбор.
Возможные значения задаются SelectionMode enum следующим образом:

Нет : элементы не могут быть выбраны
Один : можно выбрать только один элемент
MultiSimple : можно выбрать несколько элементов
MultiExtended : можно выбрать несколько элементов, и пользователь может использовать клавиши Shift , Ctrl и клавиши со стрелками для выбора


Итак, вам просто нужно добавить следующую строку в код, который у вас уже есть:

' 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 голосов
/ 30 марта 2011

Поскольку мой код имел следующие циклы:

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

0 голосов
/ 30 марта 2011

Согласно MSDN, SetSelected() может использоваться для выбора нескольких элементов. Просто повторите вызов для каждого элемента, который должен быть выбран. Вот пример, который они используют:

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

Для справки: это статья MSDN .

...