С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229

DataGridView тормозит при перемещении

04.01.2016, 10:23. Показов 3036. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.Добавил дочернюю форму, в неё поместил datagridview теперь при перекрещении дочерней формы она тормозит это при том что данные в dgv ещё не помещал, а данных будет много тысяч ячеек со значениями. Вопрос есть ли решение проблемы если нет тогда может есть нормальная альтернатива datagridview?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2016, 10:23
Ответы с готовыми решениями:

DataGridView тормозит
Здравствуйте. Возможно я где-то адово туплю, так что прошу направить на путь истины. Суть в чём - есть программа, с несколькими таблицами...

Событие при при перемещении курсора мыши в уже выпавшем списке ComboBox
Всех с Наступившим Новым Годом! Счастья и удачи побольше в этом году! Не подскажите ли какое событие возникает при перемещении курсора...

DataGridView ужасно тормозит. Существует ли альтернатива?
здравствуйте, подскажите или посоветуете, как реализовать или где скачать быстрый DataGridView (стандартный очень тормозной для моих...

13
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
04.01.2016, 10:54
Цитата Сообщение от Graf1385 Посмотреть сообщение
теперь при перекрещении дочерней формы она тормозит
Переведи на русский.
Цитата Сообщение от Graf1385 Посмотреть сообщение
а данных будет много тысяч ячеек со значениями.
Ну и нафига столько выводить? Юзер будет обязательно в каждую строчку вчитываться?
1
64 / 64 / 35
Регистрация: 14.12.2015
Сообщений: 145
04.01.2016, 12:10
Graf1385, привет! Конкретно с лагами от прорисовки помогает свойство контролов
C#
1
DoubleBuffered =true;
, а выводить тысячи строк, имхо, странно.
1
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
05.01.2016, 01:08  [ТС]
Средний файл весит 450 м. Это 35000 строк по 256 ячеек в каждой 179 из них заполнены цифрами, файлы есть весом по 2g и больше. Идея в том чтобы отображать просто содержимое файла в ячейках для того чтобы юзер мог изменить данные. DoubleBuffered я побывал не помогает всё ровно лагает.
0
 Аватар для HectorPrima
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
05.01.2016, 05:23
Дружище ты кажется ничего не понял. Представь что файл будет 500Gb, ну никак ты его в память не загрузишь.
По этой причине вводится постраничная загрузка или фильтрация/ограничение отображаемого контента.
У строк есть номера или даты? Выводи от и до. Сделай поиск и загрузку только необходимых данных.
Вариантов решения масса.
Еще возникает вопрос как ты записывать будешь. Типа загрузил 2 Gb, изменил пару цифр и потом обратно два гига заливаешь?
1
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
05.01.2016, 06:15  [ТС]
У строк есть и номера и даты. Я не хотел загружать файл, я хотел отображать данные без загрузки прямо из файла. Правда ещё не придумал как это сделать.
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
05.01.2016, 07:13
Цитата Сообщение от Graf1385 Посмотреть сообщение
я хотел отображать данные без загрузки прямо из файла.
MemoryMappedFile что ли?
1
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
05.01.2016, 23:25  [ТС]
Цитата Сообщение от Woldemar89 Посмотреть сообщение
MemoryMappedFile что ли?
Да вот с ним я и попробую а там видно будет как быстрее будет. Я просто думаю что datagridview это всё будет медленно, какие ещё есть варианты таблиц? Мне главное чтобы можно было менять значения и перемещать столбцы и всё.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
06.01.2016, 00:57
При правильной реализации виртуального режима все должно работать быстро.
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
06.01.2016, 10:37
Цитата Сообщение от Graf1385 Посмотреть сообщение
Я просто думаю что datagridview это всё будет медленно, какие ещё есть варианты таблиц?
Цитата Сообщение от HectorPrima Посмотреть сообщение
По этой причине вводится постраничная загрузка или фильтрация/ограничение отображаемого контента.
Тебе же сказали, все выводить - необязательно, ты как вообще собираешься в 1кк строк ориентироваться например??
С тем же скроллом, который сожмется до планковской длины и при перемещении на 1мм будет пролетать 100к записей?
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.01.2016, 11:38
Graf1385, В каком формате хранятся данные? Приведите пример файла.
Опишите конечный результат который нужно получить. Каков функционал грида? Только просмотр?
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
06.01.2016, 11:40
Storm23,
Цитата Сообщение от Graf1385 Посмотреть сообщение
Средний файл весит 450 м. Это 35000 строк по 256 ячеек в каждой 179 из них заполнены цифрами, файлы есть весом по 2g и больше. Идея в том чтобы отображать просто содержимое файла в ячейках для того чтобы юзер мог изменить данные.
1
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
07.01.2016, 02:13  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
В каком формате хранятся данные? Приведите пример файла.
Опишите конечный результат который нужно получить. Каков функционал грида? Только просмотр?
Просмотр и редактирование одно строка это одна запись в записи 254 параметра то есть 254 столбца. Вот два файла в test1 и test2. В test1.dep записаны две записи с набором параметров как они есть, в test1.lst тут записано дата время глубина и нумерация записей. В test2 записана одно строка, в .xls скопированы все эти параметры из редактора.
Вложения
Тип файла: zip Test.zip (45.5 Кб, 6 просмотров)
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.01.2016, 12:51
Лучший ответ Сообщение было отмечено Graf1385 как решение

Решение

Graf1385, С вашим бинарным форматом я конечно разбираться не буду.
Но вот пример для бинарного файла, где содержатся записи фиксированного размера (256 чисел типа float на запись). В примере используется виртуальный режим грида и кеш файла с прелоадом и ленивой подгрузкой.
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
 
namespace WindowsFormsApplication327
{
    public partial class Form1 : Form
    {
        private CachedFile<MyRecord256> cache;
 
        public Form1()
        {
            InitializeComponent();
 
            var file = "c:\\temp345.bin";
 
            //create test file if needed
            CreateFileIfNeed(file);
 
            //create file cache
            cache = new CachedFile<MyRecord256>(file, 256 * 4);
 
            //create dgv in virtual mode
            var dgv = new DataGridView {Parent = this, Dock = DockStyle.Fill, VirtualMode = true, AllowUserToAddRows = false, ReadOnly = true, BackgroundColor = Color.White};
            dgv.RowCount = cache.RecordsCount;
            dgv.ColumnCount = 256;
            dgv.CellValueNeeded += (o, e) => e.Value = cache[e.RowIndex].Items[e.ColumnIndex];
        }
 
        private void CreateFileIfNeed(string filePath)
        {
            if(!File.Exists(filePath))
            {
                var rnd = new Random();
 
                using(var fs = new FileStream(filePath, FileMode.Create))
                using (var bw = new BinaryWriter(fs))
                    for (int i = 0; i < 500000; i++)
                    {
                        bw.Write((float)i);
                        for (int j = 0; j < 256 - 1; j++)
                            bw.Write((float) rnd.NextDouble());
                    }
            }
        }
    }
 
    /// <summary>
    /// Record of 256 float values
    /// </summary>
    public class MyRecord256:IRecord
    {
        public float[] Items = new float[256];
 
        public void Parse(BinaryReader br)
        {
            for (int i = 0; i < 256; i++)
                Items[i] = br.ReadSingle();
        }
    }
 
    /// <summary>
    /// Cached access to binary file
    /// </summary>
    public class CachedFile<T> where T : IRecord, new()
    {
        public int RecordsCount { get; private set; }
 
        private List<T> loadedRecords = new List<T>();
        private int firstLoadedRecordIndex;
        const int preLoadRecordsCount = 100;
        private string filePath;
        private int recordSize;
 
        public CachedFile(string filePath, int recordSize)
        {
            this.filePath = filePath;
            this.recordSize = recordSize;
            using (var fs = new FileStream(filePath, FileMode.Open))
                RecordsCount = (int)fs.Length/recordSize;
 
            //load first records
            Load(0);
        }
 
        /// <summary>
        /// Loads records to the cache
        /// </summary>
        void Load(int iRecord)
        {
            //Console.WriteLine(iRecord);
 
            //calc record index bounds
            var from = Math.Max(0, iRecord - preLoadRecordsCount);
            var to = Math.Min(from + preLoadRecordsCount * 2, RecordsCount - 1);
            var count = to - from + 1;
 
            //load records to cache from the file
            loadedRecords.Clear();
            using (var fs = new FileStream(filePath, FileMode.Open))
            using (var br = new BinaryReader(fs))
            {
                br.BaseStream.Seek(from * recordSize, SeekOrigin.Begin);
                for (int i = 0; i < count; i++)
                {
                    var rec = new T();
                    rec.Parse(br);
                    loadedRecords.Add(rec);
                }
            }
 
            firstLoadedRecordIndex = from;
        }
 
        /// <summary>
        /// Return record by index
        /// </summary>
        public T this[int iRecord]
        {
            get
            {
                if (iRecord < 0 || iRecord >= RecordsCount) throw new IndexOutOfRangeException();
                if (iRecord < firstLoadedRecordIndex || iRecord >= firstLoadedRecordIndex + loadedRecords.Count) Load(iRecord);
                return loadedRecords[iRecord - firstLoadedRecordIndex];
            }
        }
    }
 
    public interface IRecord
    {
        void Parse(BinaryReader br);
    }
}
При первом запуске генерируется тестовый бинарный файл (500000 записей по 256 float в каждой, общий размер файла - ок 500мб).
Расход памяти приложением - 18мб (и не зависит от числа записей в файле).
Просмотр файла не тормозит, не виснет, не фризит.
Сохранение отредактированых ячеек я не делал, можете реализовать самостоятельно.


3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2016, 12:51
Помогаю со студенческими работами здесь

Задержка при перемещении PictureBox-са
Всем привет! у меня на форме есть панель(panelcenter) на ней находится Picturebox1, в нем нарисован квадрат. Я мышкой двигаю пикчербокс...

Смещение окна при перемещении
При начале перемещения окна, оно смещается относительно координат. Форма без рамок В чем проблема ? private void...

Окно нестандартной формы мерцает и тормозит при перемещении
После назначения AllowsTransparency=&quot;True&quot; окно начинает притормаживать при перемещении. Как бы прилипает на пол секунды к экрану и снова...

При быстром перемещении окон и открытии меню приложение тормозит ubuntu
Последняя версия.

Тормозит dataGridView при повторной инициализации
У меня есть dataGridView размера примерно 40x16. Изначально в конструкторе таблица имеет всего один столбец, а при инициализации я этот...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru