显示大型数据表

时间:2016-09-09 04:32:15

标签: c# datagridview virtualmode large-data

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

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

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

  1. 似乎没有一种方法可以向DataGridView传达最大行数和/或列数(为了缩放滚动条)。如果我设置了.RowCount和/或.ColumnCount,则应用程序将挂起2分钟以创建列。
  2. 我在虚拟模式下丢失了列排序。在MSDN文档中似乎有某种方法可以做到,但它并不明显。
  3. 这让我相信GUI世界中的数据并不意味着要在大的笨重的表格中查看(特别是有数千列),特别是考虑到我们已经以稀疏矩阵的形式获得它。我想我需要回到这个要求。

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

1 个答案:

答案 0 :(得分:0)

如果有任何列的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事件。