Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Выделение всех элементов LisView Добавлено: 25.03.09 15:45  

Автор вопроса:  fluke | ICQ: 318170731 
Есть ListView в виртуальном режиме. как выделить все элементы в списке?. ListView.SelectedIndices.Add("Index") и ListView.Items("Index").Selected = True, по причине низкой производительности, не подходит.

Ответить

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

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



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #1 Добавлено: 25.03.09 20:45
Если честно, а есть другой способ? Я выделение сделал так.
  1. Dim i As Integer
  2.         ListView1.Focus()
  3.         For i = 0 To ListView1.Items.Count - 1
  4.             ListView1.Items(i).Selected = True
  5.         Next

Ответить

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



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #2 Добавлено: 25.03.09 23:57
Нет, этот вариант не подходит, ListView в виртуальном режиме, а следовательно свойство Items, заблокировано. Даже если не юзать VirtualMode, перебор большого списка в цикле, уйдет в ступор..

Ответить

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



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #3 Добавлено: 26.03.09 00:38
А какова основная цель виртуального листвьюв. Если перегнать данные с него в двухмерный массив допусти ил во что то более гипкое?

Ответить

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



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #4 Добавлено: 26.03.09 10:11
Более гибкое ListView, интересно что? То что он может выделять все элементы, причем без перебора всех элементов, можно судить из реакции на нажатие клавиш (Home, Shift+End).

Ответить

Номер ответа: 5
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #5
Добавлено: 26.03.09 12:21
Надо отправить этому ListView сначала Home, Потом Shift+End:

How to: Simulate Mouse and Keyboard Events in Code (.NET)
http://msdn.microsoft.com/en-us/library/ms171548(VS.80).aspx

Ответить

Номер ответа: 6
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #6 Добавлено: 26.03.09 12:53
Пробовал, но не то. Вот к примеру, список из 10 тыс. активный элемент где-то в середине, я отправляю клавишу Home, список прокручивается в начало, потом Shift+End, список прокручивается в конец, и наконец делаю опять активным элемент, выбранный до этого. Что из этого получается, я думаю рассказывать не стоит. Для VB6.0 нарыл пример отправки сообщения элементу ListView
Call SendMessage(ListView1.hwnd, LVM_SETITEMSTATE, -1, LV), и как утверждает автор, работает. Но в .Net, не катит

Ответить

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



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #7 Добавлено: 26.03.09 12:55
Или я что-то не то делаю. Но если с помощью клавиш, это сделать можно, то по логике вещей, это можно сделать и без отправки клавиш, но как?

Ответить

Номер ответа: 8
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #8
Добавлено: 26.03.09 16:10
Но в .Net, не катит

Не катит потому, что неуправляемый код или потому, что не вписывается в твой стандарт оформления кода? Вообще-то должно работать, как утверждается в MSDN Library:

Источник: http://msdn.microsoft.com/en-us/library/bb761196(VS.85).aspx

Parameters

i Index of the list-view item. If this parameter is -1, then the state change is applied to all items.

pitem Pointer to an LVITEM structure.

Ответить

Номер ответа: 9
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #9
Добавлено: 26.03.09 16:18
P.S. Можешь сделать класс-обертку к этому вызову, чтобы в дальнейшем не загружать себя этим вопросом, просто использовать готовый программный блок по работе с ListView.

Ответить

Номер ответа: 10
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #10 Добавлено: 26.03.09 19:54
Все разобрался, всем спасибо за помощь
  1.  
  2. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW" (ByVal hwnd As IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByRef lParam As LV_ITEM) As Int32
  3.  
  4. Private Sub ListView_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
  5.     If e.Control And e.KeyCode = Keys.A Then
  6.         Dim LV_ITEM As New LV_ITEM
  7.         With LV_ITEM
  8.             .Mask = &H8
  9.             .State = &H2
  10.             .StateMask = &H2
  11.         End With
  12.         SendMessage(Me.Handle, &H102B, -1, LV_ITEM)
  13.     End If
  14. End Sub
  15.  
  16. Private Structure LV_ITEM
  17.     Dim Mask As Int32
  18.     Dim iItem As Int32
  19.     Dim iSubItem As Int32
  20.     Dim State As Int32
  21.     Dim StateMask As Int32
  22.     Dim pszText As Int32
  23.     Dim cchTextMax As Int32
  24.     Dim iImage As Int32
  25.     Dim lParam As Int32
  26.     Dim iIndent As Int32
  27. End Structure

Ответить

Номер ответа: 11
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #11
Добавлено: 27.03.09 13:08
Всегда пожалуйста. Над интересным вопросом интересно подумать. Хоть и решение ты нашел сам. Разреши поинтересоваться, для чего все это, что за программку вы создаешь, fluke?

Ответить

Номер ответа: 12
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #12 Добавлено: 27.03.09 15:10
Пишу я не прогу, а дополнение к существующей программе (бухучет). Дополнение работает с базой данных, конечно можно использовать DataView в нем даже Ctrl+A реализован, но мне больше нравиться ListView, который и использую для отображения 100-500 записей, но иногда необходимо и пару тысяч отобразить. Естественно тока VirtualMode. Но стандартный механизм управления состоянием Item-мов, для такого количества записей не подходит.

Ответить

Страница: 1 |

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



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