繁体   English   中英

显示大数据表

[英]Displaying a large table of data

免责声明:我的职业是嵌入式软件,我最近才进入桌面应用程序。 我正在开发的应用程序有一个模拟,它生成一个稀疏的二维矩阵,可以是 3000x3000 元素的数量级。 稀疏矩阵对象来自我们在内部创建的一个类。 我需要以扩展形式向用户显示这个稀疏矩阵。

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

我遇到了 DataGridView 的虚拟模式。 虚拟模式似乎非常适合我所拥有的,但仍然存在几个问题:

  1. 似乎没有办法向 DataGridView 传达最大行数和/或列数(为了缩放滚动条)。 如果我设置 .RowCount 和/或 .ColumnCount,应用程序将挂起 2 分钟以创建列。
  2. 我在虚拟模式下丢失了列排序。 MSDN文档中似乎有某种方法可以做到这一点,但并不明显。

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

在我的情况下你会怎么做?

如果有任何列的 AutoSizeMode 设置为 None 以外的值,则设置 RowCount 可能需要很长时间。 如果您需要其他设置,您可以暂时将它们设置为无,然后设置 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 事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM