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

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

04.01.2016, 10:23. Показов 3080. Ответов 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
10427 / 5157 / 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
10427 / 5157 / 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru