Отображение большой таблицы данных

Отказ от ответственности: моя карьера была во встроенном программном обеспечении, и я только недавно получил в настольных приложениях. Приложение, которое я разрабатываю, имеет симуляцию, которая создает разреженную двумерную матрицу, которая может быть порядка 3000х3000 элементов. Объект разреженной матрицы происходит из класса, который мы создали в доме. У меня есть требование отображать эту разреженную матрицу в развернутом виде для пользователя.

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

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

  1. Похоже, что нет способа передать в DataGridView максимальное количество строк и / или столбцов (для масштабирования полос прокрутки). Если я установлю.RowCount и / или.ColumnCount, приложение зависнет на 2 минуты для создания столбцов.
  2. Я теряю сортировку столбцов в виртуальном режиме. Кажется, есть некоторый способ сделать это в документации MSDN, но это не очевидно.

Это наводит меня на мысль, что данные в мире GUI не предназначены для просмотра в больших громоздких таблицах (особенно с тысячами столбцов), особенно с учетом того, что мы уже получили их в разреженной матричной форме. Я думаю, что мне нужно отодвинуть требование.

Что бы вы сделали в моей ситуации?

0 ответов

Установка RowCount может занять много времени, если есть какие-либо столбцы, для которых установлено значение AutoSizeMode, отличное от None. Если вам нужны другие настройки, вы можете временно установить для них значение none, затем установить RowCount, а затем установить их на то, что вы действительно хотели.

Что касается сортировки столбцов, вам придется свернуть свою собственную, но я нашел это проще, чем ожидалось. Вам понадобится пара полей, в которых будет записано, какой столбец (индекс) в настоящее время сортируется и в каком направлении:

private int _currentSortedColumnIndex = -1; // No sorting at first
private SortOrder _sortOrder = SortOrder.None;

Затем вам нужно установить обработчик событий для ColumnHeaderMouseClick:

myDataGridView.ColumnHeaderMouseClick += MyDataGridView_ColumnHeaderMouseClick;

Сам обработчик событий настраивает отсортированный столбец, чтобы он имел правильный глиф сортировки, и запускает сортировку ваших исходных данных:

private void MyDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (_currentSortedColumnIndex >= 0 && _currentSortedColumnIndex < myDataGridView.ColumnCount)
        mysDataGridView.Columns[_currentSortedColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.None;

    if (_currentSortedColumnIndex == e.ColumnIndex)
        _sortOrder = _sortOrder == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;
    else
    {
        _currentSortedColumnIndex = e.ColumnIndex;
        _sortOrder = SortOrder.Ascending;
    }

    mysDataGridView.Columns[_currentSortedColumnIndex].HeaderCell.SortGlyphDirection = _sortOrder;

    SortRecords(_currentSortedColumnIndex, _sortOrder);
    RefreshGrid();
}

SortRecords() - это то место, где вы подготавливаете кеш данных, чтобы обработчик событий CellValueNeeded мог загружать ячейки в новом порядке сортировки, который хранится в _currentSortedColumnIndex и _sortOrder.

RefreshGrid() - это то место, где вы в основном очищаете сетку, чтобы она запускала события CellValueNeeded.

Другие вопросы по тегам