3 / 3 / 2
Регистрация: 21.05.2015
Сообщений: 47
1

Ограничение выбора в ListBox при множественном выборе

07.08.2015, 14:00. Показов 2387. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья! Подскажите пожалуйста, как ограничить выбор до трёх включительно элементов, в ListBox при множественном выборе. Например в ListBox находится 12 элементов, но возможность выбора нужно чтобы была только трёх элементов из всех.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2015, 14:00
Ответы с готовыми решениями:

Осуществить возможность добавления, редактирования и удаления элементов данных списков при единичном и множественном выборе
Может у кого есть код для представленных задач. Буду благодарен. 1. На рабочем листе имеются два...

Возможно ли при выборе через opendialog заносить в ListBox имена файлов, а при чтении из ListBox получать путь к файлам?
Возможно ли при выборе через opendialog заносить в ListBox имена файлов, а при чтении из ListBox...

Default в множественном выборе
Здравствуйте, столкнулся с такой проблемой. В простой программе на выбор дня недели, default...

Как можно сделать так чтобы при выборе из LIstBox организацию в другом LIstBox-е отоброжались бы отделы этои организации?
Скажите pls. как можно сделать так чтобы при выборе из LIstBox организацию в другом LIstBox-е...

11
Модератор
Эксперт .NET
4251 / 3327 / 505
Регистрация: 27.01.2014
Сообщений: 6,137
07.08.2015, 16:19 2
ставь счетчик количества ListBox1.SelectedItems.Count. если рано 3-м, то при следующем клике будет происходить следующее выделение, а ты его снимай...
0
3 / 3 / 2
Регистрация: 21.05.2015
Сообщений: 47
07.08.2015, 16:44  [ТС] 3
Так я и сделал:
If ListBox1.SelectedItems.Count > 3 And Me.ListBox1.GetSelected(Me.ListBox1.SelectedIndex) = True Then Me.ListBox1.SetSelected(Me.ListBox1.SelectedIndex, False)

Только эта конструкция слегка глючная. Когда три элемента уже выделены, если кликнуть ниже, то верхний элемент снимется, а нижний, который кликнул установится. И наоборот, если кликнуть выше трёх, то всё работает правильно.

А вот как сделать, чтобы оно правильно работало, я что-то недотукаю.
0
Модератор
Эксперт .NET
4251 / 3327 / 505
Регистрация: 27.01.2014
Сообщений: 6,137
07.08.2015, 17:23 4
Vanguger, а так?

VB.NET
1
2
3
With  Me.ListBox1
If .SelectedItems.Count > 3 Then .SetSelected(.SelectedIndex, False)
End With
Добавлено через 6 минут
а что слудует за этим куском кода в методе? чтото есть?

Добавлено через 2 минуты
или вот так

VB.NET
1
2
3
With  Me.ListBox1
If .SelectedItems.Count > 3 Then .Items(.SelectedIndex).SelectionClear
End With
не помню точно, но вроде так... щас не у компа. проверить не могу
0
3 / 3 / 2
Регистрация: 21.05.2015
Сообщений: 47
07.08.2015, 17:36  [ТС] 5
Yury Komar, первый вариант точно также как и мой вариант работает. Если кликать ниже, то перескакивает. Второй выдаёт ошибку при клике на четвёртом элементе - Общий член "SelectionClear" для типа "String" не найден.

Вот весь кусок моего кода:

VB.NET
1
2
3
Private Sub ListBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles ListBox1.MouseDown
    If ListBox1.SelectedItems.Count > 3 And Me.ListBox1.GetSelected(Me.ListBox1.SelectedIndex) = True Then Me.ListBox1.SetSelected(Me.ListBox1.SelectedIndex, False)
End Sub
При отладке видно, что ListBox1.SelectedIndex равен не тому элементу, на который кликнули, а первому верхнему элементу из трёх выделенных. В итоге получается этот верхний элемент снимается, а тот по которому кликнули устанавливается.
0
Модератор
Эксперт .NET
4251 / 3327 / 505
Регистрация: 27.01.2014
Сообщений: 6,137
07.08.2015, 19:21 6
Vanguger, добрался до компа,щас тебе будет готовое решение погоди чуток...
В двух словах скажу, будем запоминать выделенные позиции и записывать их в свойство TAG твоего листбокса. Затем если выделено больше чем три строки, очистим список и быстренько выделим заново прошлые три записанных. это даст возможность выделять не последовательно а в разноброс, например сначала последний пото первы затем в середине. как угодно
0
3 / 3 / 2
Регистрация: 21.05.2015
Сообщений: 47
07.08.2015, 19:23  [ТС] 7
Ошибка сохраняется. Действительно получаем массив выделенных индексов. Есть некий FocusedIndex который содержит правильный номер выделенного элемента. Но как его получить не знаю, напрямую не получается ListBox1.FocusedIndex не работает. Yury Komar, не могли бы Вы показать пример, как через содержимое снимать выделения.
0
Модератор
Эксперт .NET
4251 / 3327 / 505
Регистрация: 27.01.2014
Сообщений: 6,137
07.08.2015, 19:36 8
Лучший ответ Сообщение было отмечено Vanguger как решение

Решение

Vanguger, focusedibdex это у ListViee. два разных контролла.

Добавлено через 1 минуту
Vanguger, держи готовый код:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub ListBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown
With ListBox1
If .SelectedItems.Count <= 3 Then
.Tag = ""
For i As Integer = 0 To .Items.Count - 1
If .GetSelected(i) = True Then .Tag &= i & Space(1)
Next
Else
.ClearSelected()
For Each item As Integer In .Tag.ToString.Trim.Split()
.SetSelected(item, True)
Next
End If
End With
End Sub
Добавлено через 8 минут
Vanguger, а искать индекс по содержимому не всегда корректно, так как в списке может оказаться два пункта абсолютно одинаковых и тогда могут быть ошибки и при поиске нужного нам всегда будет выдавать индекс первого или последнего найденного, в зависимости от условия.
3
3 / 3 / 2
Регистрация: 21.05.2015
Сообщений: 47
07.08.2015, 19:38  [ТС] 9
Yury Komar, спасибулище огромное! Вот это работает!
Интересная идея через .tag сказано мастер, а я тут втыкаю пол дня
0
Модератор
Эксперт .NET
4251 / 3327 / 505
Регистрация: 27.01.2014
Сообщений: 6,137
07.08.2015, 19:48 10
Vanguger, ну вместо TAG можно и массив и что угодно. просто чтоб избежать дополнительных переменных у него есть своя... можешь этот код сдеть универсальным заменив слова Listbox1 на SENDER и просто копировать и вставлять в любой листбок других проектов не подкорректировав только нужное количество выделений
0
3 / 3 / 2
Регистрация: 21.05.2015
Сообщений: 47
07.08.2015, 20:01  [ТС] 11
Цитата Сообщение от Yury Komar Посмотреть сообщение
Vanguger, ну вместо TAG можно и массив и что угодно. просто чтоб избежать дополнительных переменных у него есть своя... можешь этот код сдеть универсальным заменив слова Listbox1 на SENDER и просто копировать и вставлять в любой листбок других проектов не подкорректировав только нужное количество выделений
Согласен, тут уже можно варьировать. Ещё раз БлагоДарю, для меня один рабочий пример, лучше всяких гуглов, хотя и поисковик я сегодня перелопатил. На рабочих примерах как-то легче учиться.
0
Модератор
Эксперт .NET
4251 / 3327 / 505
Регистрация: 27.01.2014
Сообщений: 6,137
07.08.2015, 20:10 12
Vanguger, согласен. а если еще и с комментами. но теоретически тоже следует понимать что куда и зачем. это очень простой пример. можно вместо TAG напрямую с коллекцие выделенных элементов работать, да и по хорошему нужно было так, этот пример на скорую руку, но смысл тот же, коллекция дает тебе тот же список что мы записываем вручную в TAG. но тут проблема с поисков позиции последнего выбранного элемента, так как мы можем выделять ведь и не по порядку и получится что неизвестно какое выделение нам снять чтоб не ошибиться. поэтому в любом случае все выделения придеться скинуть и выделять заново из ранее записанных, но тогда и коллекция очистится... так что этот пример думаю удачно подходит учитывая все выше сказанеые факты.
0
07.08.2015, 20:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2015, 20:10
Помогаю со студенческими работами здесь

Вывод картинки при выборе listbox
Пишу справочник видеокарт. Использую Borland C++. Нужно сделать так, чтобы при выборе...

ListBox - событие при выборе элемента
Подскажите, как называется событие, которое происходит при выборе элемента из списка ListBox ?...

Выдает ошибку после выбора при выборе 7 параметра
Private Sub ComboBox1_Change() 'Range(&quot;D1&quot;).Select 'b = ComboBox1.Text ' ...

ListBox и его погрешность при выборе itemControl
Добрый вечер всем. Скажите пожалуйста, как решить проблему в моем случае. Есть listBox, каким...

Показать кнопку при выборе записи в ListBox-е
Нужна помощь. Есть на форме два ListBoxa и Button. Изначально Button.visible:= false, как сделать...

Смена события при выборе значения в ListBox
Всем доброго времени суток! Возникла проблема при написании курсовой... Есть программа, в ней два...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru