DataTable绑定DataGridView排序后的数据同步与视图显示问题
DataGridView绑定DataTable排序后的数据同步问题解决
问题场景
- 从数据库填充
DataTable,直接绑定到DataGridView实现数据展示 - 需要根据指定列对
DataTable行重新排序,尝试两种方案均出现异常:- 采用LINQ+Lambda排序
DataTable:排序后DataGridView无法显示正确顺序,且DGV输入无法同步到DataTable - 用
DataView中转排序:显示顺序正常,但DGV输入无法同步到原DataTable
- 采用LINQ+Lambda排序
问题分析与解决步骤
1. LINQ排序导致绑定失效的根因
使用LINQ排序DataTable的代码如下:
dtTable = dtTable.AsEnumerable().OrderBy(r => r.Field<Int64>("Col1")).CopyToDataTable();
CopyToDataTable()会生成全新的DataTable实例,而原DataGridView绑定的仍是旧的DataTable对象,导致绑定关系断裂:既无法显示新表的排序结果,也无法同步DGV的输入内容。
2. 修复绑定同步的方案
通过重新创建BindingSource建立新的绑定关系,让DataGridView与排序后的DataTable保持双向绑定:
BindingSource newBindingSource = new BindingSource(); MyDGV.DataSource = newBindingSource; newBindingSource.DataSource = dtTable;
处理完成后,DataGridView会正确显示排序后的顺序,用户在DGV中的输入会同步到dtTable,后续通过代码添加DataRow也能正常同步展示。
3. DataView方案的正确用法
如果偏好使用DataView排序,无需单独创建视图,直接修改原DataTable的默认视图排序规则即可,这样能保留双向同步能力:
dtTable.DefaultView.Sort = "Col1 ASC"; MyDGV.DataSource = dtTable.DefaultView;
这种方式无需重新绑定,排序基于原DataTable的视图实现,DGV的输入会自动同步到原表,是更轻量的排序方案。
内容的提问来源于stack exchange,提问作者H.Pradella
相关产品推荐
相关产品推荐

