You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:53:11