DataGridView清除失效 重新绑定数据源仍显示用户编辑内容如何解决?
问题根源
- WinForm的DataGridView与DataTable默认是双向绑定关系,你在界面上对控件做的新增、删除、修改操作,会直接同步到绑定的内存对象
modelDS.Tables[0]中。你重新绑定的始终是已经被修改过的同一个DataTable对象,自然不会显示原始数据。 - 你测试的清空方法不生效还有语法层面的问题:代码中存在大量拼写错误(比如控件名
datagridView18/datagridview18/datagrdiview18拼写不一致、方法调用缺少括号和分号、关键字拼写错误如retrun),运行时会抛出异常,后续的绑定逻辑根本不会执行,看起来就像清空操作无效。
修复方案
你可以根据业务场景选择以下任意一种方案实现:
方案1:回滚DataTable的修改(最简单)
DataTable默认会跟踪所有未提交的变更,直接调用回滚方法即可恢复到初始加载状态,不需要额外存储备份:
private void button1_Click (object sender, EventArgs e) { DataTable dt = (DataTable)dataGridView18.DataSource; // 回滚所有未提交的修改,直接恢复到初始加载的原始数据状态 dt.RejectChanges(); }
方案2:每次重载重新查询数据库
每次点击重载按钮时重新从数据库拉取最新的原始数据,避免复用被修改过的内存缓存:
private void button1_Click (object sender, EventArgs e) { // 重新从数据库查询原始数据 modelDS = db.getModelList(); dataGridView18.DataSource = null; dataGridView18.DataSource = modelDS.Tables[0]; }
方案3:初始加载时保留原始数据备份
第一次加载数据时就备份原始数据,重载时用备份恢复数据源即可:
private DataSet modelDS = null; // 新增字段存储原始数据备份 private DataTable originalModelTable = null; // 初始加载逻辑 modelDS = db.getModelList(); // 复制原始数据存为备份,避免备份被后续修改污染 originalModelTable = modelDS.Tables[0].Copy(); dataGridView18.DataSource = modelDS.Tables[0]; private void button1_Click (object sender, EventArgs e) { dataGridView18.DataSource = null; // 用备份恢复数据源,每次恢复都复制新的对象,防止备份被修改 modelDS.Tables[0] = originalModelTable.Copy(); dataGridView18.DataSource = modelDS.Tables[0]; }
内容的提问来源于stack exchange,提问作者Tokhi
相关产品推荐
相关产品推荐

