当DataGridView排序后,如何更新数据源以反映DataGridView's绑定?

本文关键字:DataGridView 绑定 数据源 排序 何更新 更新 | 更新日期: 2023-09-27 18:14:47

我有这些成员在我的DataGridView。

private DataTable _dataTable = new DataTable();
    
public DataTable DataTable {
    get { return _dataTable; }
    set {
        _dataTable = value;
        int rowIndex = -1;
        //want to preserve the location where the datagridview is scrolled to
        if (this.Rows.Count > 0) rowIndex = this.FirstDisplayedScrollingRowIndex;
        this.DataSource = new BindingSource() { DataSource = _dataTable };
        //-1 is out of bounds and the datasource could have been set
        //to a smaller amount of rows after the rowIndex was set
        if (rowIndex > -1 && rowIndex < _dataTable.Rows.Count) this.FirstDisplayedScrollingRowIndex = rowIndex;
    }
}

当添加、删除或编辑行时,它们是在_dataTable中完成的。当更改行时,设置DataTable,以便DataGridView通过将数据绑定到它来显示更改。我的问题是当DataGridView通过单击其中一个列标题排序。这会改变DataGridView的显示,但不会改变底层DataTable中的行顺序。我怎么能得到它,所以_dataTable是排序像DataGridView?

我考虑过添加一列来跟踪行索引,但似乎应该有另一种方式,我真的不想添加一列,因为这是一个抽象类。我试过在DataGridView中处理它。对事件进行了排序,但还没有提出任何可行的解决方案

当DataGridView排序后,如何更新数据源以反映DataGridView's绑定?

没有办法将视图的排序转移到表中-没有任何由DataGridView或DataTable类提供的方法。你为什么要这么做?如果您基于列进行排序,则该列在表中,并且在您希望按该列的顺序对表进行迭代或排序时将在表中出现。

如果您希望为视图持久化用户选择的排序列,那么这与尝试为每行保存特定的排序位置是不同的。我建议只保存用户选择的列。这将不属于同一个表,而是属于单独的设置存储。如果您绝对希望存储每行的排序位置,那么您确实需要一个单独的列,其中包含每行的排序顺序,并且您需要捕获标题鼠标单击事件并适当地重新填充该列。

此外,一旦向该表添加排序顺序列(这取决于用户选择对数据进行排序的列),就会对数据进行反规范化。这意味着您将遇到维护数据完整性的问题——您将不得不捕获所有类型的事件并重新更新该列……例如,如果用户更改了表中间一行的值,使其现在属于末尾,该怎么办?更新该行以及新旧位置之间的每一行的排序顺序列的值。如果用户删除了一行,那该怎么办?为删除的行和表的最后一行之间的所有行更新排序顺序列的值....还有各种各样的用户操作。

更好的做法是,将列名存储在一个设置中,每当将表加载到gridview中时,告诉gridview对存储在该设置中的列进行排序。

在msdn上解释得很好。您必须设置列排序模式和升序/降序方向。