防止数据绑定的DataGridView在编辑时进行排序

4

我在Win Forms应用程序中有一个数据绑定的DataGridView,用户可能会按列排序。问题是:用户在编辑已排序列中的单元格并离开行后,该行立即重新排序。

这对用户来说非常令人迷惑,使得一起编辑多行变得不可能。

我正在寻找的解决方案将有效地禁用初始排序后的自动重新排序,只有在用户请求时才会重新排序。

4个回答

8
为了方便大家,这里是我想出的解决方法,但我很想听听更好的方法。
我在DataTable中添加了一个名为SORT_ORDER的额外非持久性列,仅用于排序。
当用户单击要排序的列时,我将选定列的值和值类型复制到SORT_ORDER列,然后按SORT_ORDER进行排序。由于SORT_ORDER不可见且无法编辑,因此即使用户编辑所选列,排序顺序也不会改变。事件处理程序如下所示:
    private void MyDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
        dirtyCellListenerEnabled = false;

        SORT_ORDER.ValueType = MyDataGridView.Columns[e.ColumnIndex].ValueType;

        foreach(DataGridViewRow r in MyDataGridView.Rows) {
            r.Cells[SORT_ORDER.Index].Value = r.Cells[e.ColumnIndex].Value;
        }

        switch(MyDataGridView.SortOrder) {
            case System.Windows.Forms.SortOrder.None:
                MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending);
                break;
            case System.Windows.Forms.SortOrder.Ascending:
                MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Descending);
                break;
            case System.Windows.Forms.SortOrder.Descending:
                MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending);
                break;
        }
        dirtyCellListenerEnabled = true;
    }

请注意,我必须禁用并重新启用我的单元格监听器,以便我的代码不将排序列更新视为真正的更改。
在找到这个解决方案之前,我也尝试将排序列添加到DataGridView中,但它不起作用,因为DataGridView无法对不存在于其数据源中的列进行排序。
我相信还有其他一些调整可以做,比如在填充SORT_ORDER和显示所选列上的排序符号时暂停更新。

2
既然没有人提供更好的解决方案,那我就接受自己的答案。 - didge

1

我现在深刻地感受到这是一种真正的痛苦。有时候,网格看起来非常复杂,但实际上并没有什么意义。

对于每个选定的单元格,我都会存储主键和网格列的名称(我创建了一个小类来保存它们)。

然后,我将它们全部放入列表中,并遍历它们进行更新。每次更新单元格值时,我会搜索实际单元格的位置,并替换我的本地引用变量以便我可以继续在代码中进行。

       Cell.Value = ValueToWrite
       Cell = FindCell(Cell.OwningRow.DataGridView, DataRow, ColName)

Function FindCell(Grid As DataGridView, DataRow As DataRow, ColName As String) As DataGridViewCell
    'Find the same cell, wherever you may be now, damn you sort.
    Dim GridRow = (From x As DataGridViewRow In Grid.Rows Where x.DataBoundItem.row Is DataRow).FirstOrDefault
    Dim Cell = GridRow.Cells(ColName)
    Return Cell
End Function

0

我遇到了这个问题,但是找不到一个合适的答案,所以我尝试了一下,结果成功了。

    private void SortBoundDG()
    {
        DataTable TempTable;
        TempTable = (DataTable)DG.DataSource;
        TempTable.DefaultView.Sort =  ColumnName + " " + "DESC";
        DG.DataSource = TempTable.DefaultView.ToTable();
    }

只需将默认视图简单地转换回表格,并将其设置为您的DataGridView的数据源


-2

看起来你的GridView正在重新绑定数据。这意味着你的排序顺序将会丢失。启用你的gridview的Viewstate,并确保你没有在postback时重新绑定grid。


这个回答很有趣。我不会因为这个而给它点踩 :) - Icarus
问题是关于winforms,而不是ASP网页表单。 - Chris Pfohl

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