我正在使用标准的 .Net 2.0 DataGridView,并将排序模式设置为自动。但是它非常非常慢(这可能应该是另一个问题,关于如何加速它),我似乎找不到一个事件或一组事件,可以在执行此排序操作时保持 WaitCursor。
有什么想法吗?
我正在使用标准的 .Net 2.0 DataGridView,并将排序模式设置为自动。但是它非常非常慢(这可能应该是另一个问题,关于如何加速它),我似乎找不到一个事件或一组事件,可以在执行此排序操作时保持 WaitCursor。
有什么想法吗?
时光荏苒,转眼到了2021年。我还在想如何正确地完成这个任务。
我尝试过哪些方法并没有奏效
CellMouseDown
事件也会在用户开始拖动(重新排序列头)时触发,所以这是一种妥协。
CellMouseClick
事件在Sorted
事件之后触发。由于线程在排序操作期间被占用,并且没有真正的SortStart
事件,我开始认为这是不可能的。
我最终采取的做法
如果您正在使用DataTable
作为您的GridView数据源,您将需要为每个列禁用自动排序功能。
foreach (DataGridViewColumn column in dgvUsers.Columns)
{
column.SortMode = DataGridViewColumnSortMode.Programmatic;
}
你也许可以使用 CellMouseDown
事件、CellMouseUp
事件和两个变量 mouseDownColumnIndex
和 sortExpression
作为先前排序操作的处理方式。
string mouseDownColumnName = "";
string sortExpression = "";
private void dgvUsers_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
mouseDownColumnName = dgvUsers.Columns[e.ColumnIndex].HeaderText;
}
private void dgvUsers_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Left // Obviously
&& e.RowIndex == -1 // column header row index
&& mouseDownColumnName == dgvUsers.Columns[e.ColumnIndex].HeaderText // No drag gesture
) {
dgvUsers.Cursor = Cursors.WaitCursor;
Task<DataTable> sortAction = Task<DataTable>.Factory.StartNew(() =>
{
DataView dvUsers = ((DataTable)dgvUsers.DataSource).DefaultView;
string headerText = dgvUsers.Columns[e.ColumnIndex].HeaderText;
if (sortExpression == $"{headerText} asc")
dvUsers.Sort = $"{headerText} desc";
else
dvUsers.Sort = $"{headerText} asc";
sortExpression = dvUsers.Sort;
return dvUsers.ToTable();
});
sortAction.Wait();
dgvUsers.DataSource = sortAction.Result;
dgvUsers.Cursor = Cursors.Default;
}
}
这似乎比默认的“自动”排序更快。
ColumnHeaderMouseClick
? - ProfK