Форум программистов, компьютерный форум CyberForum.ru

C# и базы данных, ADO.NET

Войти
Регистрация
Восстановить пароль
 
Vla00
5 / 5 / 3
Регистрация: 06.10.2012
Сообщений: 460
#1

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

27.12.2016, 16:57. Просмотров 449. Ответов 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 секунд. Как ускорить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2016, 16:57     DatagridView тормозит при загрузке данных
Посмотрите здесь:

C# DataGridView ужасно тормозит. Существует ли альтернатива?
C# Обновление данных в Datagridview из БД при использовании BackgroundWorker
C# .NET 3.x Как менять кодировку при копировании данных из DataGridView на лист Excel
Изменение свойств CheckBox в DataGridView при загрузке формы C#
Неверная кодировка при загрузке файла в datagridview C#
C# Индекс находился вне границ массива при загрузке элементов из Datagridview
C# ProgressBar при экспорте данных из DataGridView в таблицу Excel
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kolorotur
Эксперт .NET
8658 / 7205 / 1095
Регистрация: 17.09.2011
Сообщений: 12,433
27.12.2016, 18:07     DatagridView тормозит при загрузке данных #2
Цитата Сообщение от Vla00 Посмотреть сообщение
Как ускорить?
Используйте DGV в виртуальном режиме.
Заполнять ячейки придется вручную по запросу, но работать будет во много раз быстрее, т.к. отрисовываться будут только видимые записи.
Vla00
5 / 5 / 3
Регистрация: 06.10.2012
Сообщений: 460
28.12.2016, 14:06  [ТС]     DatagridView тормозит при загрузке данных #3
Цитата Сообщение от kolorotur Посмотреть сообщение
Используйте DGV в виртуальном режиме.
Заполнять ячейки придется вручную по запросу, но работать будет во много раз быстрее, т.к. отрисовываться будут только видимые записи.
Немогу понять как он реализовывается. Мне кажется что он не подойдет. При каждом запросе приходят новые данные. Запрос динамический. т.е. каждый раз разное количество столбцов и разные данные. Насколько я понял он один раз загрузит и потом при определенных параметрах он будет отбирать и отображать которые подходят под условие?
MVK
137 / 129 / 38
Регистрация: 30.03.2011
Сообщений: 521
28.12.2016, 14:33     DatagridView тормозит при загрузке данных #4
Заполнять ячейки вручную не стоит. Почему DataSource DGV устанавливается в другом месте? Покажите весь код связывания.
Vla00
5 / 5 / 3
Регистрация: 06.10.2012
Сообщений: 460
28.12.2016, 15:02  [ТС]     DatagridView тормозит при загрузке данных #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;
        }
MVK
137 / 129 / 38
Регистрация: 30.03.2011
Сообщений: 521
28.12.2016, 15:41     DatagridView тормозит при загрузке данных #6
Дело в строках:
C#
1
DataSource = dataSet.Tables[0].Select("[country] = '" + comboBox2.Text + "'").CopyToDataTable()
Вы фильтруете и создаете новую таблицу. И зачем??
Вы хотите вставить фильтр, так вставляйте его либо в BindingSource или в DataTable.
У Вас связка: DataTable - BindingSource - DataGridView. DataGridView - только для отображения нужного. DataTable - для хранения всех данных. BindingSource - посредник между DataTable и DataGridView - в нем (или DataTable) фильтруем то, что будет отображаться.
Vla00
5 / 5 / 3
Регистрация: 06.10.2012
Сообщений: 460
28.12.2016, 16:10  [ТС]     DatagridView тормозит при загрузке данных #7
всё быстро отрабатывает. В дебаге проверил что тормозит из-за dataGridView1.DataSource = _bindingSource;
Как я понимаю в этом дело, или я ошибаюсь?

Добавлено через 9 минут
даже когда я убрал фильтрацию - время выполнения не изменилось, т.е. не в этом дело. и если вы посмотрите внимательно код, то видно что сдесь 3 случая: когда не требуется фильтровать, когда фильтруется по selsovet и по country.
Заметил что при первом запросе, время выполнения долгое, но при следующих, время выполнения заметно сокращается.
aquaMakc
341 / 285 / 46
Регистрация: 14.02.2014
Сообщений: 1,398
Завершенные тесты: 1
28.12.2016, 16:38     DatagridView тормозит при загрузке данных #8
Vla00, а на DGV случайно не навешено обработчиков событий изменений? Просто я ни разу не встречал тормозов при биндинге данных в таблицу.
MVK
137 / 129 / 38
Регистрация: 30.03.2011
Сообщений: 521
28.12.2016, 16:46     DatagridView тормозит при загрузке данных #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);
Пробуйте.
Vla00
5 / 5 / 3
Регистрация: 06.10.2012
Сообщений: 460
29.12.2016, 08:22  [ТС]     DatagridView тормозит при загрузке данных #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;
                }
            }
aquaMakc
341 / 285 / 46
Регистрация: 14.02.2014
Сообщений: 1,398
Завершенные тесты: 1
29.12.2016, 08:47     DatagridView тормозит при загрузке данных #11
Vla00, ты с таблицей что-то делаешь из DGV?
Можно попробовать биндить не Table[0], а коллекцию классов-обёртёк. Например, для таблицы с полями id, Name, Phone создаётся класс, содержащий свойства string Id, Name, Phone. Коллекция заполняется данными из таблицы и биндится к контролу.
MVK
137 / 129 / 38
Регистрация: 30.03.2011
Сообщений: 521
29.12.2016, 09:20     DatagridView тормозит при загрузке данных #12
Покажите, 1) какое значение request Вы передаете в метод UpdateDateGrid(string request),
2) какое значение command Вы передаете в SqlDataAdapter(command, _connection);
Vla00
5 / 5 / 3
Регистрация: 06.10.2012
Сообщений: 460
03.01.2017, 09:21  [ТС]     DatagridView тормозит при загрузке данных #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 Посмотреть сообщение
Коллекция заполняется данными из таблицы и биндится к контролу.
Хотел сделать так как вы сказали, но не получилось. Не могли бы вы скинуть пример или примерно набросать код? Буду очень благодарен...
Igr_ok
276 / 263 / 93
Регистрация: 04.08.2015
Сообщений: 678
03.01.2017, 13:18     DatagridView тормозит при загрузке данных #14
Цитата Сообщение от Vla00 Посмотреть сообщение
order by alone.fio
Сортировка по неиндексированному полю может существенно увеличить время выполнения запроса.
MVK
137 / 129 / 38
Регистрация: 30.03.2011
Сообщений: 521
03.01.2017, 17:08     DatagridView тормозит при загрузке данных #15
Посоветовать могу только одно: оптимизируйте запрос к БД (или ее таблицы). Для проверки сделайте простой запрос с выборкой и закачайте данные в DataSet с воспроизведением в DataGridView. Все будет быстро.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2017, 15:20     DatagridView тормозит при загрузке данных
Еще ссылки по теме:

Неправильное отображение даты при импорте данных из Excel в DataGridView C#
C# DataGridView тормозит при перемещении
Обновление данных datagridview при insert C#
Выполнение кода при загрузке DataGridView C#
Выгружается только последняя строчка при выгрузке данных из таблицы DataGridView в Excel C#

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

Или воспользуйтесь поиском по форуму:
Vla00
5 / 5 / 3
Регистрация: 06.10.2012
Сообщений: 460
04.01.2017, 15:20  [ТС]     DatagridView тормозит при загрузке данных #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;
И авторазмер поставил на необходимые столбцы. Всем спасибо, кто помогал.
Yandex
Объявления
04.01.2017, 15:20     DatagridView тормозит при загрузке данных
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru