|
Заполнение ListBox`а из массива циклом
|
|||
---|---|---|---|
#18+
Уважаемые друзья доброго дня. Столкнулся с следующей ситуацией - пытаюсь заполнить ListBox в форме EXCEL. Дело шло отлично до того момента, пока не потребовалось заполнять ListBox из массива который в свою очередь получает данные из SQL запроса перебираемого в цикле. Проблема в том, что каждая новая итерация затирает предыдущие значение в форме и выводит только данные полученные последней итерацией. Суть вопроса - как выводить данные накопительно? Не обнуляя при каждой итерации прежние значения ListBox? Заранее благодарен за ответы. Текущее положение дел (LBHistory - это тот самый ListBox): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2018, 11:03 |
|
Заполнение ListBox`а из массива циклом
|
|||
---|---|---|---|
#18+
Немного опишу как удалось решить данную проблему. Выхода из сложившейся ситуации нашлось два. Вкратце о каждом: 1. Данное решение пришло от специалистов с англоязычного ресурса, более известного как "Переполнение стека". Ссылка на мой вопрос ниже: https://stackoverflow.com/questions/48788698/appending-new-positions-to-a-form-listbox/48789801#48789801 Для тех кто не рубит в импортном, немного поясню суть предложений забугорных специалистов (кстати отдельное им спасибо за работающий вариант). Сама проблема связана с тем, что методы List и Count затирают информацию в ListBox пришедшую ранее и оставляют информацию только от последней итерации, поэтому для добавления новой информации необходимо пользоваться методом AddItem (что на мой взгляд не очень удобно). Поэтому речь пошла о перестройке работы алгоритма программы в таком ключе при котором к моменту заполнения ListBox информация уже была целиком совмещена. Сперва было предложено поступить следующим образом - Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Данный метод работает, но не в моём случае так как при запросе в базу данных из рекордсета прилетает не одномерный массив... Разумеется, что система начала ругаться на строку (.AddItem ArrHistory(j)) и от указанного метода пришлось отказаться. Однако к моему удовольствию вскоре поступил следующий вариант который лишён вышеуказанного недостатка - Код: vbnet 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.
Суть метода сводится к заполнению отдельно созданного массива старыми значениями (от предыдущих итераций) + добавление новых строк и последующему их выводу в ListBox. Это немного громоздкое решение, но при должном допиле метод работает. 2.Решение которое было применено как переходное у меня в системе. Я зашёл с другой стороны и попробовал подредактировать SQL запрос к базе. Была создана текстовая переменная (ForSQL) которая впитала в себя все возможные [ID] в виде - (" '123' or ID = '234'...or ID = 'N' "), что позволило отказаться от цикла перезаписи ListBox`a и заполнять его уже готовой информацией из базы получив разом все данные из SQL запроса. Пока работает без сбоев, посмотрим как поведёт себя при больших объёмах информации. Итого переписал строку в следующей редакции: Было: Код: vbnet 1. 2. 3. 4.
Стало: Код: vbnet 1. 2.
Наполнение текстовой переменной () выглядит следующим образом Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Не трудно догадаться, что сделано через IF поскольку в запросе SQL - первое значение после WHERE отличается от последующих. Как-то так. Если у кого-то есть еще идеи по оптимизации - прошу высказываться. Заранее благодарен! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2018, 12:06 |
|
|
start [/forum/topic.php?fid=61&fpage=18&tid=2172399]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
35ms |
get tp. blocked users: |
2ms |
others: | 287ms |
total: | 417ms |
0 / 0 |