在DataGridView中排序时的等待光标

3

我正在使用标准的 .Net 2.0 DataGridView,并将排序模式设置为自动。但是它非常非常慢(这可能应该是另一个问题,关于如何加速它),我似乎找不到一个事件或一组事件,可以在执行此排序操作时保持 WaitCursor。

有什么想法吗?

2个回答

5
钩取“MouseDown”事件,使用“HitTest”方法检查用户单击的位置。如果用户单击了列标题,则设置“Cursor.Current = Cursors.Wait”,并将一些标志“isSorting”设置为true。
钩取“Sorted”事件,而不是“MouseUp”事件。 “MouseUp”是有功能的,但是“Sorted”是更加简洁的解决方案。
钩取“MouseUp”事件,检查“isSorting”标志是否为true,然后设置“Cursor.Current = Cursors.Default”。

如果排序速度非常缓慢,我认为MouseUp事件可能会在排序完成之前很久就发生了... - Rockcoder
是的,在排序完成之前,鼠标抬起操作将完全执行。 - Greg J
这就是我做出假设的结果。我试过了,mouseup事件直到排序完成后才被触发。干得好! - Greg J
@Mr. Brownstone - 不应该。 排序在UI线程中进行,因此来自Windows的“鼠标抬起”消息在排序完成后进行处理。 - TcKs
为什么不使用 ColumnHeaderMouseClick - ProfK

0

时光荏苒,转眼到了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;
        }
    }

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接