C# DataGridView绑定可更新DataSource切换后数据丢失如何解决
DataGridView多数据源切换绑定内容丢失解决方案
问题核心原因
内容丢失基本都是绑定配置不匹配导致的,核心是预定义列和DataTable的列没有建立正确的映射关系,或者DataTable结构不统一。双向同步是.NET数据绑定的内置能力,只要配置正确无需额外写同步代码。
必做配置项
- 关闭自动生成列
窗体初始化阶段必须设置dataGridView1.AutoGenerateColumns = false;,避免每次绑定新数据源时自动生成多余列,导致预定义列无法匹配数据源。
- 关闭自动生成列
- 预定义列设置映射属性
所有预定义的列(包括ComboBox列)必须设置DataPropertyName属性,属性值必须和DataTable中对应的列名完全一致(大小写敏感)。
针对ComboBox列还需提前配置列本身的下拉数据源,初始化时执行一次即可:
注意:// 示例ComboBox列配置 你的ComboBox列名.DataSource = 下拉选项数据源; 你的ComboBox列名.DisplayMember = "下拉显示的字段名"; 你的ComboBox列名.ValueMember = "下拉存值的字段名"; 你的ComboBox列名.DataPropertyName = "对应DataTable的列名";ValueMember对应的字段类型必须和DataTable对应列的类型完全一致,比如都是int或者都是string,否则会出现绑定失败显示空的问题。- 预定义列设置映射属性
- 统一所有OB实例的DataTable结构
你当前代码中OB的data属性是默认初始化的空DataTable,没有固定列结构,必须在OB的构造函数中提前初始化统一的列,和上面DataPropertyName的配置一一对应:
public class OB { public DataTable data { get; private set; } public OB() { data = new DataTable(); // 按你的业务需求加列,列名和类型必须和预定义列的DataPropertyName匹配 data.Columns.Add("列名1", typeof(string)); data.Columns.Add("列名2", typeof(int)); // 其他列同理 } }- 统一所有OB实例的DataTable结构
推荐优化绑定方式
使用BindingSource作为中间绑定层,比直接绑定DataTable稳定性更高,切换数据源更流畅:
- 初始化阶段配置:
// 全局只需要执行一次 dataGridView1.DataSource = new BindingSource();
- 切换数据源的事件代码修改为:
public void some_selection_event(object s, EventArgs e) { var bindSource = (BindingSource)dataGridView1.DataSource; bindSource.DataSource = ((OB)s).data; }
完成以上配置后,DataGridView的修改会自动同步到对应OB实例的data属性中,切换数据源时不会再出现内容丢失的问题。
内容的提问来源于stack exchange,提问作者Borno Stojak
相关产品推荐
相关产品推荐

