【问题标题】:WaitCursor on sort in DataGridView在 DataGridView 中排序的 WaitCursor
【发布时间】:2010-09-21 20:07:20
【问题描述】:

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

想法?

【问题讨论】:

    标签: .net sorting datagridview .net-2.0


    【解决方案1】:

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

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

    编辑: 使用“Sorted”事件而不是“MouseUp”。 “MouseUp”是功能性的,但“Sorted”是“更清洁”的解决方案。

    【讨论】:

    • 我认为 MouseUp 事件可能会在排序完成之前很久发生,如果它真的很慢......
    • 是的,在排序完成之前,鼠标向上将完全完成。
    • 这就是我假设的结果。我刚刚尝试过,直到排序实际完成才触发 mouseup 事件。干得好!
    • @Mr.布朗斯通 - 它不应该。排序是在 UI 线程中进行的,因此来自 windows 的“鼠标向上”消息是在排序完成后进行的。
    • 为什么不ColumnHeaderMouseClick
    【解决方案2】:

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

    我尝试了什么,什么没用

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

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

    我最终做了什么

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 2017-05-05
      • 2011-08-07
      • 2012-09-15
      相关资源
      最近更新 更多