我在列上使用具有自动排序模式的标准 .Net 2.0 DataGridView。它非常慢(这可能应该是关于如何加快速度的另一个问题),但我似乎找不到在执行此排序操作时将保持 WaitCursor 的事件或事件组合。
想法?
我在列上使用具有自动排序模式的标准 .Net 2.0 DataGridView。它非常慢(这可能应该是关于如何加快速度的另一个问题),但我似乎找不到在执行此排序操作时将保持 WaitCursor 的事件或事件组合。
想法?
钩住“MouseDown”事件,检查用户点击的“HitTest”方法。如果用户单击列标题设置“Cursor.Current = Cursors.Wait”并将某些标志“isSorting”设置为 true。
挂钩“MouseUp”事件,检查“isSorting”标志是否为真,然后设置“Cursor.Current = Cursors.Default”。
编辑: 使用“Sorted”事件而不是“MouseUp”。“MouseUp”是功能性的,但“Sorted”是“更清洁”的解决方案。
Anno 2021,最好的死灵术 :) 我仍在寻找一种正确执行此操作的方法。
我试过的和没用的
CellMouseDown
当用户开始拖动(重新排序列标题)时,也会触发该事件。所以这是一个妥协。
事件在事件CellMouseClick
之后触发Sorted
。由于在排序操作期间线程被占用并且没有真正的SortStart
事件,我开始认为这是不可能的。
我最终做了什么
如果您使用 aDataTable
作为 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;
}
}
这似乎比默认的“自动”排序更快。