免责声明:我的职业生涯一直是嵌入式软件,而且我最近刚进入桌面应用程序。我正在开发的应用程序具有模拟,该模拟产生稀疏的2-D矩阵,其可以是3000×3000个元素的量级。稀疏矩阵对象来自我们在内部创建的类。我需要以扩展形式向用户显示这个稀疏矩阵。
我最初将它扩展为DataTable并将其绑定到DataGridView,但是FillWeights列的总和超出限制时遇到了障碍。即使克服了这一点,在表格中显示任何内容之前,还需要几分钟的处理时间。
我遇到了DataGridView的虚拟模式。虚拟模式似乎非常适合我所拥有的,但仍有几个问题:
这让我相信GUI世界中的数据并不意味着要在大的笨重的表格中查看(特别是有数千列),特别是考虑到我们已经以稀疏矩阵的形式获得它。我想我需要回到这个要求。
在我的情况下你会做什么?
答案 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事件。