|
|
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
Всем доброй ночи! Это мое первое сообщение на форуме (если что сильно не пинайте) Вопрос в следующем.Есть программа на VB6 работает с базой mdb. Решил переписать на C#. Столкнулся с неожиданной проблемой. На VB : Выполняется запрос к базе (через ADO) и в цикле заполняется ListView (item и 4 Subitems) Всего 150000 строк (именно 150 000) на это уходит 8сек ! (Если этот же запрос сделать в Access 2000 уходит 3сек что бы появилась таблица) А если я делаю запрос из C# то до момента отображения данных в ListView проходит 130 сек!!! Причем в C# мне выскакивает сообщение (очевидно от среды NET) что все очень долго и это может привести к зависанию и т.д. ListView заполняется и в VB6 и в C# через AddItem ( я понимаю что это происходит 150000 раз) но в VB для этого надо всего 8сек а C# 130сек!! В MSDN нашел что самый лучший способ заполнить ListView через AddRegion но кода примера не нашел. Может кто что посоветует! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 01:58 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
OVRListView заполняется и в VB6 и в C# через AddItem ( я понимаю что это происходит 150000 раз) но в VB для этого надо всего 8сек а C# 130сек!! В MSDN нашел что самый лучший способ заполнить ListView через AddRegion но кода примера не нашел. Может кто что посоветует! Вот оно счастье управляемой памяти. Попробуй загрузить через дата адаптер. Это даже визуально можно сделать. И главное почитай книжки про Visual Studio, их навалом. К стати если у тебя проект на VB, лучше и под студию делать на VB. VB и C# в 2010 студии равнозначны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 03:55 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
Multy, Спасибо за ответ. Хотелось бы немного уточнить. У меня проект на VB6. Хотел переписать его под NET (не важно C# или VB) Но выходит что ListView в VB6 заполняется на порядок быстрее чем ListView из среды NET Вот я и спрашивал есть ли способ заполнить ListView в NET каким нибудь более быстрым способом кроме как через AddItem ( если можно то фрагмент кода с методом AddRegion вроде как этот способ самый быстрый для ListView в NET среде) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 04:50 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
OVR, Что-то я не понял откуда у тебя вообще такие методы AddItem и AddRegion у ListView? У меня таких нет. Есть Item.Add и Item.AddRange. Из VB 6 что ли? Используй ListBox и DataGridView в них можно подгружать напрямую из таблицы. ListBox1.DataSource = Table1 Вообще начинать нужно с книжек по ADO.NET, и Visual.Studio. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 07:16 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
On 24.11.2010 1:58, OVR wrote: Вопрос в следующем.Есть программа на VB6 работает с базой mdb. Решил > переписать на C#. Столкнулся с неожиданной проблемой. На VB : Выполняется запрос > к базе (через ADO) и в цикле заполняется ListView (item и 4 Subitems) Всего > 150000 строк (именно 150 000) на это уходит 8сек ! Первый, и САМЫЙ ГЛАВНЫЙ вопрос. Если ты на него ответишь, то все остальные вопросы отпадут сами собой. На кой фиг тебе нужно 150 тысяч строй в гриде ? ЧТО пользователь с ними будет делать ? Отвечать нужно не мне, а себе, и по возможности как можно честнее. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 10:27 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
On 24.11.2010 1:58, OVR wrote: В MSDN нашел что > самый лучший способ заполнить ListView через AddRegion но кода примера не нашел. Это ты хренотень какую-то нашёл. самый быстрый способ заполнить ListView -- это вообще его не заполнять. А использовать стиль OWNERDATA. Но это не отменяет вопроса о 150 тыщах записей. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 10:29 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
Уважаемый MasterZiv, Спасибо что обратили внимание на мой вопрос !! Вы конечно правы 150000 записей пользователю не нужны. Надеюсь у Вас хватит терпения попытаться ответить на мой вопрос. Приведу код на C# Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. Такой способ заполнения ListView очень медленный. В MSDN в описании ListView приведен пример с методом AddRange вот так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. listView1.Items.AddRange(new ListViewItem[] { item1, item2, item3 }) мне вместо { item1, item2, item3 } нужно задействовать массив созданный в моем цикле while (reader.Read()) Как это правильно сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 14:06 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
OVR, Прикол в том, что как бы ты не заполнял Items.Add или Items.AddRange. Каждый раз нужно создать ОБЪЕКТ subitem. А создание отдельных объектов в УПРАВЛЯЕМОЙ памяти NET процесс долгий. Нужно переходить на другие методы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 15:00 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
On 24.11.2010 14:06, OVR wrote: > Автор: OVR. Уважаемый MasterZiv, > Спасибо что обратили внимание на мой вопрос !! Вы конечно правы 150000 записей > пользователю не нужны. Надеюсь у Вас хватит терпения попытаться ответить на мой > вопрос. Приведу код на C# По-моему я нашёл то, что тебе нужно. // http://blogs.msdn.com/b/cumgranosalis/archive/2006/03/06/virtuallistviewusage.aspx Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 16:28 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Спасибо за ссылку но мне важно проводить сортировку а там она не поддерживается. У меня к Вам просьба я нашел на одном зарубежном форуме именно ту проблему что мы обсуждаем посмотрите пожалуйста http://www.xtremevbtalk.com/archive/index.php/t-196982.html только я не совсем понял как написать код Но результат с 13сек до 1сек Буду очень признателен если Вы мне поможете! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 17:02 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
On 24.11.2010 17:02, OVR wrote: > Спасибо за ссылку но мне важно проводить сортировку а там она не поддерживается. Кто тебе сказал такую глупость ? Поддерживается. A few things to note when using Virtual ListView controls. It does not support all ListView features. Examples are: 1. Tile View – if you are in Tile view in the ListView, it will change to LargeIcons instead. согласен. Но нахрен не надо. 2. SelectedItems/CheckedItems – these properties are not supported. Instead, use the SelectedIndices/ChecjedIndices properties to figure out which items exist in those collections. Враньё. Может имеется в виду, что WinForm-совые пропертя шарповые не поддерживаются в этом случае (не работают). Это может быть. 3. Changing amount of sub items in a ListViewItem instance – when creating ListViewItem instances, you need to make sure that it has the appropriate amount of ListViewSubItem instances in it. With regular list view, you can omit some of them and they will appear empty in the ListView. Это вообще не понимаю. Бред какой-то. 4. ArrangeIcons() – this method is not supported. Это это-то сортировка ? Она не нужна с virtual ListView. Ты просто сортируешь ДАННЫЕ, потом отображаешь их. ArrangeIcons() не нужно ни на фиг. 5. Groups – you cannot use groups in a virtual ListView. На фиг не нужно. У тебя -- REPORT VIEW, таблица. 6. Positioning of items – you cannot position ListViewItems in any of the icon modes. На фиг не нужно. У тебя -- REPORT VIEW, таблица. 7. Automatic sorting – you cannot use the Sort() method on the ListView or any associated operations. Не понял тоже . См. про ArrangeIcons(). > У меня к Вам просьба я нашел на одном зарубежном форуме именно ту проблему что > мы обсуждаем > посмотрите пожалуйста http://www.xtremevbtalk.com/archive/index.php/t-196982.html Забудь ты про этот AddRange, или как его там, уже. В общем, тема эта полагаю тебе тоже не нужна. > только я не совсем понял как написать код Но результат с 13сек до 1сек Буду > очень признателен если Вы мне поможете! Чем помочь - не понял. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2010, 19:21 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
В мсдн есть пример При задании свойству VirtualMode значения true элемент управления ListView переходит в виртуальный режим. В виртуальном режиме обычную коллекцию Items использовать нельзя. Вместо этого объекты ListViewItem создаются динамически, когда это требуется в элементе управления ListView. Виртуальный режим может быть полезен во многих случаях. Если объект ListView должен заполняться из очень большой коллекции, уже находящейся в памяти, создайте объект ListViewItem для каждой записи, которая может напрасно занимать место в памяти. В виртуальном режиме создаются только необходимые элементы. В других случаях может потребоваться часто пересчитывать значения объектов ListViewItem и выполнение этой процедуры для всей коллекции может привести к неприемлемому снижению производительности. В виртуальном режиме пересчитываются только необходимые элементы. Для использования виртуального режима следует обработать событие RetrieveVirtualItem, которое происходит каждый раз, когда в элементе управления ListView запрашивается элемент. Этот обработчик событий должен создавать объект ListViewItem, относящийся к указанному индексу. Кроме того, свойству VirtualListSize должно быть задано значение, равное размеру виртуального списка. Обработка события SearchForVirtualItem включает поиск в виртуальном режиме. Если это событие не обрабатывается, методы FindItemWithText и FindNearestItem будут возвращать значение nullNothingnullptrссылка null (Nothing в Visual Basic). Можно обрабатывать событие CacheVirtualItems для поддержки кэширования объектов ListViewItem. Если вычисление или поиск при создании объекта ListViewItem требует значительных затрат ресурсов, поддержка кэша может повысить быстродействие. Когда для свойства View задано значение Tile, это значение будет автоматически изменяться на LargeIcon, если значением свойства VirtualMode является true. В виртуальном режиме коллекция Items отключена и при попытке доступа к ней происходит исключение InvalidOperationException. Это же справедливо для коллекций CheckedItems и SelectedItems. Если требуется извлечь выбранные элементы или элементы с установленным флажком, взамен используйте коллекции SelectedIndices и CheckedIndices. Примеры В этом примере для иллюстрации используется простой элемент управления ListView, содержащий первые десять тысяч квадратов. В нем обрабатывается поиск и используется кэш для повышения производительности. Visual Basic Копировать код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. C# Копировать код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2010, 13:20 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
On 24.11.2010 17:02, OVR wrote: > очень признателен если Вы мне поможете! Я напишу пример заполнения на С#, уже начал даже, но не сейчас. Может быть на выходных. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2010, 13:21 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
Спасибо друзья!!! Обязательно попробую виртуальный режим. Посмотрите что я родил за это время Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Такой способ заполняет ListView быстрее обычного в 10 раз!! 100000 записей около 8-10 сек а обычным способом больше 2 мин ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2010, 00:54 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
On 27.11.2010 0:54, OVR wrote: > ListViewItem item1 = new ListViewItem(reader.GetValue(*0*).ToString()); Не надо вот этого вот для virtual list view. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2010, 10:11 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
OVR, где Вы достали ArrayList?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2012, 21:34 |
|
||
|
Заполнение ListView в C#
|
|||
|---|---|---|---|
|
#18+
OVR. Хотел переписать его под NET (не важно C# или VB) Это очень важно, C# для использовавших VB сложнее. Но выходит что ListView в VB6 заполняется на порядок быстрее чем ListView из среды NET Вот я и спрашивал есть ли способ заполнить ListView в NET каким нибудь более быстрым способом кроме как через AddItem Через DataSource -->Databind ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2012, 18:53 |
|
||
|
|

start [/forum/search_topic.php?author=legals&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
56ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 676ms |
| total: | 818ms |

| 0 / 0 |
