Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 675

DatagridView тормозит при загрузке данных

27.12.2016, 16:57. Показов 7109. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
var dataAdapter = new SqlDataAdapter(command, _connection);
            var dataSet = new DataSet();
            dataAdapter.Fill(dataSet);
            _bindingSource = new BindingSource
            {
                DataSource = dataSet.Tables[0]
            };
Таким методом получаю данные из БД.
Запрос получает данные быстро. а вот забрасывает данные в таблицу долго:
C#
1
dataGridView1.DataSource = _bindingSource;
300 записей выводит примерно 10 секунд. Как ускорить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.12.2016, 16:57
Ответы с готовыми решениями:

При загрузке формы не выводятся значения из таблицы в dataGridView
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Ошибка при обновлении данных в БД из DataGridView при определенном условии
Собственно проблема в следующем... в приложение добавил обновление БД из dgv. Сделано по примеру, как в видео _sB0A6FIhUM На...

Ошибка при загрузке данный в DGV (Нулевой индекс не содержит данных)
Всем привет. возникла проблема при написание программы. суть - есть форма, на ней датагрид привязанный к таблице в базе данных, есть...

15
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
27.12.2016, 18:07
Цитата Сообщение от Vla00 Посмотреть сообщение
Как ускорить?
Используйте DGV в виртуальном режиме.
Заполнять ячейки придется вручную по запросу, но работать будет во много раз быстрее, т.к. отрисовываться будут только видимые записи.
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 675
28.12.2016, 14:06  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Используйте DGV в виртуальном режиме.
Заполнять ячейки придется вручную по запросу, но работать будет во много раз быстрее, т.к. отрисовываться будут только видимые записи.
Немогу понять как он реализовывается. Мне кажется что он не подойдет. При каждом запросе приходят новые данные. Запрос динамический. т.е. каждый раз разное количество столбцов и разные данные. Насколько я понял он один раз загрузит и потом при определенных параметрах он будет отбирать и отображать которые подходят под условие?
0
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
28.12.2016, 14:33
Заполнять ячейки вручную не стоит. Почему DataSource DGV устанавливается в другом месте? Покажите весь код связывания.
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 675
28.12.2016, 15:02  [ТС]
Метод вызывается при нажатии на кнопку "Отобразить"
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
private void UpdateDateGrid(string request)
        {
            Cursor = Cursors.AppStarting;
            _connection.Open();
            if (string.IsNullOrEmpty(request))
                request = _requestGroup;
            string command;
            string commandReq = request;
 
            if (!_flagDetail)
            {
                commandReq = commandReq.Replace(@", category.category as [категория]", @"/*, category.category as [категория]*/");
                if (radioButton1.Checked)
                    command = commandReq + Where + @" and protivopojar.ApiDate is not null" + Group +
                              @" order by alone.fio";
                else
                {
                    if (radioButton2.Checked)
                        command = commandReq + Where + @" and protivopojar.SzuDate is not null" + Group +
                                  @"order by alone.fio";
                    else
                        command = request + Where + Group + @" order by alone.fio";
                }
            }
            else
            {
                commandReq = commandReq.Replace("max(", "");
                commandReq = commandReq.Replace(")", "");
                commandReq = commandReq.Replace(@"/*, category.category as [категория]*/", ", category.category as [категория]");
                if (radioButton1.Checked)
                    command = commandReq + Where + @" and protivopojar.ApiDate is not null order by alone.fio";
                else
                {
                    if (radioButton2.Checked)
                        command = commandReq + Where + @" and protivopojar.SzuDate is not null order by alone.fio";
                    else
                        command = commandReq + Where + @" order by alone.fio";
                }
            }
 
            var dataAdapter = new SqlDataAdapter(command, _connection);
            var dataSet = new DataSet();
            dataAdapter.Fill(dataSet);
            _bindingSource = new BindingSource
            {
                DataSource = dataSet.Tables[0]
            };
 
            try
            {
                if (string.IsNullOrEmpty(comboBox2.Text))
                {
                    if (!string.IsNullOrEmpty(comboBox1.Text))
                    {
                        _bindingSource = new BindingSource
                        {
                            DataSource =
                                dataSet.Tables[0].Select("[selsovet] = '" + comboBox1.Text + "'").CopyToDataTable()
                        };
                    }
                }
                else
                {
                    _bindingSource = new BindingSource
                    {
                        DataSource = dataSet.Tables[0].Select("[country] = '" + comboBox2.Text + "'").CopyToDataTable()
                    };
                }
 
 
                dataGridView1.DataSource = _bindingSource;
                if (dataGridView1.Columns.Count > 0)
                {
                    dataGridView1.Columns[0].Visible = false;
                    dataGridView1.Columns[1].Visible = false;
                    dataGridView1.Columns[2].Visible = false;
                }
            }
            catch (Exception)
            {
                dataGridView1.DataSource = null;
            }
            
                
            _connection.Close();
            toolStripStatusLabel1.Text = @"Записей: " + dataGridView1.Rows.Count;
            Cursor = Cursors.Arrow;
        }
0
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
28.12.2016, 15:41
Дело в строках:
C#
1
DataSource = dataSet.Tables[0].Select("[country] = '" + comboBox2.Text + "'").CopyToDataTable()
Вы фильтруете и создаете новую таблицу. И зачем??
Вы хотите вставить фильтр, так вставляйте его либо в BindingSource или в DataTable.
У Вас связка: DataTable - BindingSource - DataGridView. DataGridView - только для отображения нужного. DataTable - для хранения всех данных. BindingSource - посредник между DataTable и DataGridView - в нем (или DataTable) фильтруем то, что будет отображаться.
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 675
28.12.2016, 16:10  [ТС]
всё быстро отрабатывает. В дебаге проверил что тормозит из-за dataGridView1.DataSource = _bindingSource;
Как я понимаю в этом дело, или я ошибаюсь?

Добавлено через 9 минут
даже когда я убрал фильтрацию - время выполнения не изменилось, т.е. не в этом дело. и если вы посмотрите внимательно код, то видно что сдесь 3 случая: когда не требуется фильтровать, когда фильтруется по selsovet и по country.
Заметил что при первом запросе, время выполнения долгое, но при следующих, время выполнения заметно сокращается.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
28.12.2016, 16:38
Vla00, а на DGV случайно не навешено обработчиков событий изменений? Просто я ни разу не встречал тормозов при биндинге данных в таблицу.
1
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
28.12.2016, 16:46
Верно, тормозит из-за dataGridView1.DataSource = _bindingSource;
Итак, все нужные Вам данные лежать в dataSet.Tables[0] и поэтому запишем для связывания:
C#
1
2
3
_bindingSource = new BindingSource();
_bindingSource.DataSource = dataSet.Tables[0];
dataGridView1.DataSource = _bindingSource;
У Вас в зависимости от условий разные фильтры.Приведу один пример - строки 54-60 заменить на:
C#
1
BindingSource.Filter = string.Format("selsovet = '{0}'", comboBox1.Text);
Пробуйте.
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 675
29.12.2016, 08:22  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
а на DGV случайно не навешено обработчиков событий изменений?
На нем повешен только один обработчик, при нажатии на строку открывается форма для редактирования данных. Но это не относится к этому.

Добавлено через 14 минут
Цитата Сообщение от MVK Посмотреть сообщение
поэтому запишем для связывания
Написал вот так, на полторы секунды работает быстрее, но всё равно для 300 записей, 8-8,5 сек. долго я считаю.
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
_bindingSource = new BindingSource();
            _bindingSource.DataSource = dataSet.Tables[0];
            dataGridView1.DataSource = _bindingSource;
 
            try
            {
                if (string.IsNullOrEmpty(comboBox2.Text))
                {
                    if (!string.IsNullOrEmpty(comboBox1.Text))
                    {
                        _bindingSource.Filter = string.Format("selsovet = '{0}'", comboBox1.Text);
                    }
                }
                else
                {
                    _bindingSource.Filter = string.Format("country = '{0}'", comboBox2.Text);
                }
 
                if (dataGridView1.Columns.Count > 0)
                {
                    dataGridView1.Columns[0].Visible = false;
                    dataGridView1.Columns[1].Visible = false;
                    dataGridView1.Columns[2].Visible = false;
                }
            }
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
29.12.2016, 08:47
Vla00, ты с таблицей что-то делаешь из DGV?
Можно попробовать биндить не Table[0], а коллекцию классов-обёртёк. Например, для таблицы с полями id, Name, Phone создаётся класс, содержащий свойства string Id, Name, Phone. Коллекция заполняется данными из таблицы и биндится к контролу.
1
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
29.12.2016, 09:20
Покажите, 1) какое значение request Вы передаете в метод UpdateDateGrid(string request),
2) какое значение command Вы передаете в SqlDataAdapter(command, _connection);
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 675
03.01.2017, 09:21  [ТС]
Цитата Сообщение от MVK Посмотреть сообщение
какое значение request Вы передаете в метод UpdateDateGrid(string request)
SQL
1
2
3
4
5
6
7
8
SELECT MAX(alone.key_alone), MAX(selsovet.selsovet) AS selsovet, MAX(country.country) AS country, 
    MAX(alone.fio) AS [ФИО], MAX(alone.date_ro) AS [дата рождения], 
    MAX(country.country) + ' ' + MAX(alone.street) AS [адрес],
    MAX(protivopojar.ApiDate) AS [АПИ], MAX(protivopojar.SzuDate) AS [СЗУ] /*, category.category as [категория]*/
        FROM alone INNER JOIN category ON alone.key_alone = category.fk_alone 
            INNER JOIN country ON alone.fk_country = country.key_country 
            INNER JOIN selsovet ON selsovet.key_selsovet = country.fk_selsovet 
            INNER JOIN protivopojar ON protivopojar.fk_alone = alone.key_alone JOIN category c1 ON alone.key_alone = c1.fk_alone AND c1.category = 'Одинокие пожилые граждане пенсионного возраста'
Цитата Сообщение от MVK Посмотреть сообщение
какое значение command Вы передаете в SqlDataAdapter(command, _connection);
Такое же только частичка дополняется.

Добавлено через 1 час 6 минут
Цитата Сообщение от aquaMakc Посмотреть сообщение
Коллекция заполняется данными из таблицы и биндится к контролу.
Хотел сделать так как вы сказали, но не получилось. Не могли бы вы скинуть пример или примерно набросать код? Буду очень благодарен...
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
03.01.2017, 13:18
Цитата Сообщение от Vla00 Посмотреть сообщение
order by alone.fio
Сортировка по неиндексированному полю может существенно увеличить время выполнения запроса.
0
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
03.01.2017, 17:08
Посоветовать могу только одно: оптимизируйте запрос к БД (или ее таблицы). Для проверки сделайте простой запрос с выборкой и закачайте данные в DataSet с воспроизведением в DataGridView. Все будет быстро.
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 675
04.01.2017, 15:20  [ТС]
Цитата Сообщение от Igr_ok Посмотреть сообщение
Сортировка по неиндексированному полю может существенно увеличить время выполнения запроса.
Пробовал создавать индекс и убирал сортировку, время выполнения одинаковое.

Добавлено через 1 минуту
Цитата Сообщение от MVK Посмотреть сообщение
Посоветовать могу только одно: оптимизируйте запрос к БД (или ее таблицы). Для проверки сделайте простой запрос с выборкой и закачайте данные в DataSet с воспроизведением в DataGridView. Все будет быстро.
Дело в том что если первый раз обращаться по данному запросу, то запрос выполняется долго. При дальнейших обращениях - быстро. Если даже закрыть форму и открыть заново и выполнить запрос, всё же долго....

Добавлено через 1 минуту
Цитата Сообщение от Igr_ok Посмотреть сообщение
Сортировка по неиндексированному полю может существенно увеличить время выполнения запроса.
Цитата Сообщение от MVK Посмотреть сообщение
Посоветовать могу только одно: оптимизируйте запрос к БД (или ее таблицы). Для проверки сделайте простой запрос с выборкой и закачайте данные в DataSet с воспроизведением в DataGridView. Все будет быстро.
Как я писал выше время выполнения занимает долго из-за занесения данных в DataSource.

Добавлено через 4 часа 4 минуты
Разобрался в чем дело.... Оказалось что нужно было просто убрать:
C#
1
2
3
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
И авторазмер поставил на необходимые столбцы. Всем спасибо, кто помогал.

Добавлено через 19 секунд
Разобрался в чем дело.... Оказалось что нужно было просто убрать:
C#
1
2
3
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
И авторазмер поставил на необходимые столбцы. Всем спасибо, кто помогал.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2017, 15:20
Помогаю со студенческими работами здесь

Тормозит или плывет dataGridView
Загружаю данные dataGridView и при прокрутке, такое ощущение что тормозит грид или плывет, даже не знаю как сказать. Подскажите из за чего...

Ошибка при добавлении данных в datagridview
Есть бд сделанная в acess. При добавлении данных в одной форме,они должны перейти на другую и появится в datagridview. Но при нажатии...

Ошибка при редактировании данных через DataGridView
Ошибка при редактировании данных через DataGridView. Я создал таблицу с полем id, которое является идентификатором (IDENTITY). Перекинув...

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

Ввод данных в БД MS Access при помощи компонента DataGridView
Доброго времени суток! Подскажите, каким образом, при помощи компонента DataGridView вносить изменения в базу?


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru