Страница: 1 |
Приветствую. Есть ListView с возможностью множественного выбора. Для подсчета количества выделенных итемов отслеживаю событие Item Click (приведено ниже). Проблема в том что при выделении с нажатым Shift достаточно большого количества итемов о-о-очень сильно тормозит (отрабатывается как кликнутый каждый итем между стартовым и кликнутым). Как посчитать выделенные по-другому? Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem) Dim i As Long numSelect = 0 For i = 1 To ListView1.ListItems.Count If ListView1.ListItems.Item(i).Selected Then numSelect = numSelect + 1 End If Next label1.Caption = "Select " + Str(numSelect) End Sub Заранее благодарен. Юрий кузьмин
По клику мыши не нужно ничего делать, наверняка после выдается команда что с выделением делать. По команде проверяй выделенные элементы и обрабатывай. В том и дело что не нашел никакой команды _после_выделения. Вот все доступные события для ListView: AfterLabelEdit BeforeLabelEdit Click ColumnClick DblClick DragDrop DragOver GotFocus ItemCheck ItemClick KeyDown KeyPress KeyUp LostFocus MouseDown MouseMove MouseUp OLECompleteDrag OLEDragDrop OLEDragOver OLEGiveFeedback OLESetData OLEStartDrag Validate Окончание выбора фиксируется нажатием кнопки, командой меню, ведь так. Просто выбрать набор и на этом останавливаться смысла не имеет. Вот когда заканчивается выбор, тогда единожды и проверяй что выбрал пользователь. Или я чего-то не понимаю, или не так. Чтобы было понятнее приведу пример -- окно проводника. Пользователь может кликом выбрать один файл, может с нажатым ctrl добавлять к выбору файлы, может с shift выбрать сразу несколько файлов -- в любом случае в статус-баре отображается количество выбранных. У меня список tiff и psd файлов с различной доп. информацией (разрешение, цветовая модель и т.д.). Необходимо так же выводить информацию о количестве выбранных файлов, и необязательно над ними будет выполняться какое-то действие по нажатию кнопки (в этот момент, как я понял, ты и предлагаешь подсчитывать), эта информация о количестве сама по себе ценна. Можно конечно завести кнопочку "Подсчитать количество выделенных", но это не очень изящно. Сейчас появилась одна идея, если получится напишу. Вот код для подсчёта выделенных items: Dim i As Integer Может сделать следующим образом: If Item.Selected = True then Count = Count + 1 Else Count = Count - 1 Item - параметр события ItemClick >If Item.Selected = True then Count = Count + 1 Else Count = Count - 1 >Item - параметр события ItemClick Если итем уже выбран и по нему кликнуть с ctrl, то выделение с него снимается, а событие ItemClick не наступает Вот так работает с мышкой нормально, но shift-up/down (c клавиатуры) не работает: Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem) Dim i As Long On Error GoTo finishSelect If ListView1.SelectedItem <> "" Then Else finishSelect: numSelect = 0 For i = 1 To ListView1.ListItems.Count If ListView1.ListItems.Item(i).Selected Then numSelect = numSelect + 1 End If Next label1.Caption = "Select " + Str(numSelect) End If End Sub ListView1.SelectedItem -- выделенный итем с которого начинается выделение при нажатом shift, в остальных случаях и по окончании -- nothing Всем спасибо. Решение найдено. Все оказалось просто. Событие ItemClick отрабатывать вообще не нужно, а подсчет вести по Click и KeyUp. В этом случае все итемы перебираются только один раз на действие. '--------------------------------------------------------------- Private Sub ListView1_Click() ShowNumSelected End Sub '--------------------------------------------------------------- Private Sub ListView1_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode >= 33 And KeyCode <= 40 Then ShowNumSelected End If End Sub '--------------------------------------------------------------- Private Sub ShowNumSelected() Dim i As Long Dim numSelect As Long numSelect = 0 For i = 1 To ListView1.ListItems.Count If ListView1.ListItems.Item(i).Selected Then numSelect = numSelect + 1 End If Next label1.Caption = "Select " + Str(numSelect) End Sub Страница: 1 |
Вопрос: VB: подсчет выделенных в ListView
Добавлено: 17.06.03 06:21
Автор вопроса: Kuzmin
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
USA
Вопросов: 1
Ответов: 184
Профиль | | #1
Добавлено: 17.06.03 06:39
Номер ответа: 2
Автор ответа:
Kuzmin
Вопросов: 3
Ответов: 5
Профиль | | #2
Добавлено: 17.06.03 07:09
Номер ответа: 3
Автор ответа:
USA
Вопросов: 1
Ответов: 184
Профиль | | #3
Добавлено: 17.06.03 07:29
Номер ответа: 4
Автор ответа:
Kuzmin
Вопросов: 3
Ответов: 5
Профиль | | #4
Добавлено: 17.06.03 08:16
Номер ответа: 5
Автор ответа:
boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #5
Добавлено: 17.06.03 08:17
Dim Counter As Integer
For i = 1 To ListView1.ListItems.Count
If ListView1.ListItems(i).Selected Then Counter = Counter + 1
Next
Debug.Print Counter
Номер ответа: 6
Автор ответа:
USA
Вопросов: 1
Ответов: 184
Профиль | | #6
Добавлено: 17.06.03 08:34
Номер ответа: 7
Автор ответа:
Kuzmin
Вопросов: 3
Ответов: 5
Профиль | | #7
Добавлено: 17.06.03 09:10
Номер ответа: 8
Автор ответа:
Kuzmin
Вопросов: 3
Ответов: 5
Профиль | | #8
Добавлено: 19.06.03 03:24