Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209

Оптимизация DataGridView

09.06.2018, 14:44. Показов 2318. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток и всех с наступающим праздником!

Пишу программу на winForm.
Программа коннектится к БД access и нужно из неё(БД) вывести в приложении таблицу для просмотра.
У меня получилось вывести, все отображается правильно, но когда даже таблица пустая в форме и я изменяю размер окна, то начинает все дёргаться. (Компьютер мощный у меня). И если строк больше чем на весь экран (т.е. при сароллинге), все начинается долго листаться, как будто fps жутко маленький.
Сама таблица обновляется строго по нажатию одной кнопки, поэтому при сароллинге новых данных не поступает.
Находил инфу, что можно поменять параметр DoubleBuffer - он немного помог, но не достаточно.

Что посоветуете?

P.S. саму БД в проект не добавлял, но вроде и пробовал добавить , но ситуация не улучшилась
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.06.2018, 14:44
Ответы с готовыми решениями:

Вывод информации в DataGridView в зависимости от выбора в другом DataGridView - C# Access
В 1м DataGridView У меня предприятия, при выборе какого-то 1 предприятия, во 2й DataGridView появляются все записи с тем же ключом. Общий...

Нажав на значение (строку) из одного DataGridView поиск в другом DataGridView
Всем привет. Есть 2 DataGridView в одном только дата, а во втором дата и много других столбиков. Нужно при нажатии в 1 DataGridView на дату...

Подставить данные из combobox в DatagridView при создании новой записи в этом DatagridView
Здравствуйте! Возможно я плохо искал, но я искал ответ или наводку на решение. Подскажите пожалуйста: Есть таблица User, записи которой...

9
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
11.06.2018, 09:13
Не выводить 100500 строк в грид. Работать с макс 1000 строк - более пользователю увидеть будет сложно. Также использовать байндинг, а строки хранить в отдельном объекте, не привязывая напрямую к гриду.
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
11.06.2018, 09:28  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
Не выводить 100500 строк в грид. Работать с макс 1000 строк - более пользователю увидеть будет сложно. Также использовать байндинг, а строки хранить в отдельном объекте, не привязывая напрямую к гриду.
Я и не говорил,что вывожу 100500 строк. Написал же, даже когда таблица пустая и данных из БД не поступало, то изменение размера окна приводит к тормозам.
Выводить я собирался не более 400, но повторюсь, даже с 8 строками и 8 столбцами (даже если они пустые,) то лагает перескакивание
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
11.06.2018, 10:31
код какой для грида? - Каким образом устанавливаете связь между таблицей с гридом?
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
12.06.2018, 22:25  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
код какой для грида? - Каким образом устанавливаете связь между таблицей с гридом?

Это вывод в таблицу
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
 
            string query = "SELECT Дата, ПИ, НомерИзвещения, Обозначение, Наименование, Код, ПричинаИзменения,Фамилия, Отдел, Телефон FROM ["+OrderPreview.SelectedItem.ToString()+"] ORDER BY НомерИзвещения";
 
            // создаем объект OleDbCommand для выполнения запроса к БД MS Access
            OleDbCommand command = new OleDbCommand(query, conn);
 
            // получаем объект OleDbDataReader для чтения табличного результата запроса SELECT
            OleDbDataReader reader = command.ExecuteReader();
 
           
            //listBox1.Items.Clear();
            dataGridView1.Rows.Clear();
            List<string[]> data = new List<string[]>();
           
            while (reader.Read())
            {
                // выводим данные столбцов текущей строки в listBox1ъ
                
                data.Add(new string[10]);
                data[data.Count - 1][0] = reader[0].ToString();
                data[data.Count - 1][1] = reader[1].ToString();
                data[data.Count - 1][2] = reader[2].ToString();
                data[data.Count - 1][3] = reader[3].ToString();
                data[data.Count - 1][4] = reader[4].ToString();
                data[data.Count - 1][5] = reader[5].ToString();
                data[data.Count - 1][6] = reader[6].ToString();
                data[data.Count - 1][7] = reader[7].ToString();
                data[data.Count - 1][8] = reader[8].ToString();
                data[data.Count - 1][9] = reader[9].ToString();
 
 
            }
 
            // закрываем OleDbDataReader
            reader.Close();
 
            foreach (string[] s in data)
            {
                dataGridView1.Rows.Add(s);
            }

Это коннектится к базе

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public static string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Извещения.mdb; Jet OLEDB:Database Password=1234";
        public OleDbConnection conn;
        
        public Generale()
        {
            InitializeComponent();
            ;
            conn = new OleDbConnection(connStr);
            conn.Open();
            
            bindingNavigatorAddNewItem1.Enabled = true;
                                     
        }

Повторяюсь, лаги даже с пустым гридом.

Вот видео

0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
13.06.2018, 09:15
Открой для себя DataTable - забудь о том, что написал, всё, что с 11 строки (окромя закрытия ридера).
Никогда не делай присвоение строк в грид - у него есть замечательное свойство DataSource.
По поводу ридера - если так уж сильно хочется пользоваться именно ридером, то DataTable имеет 2 замечательных метода - BeginLoadData() и EndLoadData() - дабы отключить все уведомления, констрейнты и т.д.
А вот то чудовище, что написано сейчас - срочно нужно удалить и забыть о нем.
1
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
13.06.2018, 09:18  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
Открой для себя DataTable - забудь о том, что написал, всё, что с 11 строки (окромя закрытия ридера).
Никогда не делай присвоение строк в грид - у него есть замечательное свойство DataSource.
По поводу ридера - если так уж сильно хочется пользоваться именно ридером, то DataTable имеет 2 замечательных метода - BeginLoadData() и EndLoadData() - дабы отключить все уведомления, констрейнты и т.д.
А вот то чудовище, что написано сейчас - срочно нужно удалить и забыть о нем.
Спасибо, буду пробовать.
А почему даже пустой грид лагает то?
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
13.06.2018, 10:00
Цитата Сообщение от Felix Felicis Посмотреть сообщение
почему даже пустой грид лагает то?
Вот как раз этого я и не увидел по видео. Пока нет никаких данных - приложение не лагало, а начало подвисать, как только первая табличка в грид подгрузилась. Так что не увидел причину в пустом гриде.
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
13.06.2018, 10:03  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
Вот как раз этого я и не увидел по видео. Пока нет никаких данных - приложение не лагало, а начало подвисать, как только первая табличка в грид подгрузилась. Так что не увидел причину в пустом гриде.
Можете пример использования datatable привести? Чтобы выводил данные из конкретной таблицы и нужных столбцов?
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
13.06.2018, 10:33
Смотря как заливать данные в таблицу.
Можно заливать с помощью асинхронной операции, используя таску и метод adapter.Fill(DataTable dt).
По поводу отдельных столбцов - тут вариантов несколько:
1. Используя команду в БД - указывая только нужные столбцы из таблиц/представлений
2. Используя клиент - и наполняя новую таблицу из уже существующей, приводя таблицу к DataView
C#
1
2
DataTable dt = new DataTable();
        var dt1 = dt.DefaultView.ToTable([вот тут кучка параметров, включая колонки]);
Ну а далее, как табличка заполнена - просто ставь её как датасорс (это если используешь локальную табличку, как указано в примере), или используя байндинг, если есть отдельная модель с отдельным набором классов.
типа
C#
1
gridview.DataSource = dt;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.06.2018, 10:33
Помогаю со студенческими работами здесь

Во втором DataGridView отобразить данные, используя значения выбранной строчки первого DataGridView
Доброго времени суток, Ув. Форумчане! Такой вопрос: Во во втором DataGridView отобразить данные используя значения выбранной строчки...

Вывод информации в DataGridView в зависимости от выбора в другом DataGridView
Прошу прощения сразу же потому что видел много тем похожих, но ответа так и не могу найти. Есть два датагрида, к первому привязана таблица...

Нужно, чтобы при выборе элемента в одном DataGridView отображались связанные данные в другом DataGridView
Есть две связанные таблицы и соответственно два DataGridView, нужно, чтобы при выборе элемента в одном DataGridView отображались связанные...

DataGridView и Access, составить запрос для dataGridView
У меня есть БД Access, в ней таблица , а в таблице два столбца, один , другой И заполнены они, к примеру, таким образом: ...

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru