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

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2016, 16:57
Ответы с готовыми решениями:

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

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

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

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

15
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
27.12.2016, 18:07 2
Цитата Сообщение от Vla00 Посмотреть сообщение
Как ускорить?
Используйте DGV в виртуальном режиме.
Заполнять ячейки придется вручную по запросу, но работать будет во много раз быстрее, т.к. отрисовываться будут только видимые записи.
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 667
28.12.2016, 14:06  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Используйте DGV в виртуальном режиме.
Заполнять ячейки придется вручную по запросу, но работать будет во много раз быстрее, т.к. отрисовываться будут только видимые записи.
Немогу понять как он реализовывается. Мне кажется что он не подойдет. При каждом запросе приходят новые данные. Запрос динамический. т.е. каждый раз разное количество столбцов и разные данные. Насколько я понял он один раз загрузит и потом при определенных параметрах он будет отбирать и отображать которые подходят под условие?
0
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
28.12.2016, 14:33 4
Заполнять ячейки вручную не стоит. Почему DataSource DGV устанавливается в другом месте? Покажите весь код связывания.
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 667
28.12.2016, 15:02  [ТС] 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
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 6
Дело в строках:
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
Сообщений: 667
28.12.2016, 16:10  [ТС] 7
всё быстро отрабатывает. В дебаге проверил что тормозит из-за dataGridView1.DataSource = _bindingSource;
Как я понимаю в этом дело, или я ошибаюсь?

Добавлено через 9 минут
даже когда я убрал фильтрацию - время выполнения не изменилось, т.е. не в этом дело. и если вы посмотрите внимательно код, то видно что сдесь 3 случая: когда не требуется фильтровать, когда фильтруется по selsovet и по country.
Заметил что при первом запросе, время выполнения долгое, но при следующих, время выполнения заметно сокращается.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
28.12.2016, 16:38 8
Vla00, а на DGV случайно не навешено обработчиков событий изменений? Просто я ни разу не встречал тормозов при биндинге данных в таблицу.
1
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
28.12.2016, 16:46 9
Верно, тормозит из-за 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
Сообщений: 667
29.12.2016, 08:22  [ТС] 10
Цитата Сообщение от 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 11
Vla00, ты с таблицей что-то делаешь из DGV?
Можно попробовать биндить не Table[0], а коллекцию классов-обёртёк. Например, для таблицы с полями id, Name, Phone создаётся класс, содержащий свойства string Id, Name, Phone. Коллекция заполняется данными из таблицы и биндится к контролу.
1
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
29.12.2016, 09:20 12
Покажите, 1) какое значение request Вы передаете в метод UpdateDateGrid(string request),
2) какое значение command Вы передаете в SqlDataAdapter(command, _connection);
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 667
03.01.2017, 09:21  [ТС] 13
Цитата Сообщение от 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
784 / 615 / 273
Регистрация: 04.08.2015
Сообщений: 1,707
03.01.2017, 13:18 14
Цитата Сообщение от Vla00 Посмотреть сообщение
order by alone.fio
Сортировка по неиндексированному полю может существенно увеличить время выполнения запроса.
0
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
03.01.2017, 17:08 15
Посоветовать могу только одно: оптимизируйте запрос к БД (или ее таблицы). Для проверки сделайте простой запрос с выборкой и закачайте данные в DataSet с воспроизведением в DataGridView. Все будет быстро.
0
11 / 11 / 10
Регистрация: 06.10.2012
Сообщений: 667
04.01.2017, 15:20  [ТС] 16
Цитата Сообщение от 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
04.01.2017, 15:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2017, 15:20
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru