Ограничить количество вариантов в MultiSelect ListBox

Есть ли способ ограничить количество вариантов, которые пользователь может выбрать в ListBox с включенным MultiSelect в Access 2003? Прямо сейчас у меня есть процедура, которая срабатывает в событии On Click, которое проверяет количество выбранных вариантов, и если оно превышает мой порог, отображается предупреждающая метка.


person mandroid    schedule 10.09.2009    source источник
comment
Просто комментарий, поскольку OP указывает, что у них включен MultiSelect, но я прошел через кроличью нору функций/проверки/очистки, прежде чем понял, что есть настройка, чтобы сделать ListBox SingleSelect lol ... См. analysistabs.com/vba-code/activex-controls/listbox/p/   -  person FreeSoftwareServers    schedule 02.02.2021


Ответы (4)


Попробуйте это. Он в основном отменяет выбор последнего выбранного элемента, если он превышает предопределенный предел:

Private Sub ListBox1_Change()

Dim counter         As Integer
Dim selectedCount   As Integer

selectedCount = 0

For counter = 1 To ListBox1.ListCount Step 1
    If ListBox1.Selected(counter - 1) = True Then 'selected method has 0 base
        selectedCount = selectedCount + 1
    End If
Next counter

If selectedCount >= 4 Then 'modify # here
    ListBox1.Selected(ListBox1.ListIndex) = False 'listindex returns the active row you just selected
    MsgBox "Limited to 4 Choices", vbInformation + vbOKOnly, "Retry:"
End If
End Sub
person Fink    schedule 10.09.2009
comment
Спасибо. ListBox.Selected(ListBox.ListIndex) был тем, что я искал. - person mandroid; 11.09.2009
comment
На самом деле нет, это не отменяет выбор последнего выбранного элемента. Он выберет последний элемент в списке, который может быть невидим. Также вы можете получить точный список, используя следующее вместо того, чтобы проверять каждый элемент списка: Me.List11.ItemsSelected.Count - person Tony Toews; 11.09.2009
comment
ага, я знал, что есть более быстрый способ вернуть выбранный счет! Я не понимаю, как он возвращает последний элемент в списке... listIndex возвращает номер активного индекса в списке, если не выбран индекс, тогда он возвращает количество списка. msdn.microsoft.com/en-us/library/aa196331 (офис.11).aspx - person Fink; 11.09.2009
comment
Он прав. ListBox.Selected(ListBox.ListIndex) = False отменяет выбор последнего выбранного элемента. Только что испытал это на себе. Вы правы насчет ItemsSelected.Count, хотя :) - person mandroid; 11.09.2009
comment
Ах, хорошо, теперь, когда я думаю об этом, я вижу, где я не прав. ListIndex является ключевым. - person Tony Toews; 12.09.2009
comment
Это приводит к нежелательному поведению при выборе сдвигом более одного за раз/больше, чем установлено ограничение. Оповещение MsgBox появляется несколько раз, так как ListBox1.Selected(ListBox1.ListIndex) = False перезапускает подпрограмму при каждом вызове. Кроме того, кажется, что он не очищает должным образом каждый выбор, только последний элемент, нажатый при удерживании клавиши Shift. К сожалению, у меня нет альтернативного решения, хотя я его ищу. - person Gaffi; 13.02.2013

Вы можете использовать событие BeforeUpdate списка, чтобы увидеть значение listbox.ItemsSelected.Count. Если это превышает ваш лимит, вы отменяете выбор (с помощью listbox.Selectec(item)=False) текущего и отменяете событие.

Here's an example : Private Sub lstItems_BeforeUpdate(Cancel As Integer)

' Warn the user that only x items can be selected.
' ------------------------------------------------
If lstItems.ItemsSelected.Count > MAX_SELECTED_ITEM_PERMITTED Then
    MsgBox "You can only select " & MAX_SELECTED_ITEM_PERMITTED & " items in this list.", vbOKOnly + vbInformation, "Error"

    ' Unselect previously selected item.
    ' ----------------------------------
    lstItems.Selected(lstItems.ListIndex) = False
    Cancel = True
End If
End Sub

person Marcand    schedule 10.09.2009
comment
Можете ли вы написать очень простой пример этого? - person mandroid; 11.09.2009

Используя коллекцию ItemsSelected из списка? Это единственный известный мне способ ограничить количество выбранных элементов. OTOH, есть некоторые действительно извращенные люди, которые могли бы найти альтернативу, поэтому я никогда не говорю никогда.

В чем проблема с этим методом?

person Tony Toews    schedule 10.09.2009
comment
Я предполагаю, что OP хотел бы либо предотвратить выбор более чем N вариантов, либо, по крайней мере, иметь возможность отменить выбор самого последнего выбора, когда они возвращают свое сообщение об ошибке/предупреждении. - person BIBD; 10.09.2009

Я бы предположил, что гораздо более управляемым, удобным и понятным пользовательским интерфейсом для этого был бы подход с парным списком, с ADD> и кнопкой после того, как пользователь достиг предела. Вам не нужно делать ничего сложного, просто проверьте ListCount в правом списке и отключите кнопку ADD>, когда она достигнет предела.

И вы избегаете многих проблем, поскольку пользователю совершенно ясно, что он делает, по сравнению с одновременным выбором нескольких элементов в одном списке. Вы можете сделать левый список множественным выбором и просто отключить кнопку ADD>, если количество ItemsSelected превышает предел, и уведомить пользователя соответствующим образом.

person David-W-Fenton    schedule 12.09.2009