Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
 Аватар для Scrypto
132 / 111 / 48
Регистрация: 08.02.2013
Сообщений: 621

ListView долго отображает содержимое (более 1000 записей)

09.08.2017, 10:05. Показов 1646. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как ускорить работу listView?
В базе более 1500 записей, и каждая проходит через
C#
1
items.add.
Естественно это все занимает много времени, как сделать, чтобы отрисовка проходила быстрее?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2017, 10:05
Ответы с готовыми решениями:

Очень долго открывается RecordSet, более 100 000 записей.
Добрый день ! Может кто подскажет: Есть база в Access. Большая таблица (около 100 000) записей. Задача - вывести все эти записи в веб...

Как лучше хранить небольшие (до 50 записей) и крупные до 600-1000 записей данные?
Разрабатываю первое собственное приложение. Стою перед архитектурным выбором, и не знаю что использовать. У более опытных ребят хочу...

не отображает содержимое сайта
Использовал шаблон и "Twenty Ten" собственно, если я открываю сайт на том же хосте, на котором лежит сайт, то он отображается корректно,...

5
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
09.08.2017, 10:19
Используй DataBindings, он свяжет твою бд с твоим списком, и не нужно будет никаких Add
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18262 / 14187 / 5366
Регистрация: 17.03.2014
Сообщений: 28,872
Записей в блоге: 1
09.08.2017, 10:21
Scrypto, окружи цикл добавления элементов вызовами BeginUpdate/EndUpdate
1
 Аватар для Scrypto
132 / 111 / 48
Регистрация: 08.02.2013
Сообщений: 621
09.08.2017, 10:32  [ТС]
OwenGlendower, окружил.
Теперь он просто в течении 4х секунд висит, а после выдает все записи.
Если не окружать, то время проработки тоже самое, но видно как изменяется размер бегунков

Добавлено через 1 минуту
Вот так выглядят функции
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  // Поиск из основного окна
        public void MainWindowSearch()
        {
            MainListView.Items.Clear();
            DataTable dt1 = new DataTable();
            dt1 = basa.SearchFIO(SearchFIOTextBox.Text, SearchOld.Checked);
         //   MainListView.BeginUpdate();
            for (int i = 0; i < dt1.Rows.Count; i++)
            {
                LVSWriter(dt1.Rows[i].ItemArray[0].ToString(), dt1.Rows[i].ItemArray[1].ToString(), dt1.Rows[i].ItemArray[2].ToString(), dt1.Rows[i].ItemArray[3].ToString(),
                          dt1.Rows[i].ItemArray[4].ToString(), dt1.Rows[i].ItemArray[5].ToString(), dt1.Rows[i].ItemArray[6].ToString(), dt1.Rows[i].ItemArray[7].ToString(), dt1.Rows[i].ItemArray[8].ToString(),
                          dt1.Rows[i].ItemArray[9].ToString(), dt1.Rows[i].ItemArray[10].ToString(), dt1.Rows[i].ItemArray[11].ToString(), dt1.Rows[i].ItemArray[12].ToString(), dt1.Rows[i].ItemArray[13].ToString(),
                          dt1.Rows[i].ItemArray[14].ToString(), dt1.Rows[i].ItemArray[15].ToString(), dt1.Rows[i].ItemArray[16].ToString(), dt1.Rows[i].ItemArray[17].ToString(),
                          dt1.Rows[i].ItemArray[18].ToString(), dt1.Rows[i].ItemArray[19].ToString(), dt1.Rows[i].ItemArray[20].ToString(), dt1.Rows[i].ItemArray[21].ToString(), dt1.Rows[i].ItemArray[22].ToString(),
                          dt1.Rows[i].ItemArray[23].ToString(), dt1.Rows[i].ItemArray[24].ToString(), dt1.Rows[i].ItemArray[25].ToString(), dt1.Rows[i].ItemArray[26].ToString());
            }
         //   MainListView.EndUpdate();
            CountListViewLabel.Text = "Найдено записей: " + dt1.Rows.Count;
 
        }
C#
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
 //Пишем в основное окно программы
        public void LVSWriter(string id, string Data_priema, string Data_vidachi, string Data_predoplaty, string surname, string phone, string AboutUs, string WhatRemont, string brand,
            string model, string SerialNumber, string sostoyanie, string komplektonst, string polomka, string kommentarij, string predvaritelnaya_stoimost, string Predoplata,
            string Zatrati, string okonchatelnaya_stoimost_remonta, string Skidka, string Status_remonta, string master, string vipolnenie_raboti, string Garanty,
            string wait_zakaz, string Adress, string Image_key)
        {
 
            //Следующая строчка, для избежания ошибки при сортировке в MainListView
            //Нужна везде, где вызвается сортировка не по нажатию колонки
            itemComparer.ColumnIndex = 0;
 
            ListViewItem lvsElement;
            lvsElement = new ListViewItem();
            lvsElement.Text = id;
            //Проверка на рисунок
            if(Image_key == "1")
            {
                // Вставляем рисунок
                lvsElement.ImageIndex = 0;
            }
            MainListView.Items.Insert(0, lvsElement);
            // Проверочка на критичность даты диагностики
            bool dateOfCriticalDiagnosik = ((DateTime.Parse(Data_priema)) < DateTime.Today.AddDays(daysDiagnostik));
            if (Data_vidachi == "" && dateOfCriticalDiagnosik && Status_remonta == "Диагностика")
            {
                if (INIF.KeyExists("PROGRAMM_SETTINGS", "colorCheckBox"))
                {
                    if (INIF.ReadINI("PROGRAMM_SETTINGS", "colorCheckBox") == "Checked")
                    {
                        if (INIF.KeyExists("PROGRAMM_SETTINGS", "colorDiagnostik"))
                        {
                            lvsElement.BackColor = Color.FromArgb(int.Parse(INIF.ReadINI("PROGRAMM_SETTINGS", "colorDiagnostik")));
                        }
                    }
                }
            }
 
 
            lvsElement.SubItems.Add(Data_priema);
            lvsElement.SubItems.Add(Data_vidachi);
            lvsElement.SubItems.Add(Data_predoplaty);
            lvsElement.SubItems.Add(FirstLetterToUpper(surname));
            lvsElement.SubItems.Add(phone);
            lvsElement.SubItems.Add(AboutUs);
            lvsElement.SubItems.Add(FirstLetterToUpper(WhatRemont));
            lvsElement.SubItems.Add(brand);
            lvsElement.SubItems.Add(model);
            lvsElement.SubItems.Add(SerialNumber);
            lvsElement.SubItems.Add(sostoyanie);
            lvsElement.SubItems.Add(komplektonst);
            lvsElement.SubItems.Add(polomka);
            lvsElement.SubItems.Add(kommentarij);
            lvsElement.SubItems.Add(predvaritelnaya_stoimost);
            lvsElement.SubItems.Add(Predoplata);
            lvsElement.SubItems.Add(Zatrati);
            lvsElement.SubItems.Add(okonchatelnaya_stoimost_remonta);
            lvsElement.SubItems.Add(Skidka);
            lvsElement.SubItems.Add(Status_remonta);
            lvsElement.SubItems.Add(FirstLetterToUpper(master));
            lvsElement.SubItems.Add(vipolnenie_raboti);
            lvsElement.SubItems.Add(Garanty);
            lvsElement.SubItems.Add(wait_zakaz);
            lvsElement.SubItems.Add(Adress);
 
        }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18262 / 14187 / 5366
Регистрация: 17.03.2014
Сообщений: 28,872
Записей в блоге: 1
09.08.2017, 16:40
Лучший ответ Сообщение было отмечено Scrypto как решение

Решение

Scrypto, код написан неоптимально.
1) Вместо Items.Insert(0,..) лучше использовать Items.Add(). Он работает немного быстрее

2) Кроме добавления элемента код делает ряд обращений к INIF (ini файл?). Код нужно переписать чтобы эти параметры читались один раз в течение цикла

3) Постоянные повторения dt1.Rows[i].ItemArray[N] можно упростить с помощью временной переменной. Это будет немного быстрее и код станет понятее. Плюс вместо создания 26 массивов, мы получим только один. Сборщик мусора будет рад что работы станет меньше
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i < dt1.Rows.Count; i++)
{
  object[] itemArray = dt1.Rows[i].ItemArray;
  LVSWriter(
    itemArray[0].ToString() , itemArray[1].ToString() , itemArray[2].ToString() , itemArray[3].ToString() ,
    itemArray[4].ToString() , itemArray[5].ToString() , itemArray[6].ToString() , itemArray[7].ToString() ,
    itemArray[8].ToString() , itemArray[9].ToString() , itemArray[10].ToString(), itemArray[11].ToString(),
    itemArray[12].ToString(), itemArray[13].ToString(), itemArray[14].ToString(), itemArray[15].ToString(),
    itemArray[16].ToString(), itemArray[17].ToString(), itemArray[18].ToString(), itemArray[19].ToString(),
    itemArray[20].ToString(), itemArray[21].ToString(), itemArray[22].ToString(), itemArray[23].ToString(),
    itemArray[24].ToString(), itemArray[25].ToString(), itemArray[26].ToString()
  );
}
4) В чем тайный смысл создания пустой DataTable?
C#
1
2
DataTable dt1 = new DataTable(); // ????
dt1 = basa.SearchFIO(SearchFIOTextBox.Text, SearchOld.Checked);
5) Не уверен что здесь нужен DataTable и связанные с ним преобразования в строку. Будет лучше читать данные в List<> своего типа

6) Ну и BeginUpdate/EndUpdate тоже нужно использовать
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.08.2017, 17:18
Лучший ответ Сообщение было отмечено Scrypto как решение

Решение

Цитата Сообщение от Scrypto Посмотреть сообщение
как сделать, чтобы отрисовка проходила быстрее?
Используйте виртуальный режим — в нем отображаться будут только те элементы, которые видны в данный момент.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2017, 17:18
Помогаю со студенческими работами здесь

В браузере не отображает содержимое переменных
В книжке по PHP, приведён пример как работают переменные. Значить HTML файл содержит такой код&lt;form action =...

ListView не отображает на найденных файлах значок изображения
ListView не отображает на найденных файлах значок изображения((( перелазил все в свойствах ниче не помогает, хотя ImageList1 подключен и в...

ListView не показывает первую запись, а последующие отображает
Всем привет. Такая проблема, в базе данных около 100 записей, выгружаются последние 99, а 1 записи будто нет. private void...

Не отображает элементы ListView-а при добавлении туда файлов
Здравствуйте! Я создал две формы. В обоих есть ListView. Первая из них - главная - должна послужить файловым контейнером, элементы...

Не отображает содержимое страницы, выдает ошибку синтаксиса запроса
Всем привет. Пытаюсь запустить этот код, но ничего не происходит, страница не отображает вообще ничего. Если убираю php код всё...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru