SQLite无法保存DataGridViewCheckBoxRow的首次状态变更问题
问题分析与修复方案
核心问题定位
你遇到的“首次修改不生效、后续操作执行前一次修改”,本质是DataGridView的CheckBox单元格状态未及时同步到DataSet,就触发了更新操作。首次修改时,UI上的CheckBox状态还没写入DataSet,保存的是初始值;后续操作时,前一次的状态才刚同步,所以保存的是旧值,形成滞后。
具体修复步骤
1. 强制同步单元格编辑状态到DataSet
在CurrentCellDirtyStateChanged事件中,先结束单元格编辑,确保CheckBox的状态写入DataSet后再执行保存:
private void dgvConfig_CurrentCellDirtyStateChanged(object sender, EventArgs e) { var dgv = sender as DataGridView; if (dgv != null && dgv.IsCurrentCellDirty && dgv.CurrentCell is DataGridViewCheckBoxCell) { // 提交编辑,把UI上的状态同步到DataSet dgv.CommitEdit(DataGridViewDataErrorContexts.Commit); // 执行保存操作 SaveCurrentRowChanges(dgv); } } // 抽离保存逻辑,从绑定的DataRow取最新值 private void SaveCurrentRowChanges(DataGridView dgv) { DataRowView boundRow = dgv.CurrentRow.DataBoundItem as DataRowView; if (boundRow == null) return; string col1Val = boundRow["col1"].ToString(); string col2Val = boundRow["col2"].ToString(); SqliteUpdateKvp(col1Val, col2Val); }
2. 修正DataSet初始化与绑定逻辑
检查ReadMyConfDb函数,确保DataSet是从数据库实时加载,且绑定后UI与数据上下文同步:
private DataSet ReadMyConfDb() { var ds = new DataSet(); using (var conn = new SQLiteConnection("你的SQLite连接字符串")) { conn.Open(); const string query = "SELECT col1, col2 FROM hosts"; var adapter = new SQLiteDataAdapter(query, conn); // 自动生成更新命令(如果用DataAdapter.Update的话,可选) var cmdBuilder = new SQLiteCommandBuilder(adapter); adapter.Fill(ds, "hosts"); } return ds; } // 绑定DataGridView的代码 private void BindDgv() { var ds = ReadMyConfDb(); dgvConfig.DataSource = ds.Tables["hosts"]; // 关键:确保CheckBox列的取值与数据库文本列匹配 var checkBoxCol = dgvConfig.Columns["col2"] as DataGridViewCheckBoxColumn; if (checkBoxCol != null) { // 对应数据库里col2的文本值,比如"启用"/"禁用"或"1"/"0" checkBoxCol.TrueValue = "1"; checkBoxCol.FalseValue = "0"; } dgvConfig.Refresh(); }
3. 确保SqliteUpdateKvp取到最新值
避免直接从DataGridView单元格取值,而是从绑定的DataRow获取,确保是同步后的最新数据:
private void SqliteUpdateKvp(string col1, string col2) { using (var conn = new SQLiteConnection("你的SQLite连接字符串")) { conn.Open(); const string updateSql = "UPDATE hosts SET col2 = @col2 WHERE col1 = @col1"; var cmd = new SQLiteCommand(updateSql, conn); cmd.Parameters.AddWithValue("@col1", col1); cmd.Parameters.AddWithValue("@col2", col2); cmd.ExecuteNonQuery(); } }
4. 额外排查项
- 确认DataGridView的
EditMode设置为EditOnEnter或EditOnKeystrokeOrF2,保证CheckBox点击即进入编辑状态 - 初始化时不要重复绑定DataSource,避免数据上下文混乱
内容的提问来源于stack exchange,提问作者Mark Mullen
相关产品推荐
相关产品推荐

