Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: VB: подсчет выделенных в ListView Добавлено: 17.06.03 06:21  

Автор вопроса:  Kuzmin

Приветствую.

Есть 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

Заранее благодарен.

Юрий кузьмин

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 USA



Вопросов: 1
Ответов: 184
 Профиль | | #1 Добавлено: 17.06.03 06:39

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

Ответить

Номер ответа: 2
Автор ответа:
 Kuzmin



Вопросов: 3
Ответов: 5
 Профиль | | #2 Добавлено: 17.06.03 07:09

В том и дело что не нашел никакой команды _после_выделения.

Вот все доступные события для 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

Ответить

Номер ответа: 3
Автор ответа:
 USA



Вопросов: 1
Ответов: 184
 Профиль | | #3 Добавлено: 17.06.03 07:29

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

Ответить

Номер ответа: 4
Автор ответа:
 Kuzmin



Вопросов: 3
Ответов: 5
 Профиль | | #4 Добавлено: 17.06.03 08:16

Или я чего-то не понимаю, или не так.

Чтобы было понятнее приведу пример -- окно проводника. Пользователь может кликом выбрать один файл, может с нажатым ctrl добавлять к выбору файлы, может с shift выбрать сразу несколько файлов -- в любом случае в статус-баре отображается количество выбранных.

У меня список tiff и psd файлов с различной доп. информацией (разрешение, цветовая модель и т.д.). Необходимо так же выводить информацию о количестве выбранных файлов, и необязательно над ними будет выполняться какое-то действие по нажатию кнопки (в этот момент, как я понял, ты и предлагаешь подсчитывать), эта информация о количестве сама по себе ценна. Можно конечно завести кнопочку "Подсчитать количество выделенных", но это не очень изящно.

Сейчас появилась одна идея, если получится напишу.

Ответить

Номер ответа: 5
Автор ответа:
 boevik



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #5
Добавлено: 17.06.03 08:17

Вот код для подсчёта выделенных items:

Dim i As Integer
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

Может сделать следующим образом:

If Item.Selected = True then Count = Count + 1 Else Count = Count  - 1

Item - параметр события ItemClick

Ответить

Номер ответа: 7
Автор ответа:
 Kuzmin



Вопросов: 3
Ответов: 5
 Профиль | | #7 Добавлено: 17.06.03 09:10

>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

Ответить

Номер ответа: 8
Автор ответа:
 Kuzmin



Вопросов: 3
Ответов: 5
 Профиль | | #8 Добавлено: 19.06.03 03:24

Всем спасибо. Решение найдено.

Все оказалось просто. Событие 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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам