WaitCursor在DataGridView中排序

时间:2008-11-11 16:36:12

标签: .net sorting datagridview .net-2.0

我在列上使用标准的.Net 2.0 DataGridView和自动排序模式。它非常非常慢(这可能是关于如何加速它的另一个问题)但我似乎无法找到在执行此排序操作时将维护WaitCursor的事件或事件组合。

想法?

2 个答案:

答案 0 :(得分:5)

挂钩“MouseDown”事件,使用“HitTest”方法检查用户点击的方法。如果用户单击列标题设置“Cursor.Current = Cursors.Wait”并将一些标志“isSorting”设置为true。

挂钩“MouseUp”事件,检查“isSorting”标志是否为true,然后设置“Cursor.Current = Cursors.Default”。

修改 使用“已排序”事件而不是“MouseUp”。 “MouseUp”很有趣,但“Sorted”是“更清洁”的解决方案。

答案 1 :(得分:0)

Anno 2021,最好的死灵法术 :) 我仍在寻找正确执行此操作的方法。

我尝试过的方法和无效的方法

当用户开始拖动(重新排序列标题)时,也会触发 CellMouseDown 事件。所以这是一种妥协。

CellMouseClick 事件在 Sorted 事件之后触发。由于在排序操作期间线程被占用并且没有真正的 SortStart 事件,我开始认为这是不可能的。

我最终做了什么

如果您使用 DataTable 作为 gridview 的数据源,则必须禁用每列的自动排序。

foreach (DataGridViewColumn column in dgvUsers.Columns)
{
    column.SortMode = DataGridViewColumnSortMode.Programmatic;
}

你也许可以用 我最终使用 CellMouseDown 事件、CellMouseUp 事件和两个变量 mouseDownColumnIndexsortExpression 作为之前排序操作的句柄。

    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;
        }
    }

这似乎比默认的“自动”排序更快。