显示一个大的数据表
本文关键字:数据表 一个 显示 | 更新日期: 2023-09-27 18:06:14
免责声明:我的职业生涯一直是嵌入式软件,我最近才开始接触桌面应用程序。我正在开发的应用程序有一个模拟,它产生一个稀疏的2-D矩阵,可以有3000 × 3000个元素。稀疏矩阵对象来自我们在内部创建的一个类。我需要将这个稀疏矩阵以其展开形式显示给用户。
我最初将其扩展为一个数据表并将其绑定到一个DataGridView,但是由于列FillWeights的总和超过了限制而遇到了障碍。即使克服了这个问题,在表中显示任何内容之前也需要几分钟的处理时间。
我遇到了DataGridView的虚拟模式。虚拟模式似乎非常适合我所拥有的,但仍有几个问题:- 似乎没有一种方法来传达给DataGridView的最大行数和/或列(为了缩放滚动条的目的)。如果我设置。rowcount和/或。columncount,应用程序在创建列时挂起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事件。