显示一个大的数据表

本文关键字:数据表 一个 显示 | 更新日期: 2023-09-27 18:06:14

免责声明:我的职业生涯一直是嵌入式软件,我最近才开始接触桌面应用程序。我正在开发的应用程序有一个模拟,它产生一个稀疏的2-D矩阵,可以有3000 × 3000个元素。稀疏矩阵对象来自我们在内部创建的一个类。我需要将这个稀疏矩阵以其展开形式显示给用户。

我最初将其扩展为一个数据表并将其绑定到一个DataGridView,但是由于列FillWeights的总和超过了限制而遇到了障碍。即使克服了这个问题,在表中显示任何内容之前也需要几分钟的处理时间。

我遇到了DataGridView的虚拟模式。虚拟模式似乎非常适合我所拥有的,但仍有几个问题:
  1. 似乎没有一种方法来传达给DataGridView的最大行数和/或列(为了缩放滚动条的目的)。如果我设置。rowcount和/或。columncount,应用程序在创建列时挂起2分钟。
  2. 我失去列排序在虚拟模式。在MSDN文档中似乎有一些方法可以做到这一点,但并不明显。

这使我相信GUI世界中的数据不应该以笨重的大表(特别是有数千列的表)来查看,特别是考虑到我们已经以稀疏矩阵的形式获得了数据。我想我需要推迟这个要求。

如果你是我,你会怎么做?

显示一个大的数据表

如果有任何列的AutoSizeMode设置为非None,则设置RowCount可能会花费很长时间。如果您需要其他设置,您可以暂时将它们设置为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()是您准备数据缓存的地方,以便您的cellvaluenneeded事件处理程序可以以新的排序顺序提供单元格,该排序顺序存储在_currentSortedColumnIndex和_sortOrder中。

RefreshGrid()是你清除网格的地方,这样它就会开始触发cellvaluenneeded事件。