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

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

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

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

27.12.2016, 16:57. Просмотров 558. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2016, 16:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос DatagridView тормозит при загрузке данных (C#):

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

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

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

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

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

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

15
kolorotur
Эксперт .NET
8998 / 7506 / 1186
Регистрация: 17.09.2011
Сообщений: 12,981
27.12.2016, 18:07 #2
Цитата Сообщение от Vla00 Посмотреть сообщение
Как ускорить?
Используйте DGV в виртуальном режиме.
Заполнять ячейки придется вручную по запросу, но работать будет во много раз быстрее, т.к. отрисовываться будут только видимые записи.
0
Vla00
6 / 6 / 3
Регистрация: 06.10.2012
Сообщений: 473
28.12.2016, 14:06  [ТС] #3
Цитата Сообщение от kolorotur Посмотреть сообщение
Используйте DGV в виртуальном режиме.
Заполнять ячейки придется вручную по запросу, но работать будет во много раз быстрее, т.к. отрисовываться будут только видимые записи.
Немогу понять как он реализовывается. Мне кажется что он не подойдет. При каждом запросе приходят новые данные. Запрос динамический. т.е. каждый раз разное количество столбцов и разные данные. Насколько я понял он один раз загрузит и потом при определенных параметрах он будет отбирать и отображать которые подходят под условие?
0
MVK
139 / 131 / 38
Регистрация: 30.03.2011
Сообщений: 524
28.12.2016, 14:33 #4
Заполнять ячейки вручную не стоит. Почему DataSource DGV устанавливается в другом месте? Покажите весь код связывания.
0
Vla00
6 / 6 / 3
Регистрация: 06.10.2012
Сообщений: 473
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
MVK
139 / 131 / 38
Регистрация: 30.03.2011
Сообщений: 524
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
Vla00
6 / 6 / 3
Регистрация: 06.10.2012
Сообщений: 473
28.12.2016, 16:10  [ТС] #7
всё быстро отрабатывает. В дебаге проверил что тормозит из-за dataGridView1.DataSource = _bindingSource;
Как я понимаю в этом дело, или я ошибаюсь?

Добавлено через 9 минут
даже когда я убрал фильтрацию - время выполнения не изменилось, т.е. не в этом дело. и если вы посмотрите внимательно код, то видно что сдесь 3 случая: когда не требуется фильтровать, когда фильтруется по selsovet и по country.
Заметил что при первом запросе, время выполнения долгое, но при следующих, время выполнения заметно сокращается.
0
aquaMakc
367 / 311 / 46
Регистрация: 14.02.2014
Сообщений: 1,604
Завершенные тесты: 1
28.12.2016, 16:38 #8
Vla00, а на DGV случайно не навешено обработчиков событий изменений? Просто я ни разу не встречал тормозов при биндинге данных в таблицу.
0
MVK
139 / 131 / 38
Регистрация: 30.03.2011
Сообщений: 524
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
Vla00
6 / 6 / 3
Регистрация: 06.10.2012
Сообщений: 473
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
aquaMakc
367 / 311 / 46
Регистрация: 14.02.2014
Сообщений: 1,604
Завершенные тесты: 1
29.12.2016, 08:47 #11
Vla00, ты с таблицей что-то делаешь из DGV?
Можно попробовать биндить не Table[0], а коллекцию классов-обёртёк. Например, для таблицы с полями id, Name, Phone создаётся класс, содержащий свойства string Id, Name, Phone. Коллекция заполняется данными из таблицы и биндится к контролу.
1
MVK
139 / 131 / 38
Регистрация: 30.03.2011
Сообщений: 524
29.12.2016, 09:20 #12
Покажите, 1) какое значение request Вы передаете в метод UpdateDateGrid(string request),
2) какое значение command Вы передаете в SqlDataAdapter(command, _connection);
0
Vla00
6 / 6 / 3
Регистрация: 06.10.2012
Сообщений: 473
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
Igr_ok
312 / 299 / 104
Регистрация: 04.08.2015
Сообщений: 769
03.01.2017, 13:18 #14
Цитата Сообщение от Vla00 Посмотреть сообщение
order by alone.fio
Сортировка по неиндексированному полю может существенно увеличить время выполнения запроса.
0
MVK
139 / 131 / 38
Регистрация: 30.03.2011
Сообщений: 524
03.01.2017, 17:08 #15
Посоветовать могу только одно: оптимизируйте запрос к БД (или ее таблицы). Для проверки сделайте простой запрос с выборкой и закачайте данные в DataSet с воспроизведением в DataGridView. Все будет быстро.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2017, 17:08
Привет! Вот еще темы с ответами:

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

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

Ошибка при привязке данных из базы к dataGridView либо comobox - C#
Здраствуйте, проблема после вставки в форму любого бокса или массива данных(допустим dataGridView) ссылающегося на базу(допустим таблицу),...

Firebird 2.5 Автоматическое обновление содержимого DataGridView при изменении данных - C#
Всем доброго времени суток подскажите как обновлять автоматически Datagridview при добавлении, изминение и удалении данных? Работаю в...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.01.2017, 17:08
Ответ Создать тему
Опции темы

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