winforms 对DataGridView进行排序时,如何更新数据源以反映DataGridView的绑定?

5ssjco0h  于 2023-01-14  发布在  其他
关注(0)|答案(2)|浏览(217)

我的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中处理它。排序事件,但还没有找到任何可行的解决方案。

b1payxdu

b1payxdu1#

无法将视图的排序转移到表中-DataGridView或DataTable类提供的排序都无法转移到表中。为什么要这样做?如果基于列进行排序,则该列位于表中,并且在您希望按该列的顺序循环访问或排序表时,该列也将位于表中。
如果你想保存用户对视图的排序列的选择,这与保存每一行的特定排序位置是不同的。我建议只保存用户选择的列。这不属于同一个表,而是属于一个单独的设置存储器。如果你确实想存储每一行的排序位置,那么您确实需要一个单独的列,其中每一行都具有排序顺序,并且您将需要捕获标头鼠标单击事件并适当地重新填充该列。
此外,在向表中添加排序顺序列(取决于用户选择对数据排序的列)的那一刻,您就反规范化了数据。这意味着您将遇到维护数据完整性的问题-您将不得不捕获所有类型的事件并重新更新该列...例如,如果用户更改了表中间某行的值,这样它现在就属于末尾......更新该行以及该行新旧位置之间的每一行的排序顺序列的值。如果用户删除了一行--更新被删除的行与表的最后一行之间的所有行的排序顺序列的值......如此等等,各种用户操作层出不穷。
更好的方法是将列名存储在一个设置中,每当表加载到gridview中时,告诉gridview对存储在该设置中的列进行排序。我不确定我是否说清楚了-抱歉。

zzlelutf

zzlelutf2#

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

相关问题