编辑时防止数据绑定DataGridView排序

时间:2011-11-10 00:40:41

标签: c# winforms sorting datagridview edit

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

这对用户来说非常迷惑,并且无法将编辑行组合在一起。

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

4 个答案:

答案 0 :(得分:7)

为了别人的利益,这是我提出的解决方案,但我希望能听到更好的解决方案。

我在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并在所选列上显示排序字形时暂停更新。

答案 1 :(得分: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

答案 2 :(得分:0)

我遇到了这个问题并且得不到合适的答案,所以我尝试了这个并且它有效,

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

只需将defaultview转换回表并将其设置为datagridview的源

答案 3 :(得分:-2)

听起来你的GridView再次是数据绑定。这意味着您的排序顺序将丢失。启用gridview的Viewstate,并确保在回发时不绑定网格。