Преобразование DataGridView в VirtualMode, чтобы попытаться повысить производительность.C#

Место общения программистов C#
Ответить
Anonymous
 Преобразование DataGridView в VirtualMode, чтобы попытаться повысить производительность.

Сообщение Anonymous »

У меня есть приложение, реализующее DataGridView. На DataGridView широко используются ссылки: добавление строк (из XML-файла), изменение видимости строк, изменение видимости столбцов, добавление цвета/форматирования к определенным ячейкам, пользовательская сортировка и т. д., а также множество итераций foreach и Parallel.foreach в коллекции строк. выбранные ячейки, выбранные строки и т. д.
Все работает нормально, но DataGridView не справляется с очень большим количеством строк. Я пытался найти способ повысить производительность без необходимости переписывать все приложение. В идеале я хочу создать производный класс, который повысит производительность, и тогда все, что мне нужно будет сделать, это ссылаться на производный класс (вместо класса DataGridView) при создании объекта таблицы в конструкторе.
Я читал о VirtualMode, а также об этом: реализует ли Windows Forms DataGridView настоящий виртуальный режим? Это предполагает, что VirtualMode на самом деле является только гибридным виртуальным режимом. Ниже я написал доказательство концепции (требуется много работы!), но, похоже, оно совсем не улучшает производительность. У меня сложилось мнение, что этот подход в принципе ошибочен, поскольку по сути DataGridView по-прежнему загружает все строки. Я не могу сразу увидеть простой способ обойти это, потому что операторы foreach в другом месте кода все равно должны «видеть» весь набор данных, а другие атрибуты строк (например, цвет, шрифт и т. д.) все равно должны существовать. для каждой строки.
Прежде чем я полностью откажусь от этого, достижимо ли то, что я пытаюсь сделать таким способом?
Проверка концептуального кода ( это не влияет на производительность):
public class CachedEditableDataGridView : DataGridView
{
List cache = new List();

public CachedEditableDataGridView()
{
VirtualMode = true;

this.RowsAdded += new DataGridViewRowsAddedEventHandler(CachedEditableDataGridView_RowsAdded);
this.RowsRemoved += new DataGridViewRowsRemovedEventHandler(CachedEditableDataGridView_RowsRemoved);
this.CellValueNeeded += new DataGridViewCellValueEventHandler(CachedEditableDataGridView_CellValueNeeded);
this.CellValuePushed += new DataGridViewCellValueEventHandler(CachedEditableDataGridView_CellValuePushed);

}

private void CachedEditableDataGridView_RowsAdded(object sender,
DataGridViewRowsAddedEventArgs e)
{

object[] obj = new object[this.Columns.Count];

cache.Add(obj);

this.RowCount = cache.Count;

}

private void CachedEditableDataGridView_RowsRemoved(object sender,
DataGridViewRowsRemovedEventArgs e)
{
cache.RemoveAt(e.RowIndex);
this.RowCount = cache.Count;
}

private void CachedEditableDataGridView_CellValueNeeded(object sender,
DataGridViewCellValueEventArgs e)
{
if (cache.Count == 0)
{
e.Value = String.Empty;
}
else
{
e.Value = cache[e.RowIndex][e.ColumnIndex];
}
}

private void CachedEditableDataGridView_CellValuePushed(object sender,
DataGridViewCellValueEventArgs e)
{
cache[e.RowIndex][e.ColumnIndex] = e.Value;
}

}


Подробнее здесь: https://stackoverflow.com/questions/793 ... erformance
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»