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

Posted

技术标签:

【中文标题】对 DataGridView 进行排序后,如何更新数据源以反映 DataGridView 的绑定?【英文标题】:When DataGridView is sorted, how do I update the data source to reflect the DataGridView's binding? 【发布时间】:2016-10-24 20:34:56 【问题描述】:

我的 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.Sorted 事件中处理它,但没有提出任何可行的解决方案。

【问题讨论】:

你在标题鼠标点击中做什么? 您是否在代码中设置了 Clumns SortMode?​​span> 排序后可以试试_dataTable = _dataTable.DefaultView.ToTable();_dataTable = _dataTable.Select("", _dataTable.DefaultView.Sort).CopyToDataTable();***.com/questions/5005658/… @viveknuna 我没有为标题鼠标单击实现任何东西,我也没有定义列排序模式。 你必须这样做 【参考方案1】:

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

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

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

更好的是,将列名存储在设置中,并且每当将表加载到网格视图中时,告诉网格视图对存储在该设置中的列进行排序。我不确定我是否清楚 - 抱歉。

【讨论】:

您的评论实际上帮助我意识到我可能不允许对 DataGridView 的列进行排序。此 DataGridView 的最初目的是允许用户拖放行以按照他们想要的方式对其进行排序。我可能只需要创建一个类似但不拖放并且允许对列进行排序的不同 DataGridView。 有时允许用户为列表提供自定义顺序是合适的。例如,我开发了一个设施预订应用程序,它允许管理员用户定义日历,用户可以选择在其中显示他们的事件。管理员用户可以手动对日历进行排序,因为他们喜欢的顺序通常不会由任何列决定,而只是用户的偏好问题。如果是这种情况,用户需要/想要一个不依赖于任何列的自定义顺序,为该表设置一个排序顺序列可能是有意义的。 让它拖放有点复杂,但完全可行。问题实际上归结为按任何现有列进行排序是否足以满足用户的需求。【参考方案2】:

在msdn 上有很好的解释。您必须设置 Columns SortMode 和升序/降序方向。

【讨论】:

以上是关于对 DataGridView 进行排序后,如何更新数据源以反映 DataGridView 的绑定?的主要内容,如果未能解决你的问题,请参考以下文章

C#对datagridview数据排序

使用绑定源时如何按字母顺序对 DataGridView 进行排序?

如何在winforms的datagridview中将字符串排序为数字

更新后如何连续刷新datagridview

如何在 DataGridView 中禁用排序?

点击DataGridView表头自动排序后,更改的Cell值,过程中DataView行序改变??