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