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

时间:2016-10-24 20:34:57

标签: c# winforms datagridview datatable

我的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中行的顺序。我怎样才能得到它__ataTable像DataGridView一样排序?

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

2 个答案:

答案 0 :(得分:1)

无法将视图的排序转移到表中 - 而不是DataGridView或DataTable类提供的任何排序。你为什么想要?如果您基于列进行排序,则该列位于表中,并且只要您希望按该列的顺序迭代或排序表,该列就会出现在表中。

如果要保留用户对视图的排序列的选择,那么与尝试保存每行的特定排序位置不同。我建议只保存用户选择的列。这不属于同一个表,而是属于单独的设置存储。如果您绝对想要存储每行的排序位置,那么您需要一个单独的列,该列具有每行的排序顺序,您需要捕获标题鼠标单击事件并适当地重新填充该列。

此外,当您向该表添加排序顺序列时,这取决于用户选择对数据进行排序的列,您可以对数据进行反规范化。这意味着您将遇到维护数据完整性的问题 - 您必须捕获所有类型的事件并重新更新该列...例如,如果用户更改表中间的行的值,该怎么办?这样它现在属于最后...更新该行的排序顺序列的值以及它在旧位置和新位置之间的每一行。如果用户删除一行,那么该怎么办 - 更新表格的删除行和最后一行之间的所有行的排序顺序列的值....以及各种用户操作的开启和结束。

< p> 更好的是,将列名存储在一个设置中,每当表加载到gridview中时,告诉gridview对存储在该设置中的列进行排序。我不确定我是否清楚 - 抱歉。

答案 1 :(得分:1)

msdn上做了很好的解释。您必须设置列SortMode和方向升序/降序。