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

C# VS中AddbookingRow重载错误及DataGridView刷新不显示新记录求助

解决方法

核心思路:放弃手动添加行,改用DataAdapter重新从数据库加载数据

手动循环添加行容易因自增主键、字段匹配问题出错,直接用DataAdapter填充DataSet是最可靠的同步方式,能自动处理自增主键映射,避免ID负数和重载错误。

具体实现步骤

  1. 配置DataSet的自增主键(关键)
    在DataSet的booking表设计器中,将bookId字段的:
  • AutoIncrement设为true
  • AutoIncrementSeed设为-1
  • AutoIncrementStep设为-1
    这样DataSet会用临时负数ID标记新行,提交到数据库后会自动替换为真实的自增ID,避免冲突。
  1. 重构刷新逻辑
    替换你手动清空、循环添加的代码,改用DataAdapter从数据库重新查询并填充:
// 断开绑定避免界面闪烁
bookingBindingSource.DataSource = null;

// 清空DataSet中的旧数据
tclDataSet3.booking.Clear();

// 使用DataAdapter查询最新的approvalStatus=1的记录并填充DataSet
using (var adapter = new SqlDataAdapter("SELECT * FROM bookings WHERE approvalStatus = 1", tcdb.Connection))
{
    var builder = new SqlCommandBuilder(adapter);
    adapter.Fill(tclDataSet3.booking);
}

// 重新绑定数据源
bookingBindingSource.DataSource = tclDataSet3.booking;
dataGridView1.ClearSelection();
  1. 更新记录后的处理流程
    当你在DataGridView中将approvalStatus改为2后:
  • 先通过DataAdapter将更新提交到数据库:
    using (var adapter = new SqlDataAdapter("SELECT * FROM bookings", tcdb.Connection))
    {
        var builder = new SqlCommandBuilder(adapter);
        adapter.Update(tclDataSet3.booking);
        // 提交后DataSet会自动同步数据库的状态
        tclDataSet3.booking.AcceptChanges();
    }
    
  • 调用bookingBindingSource.RemoveCurrent()移除当前行
  • 再执行上面的刷新逻辑,重新加载数据库中所有approvalStatus=1的记录,就能看到新创建的条目了

原有方法失效原因

你手动循环添加行时,未正确处理DataSet的自增主键生成规则,导致ID冲突;同时手动添加的行未与数据库状态正确同步,刷新时仅操作了本地DataSet的旧数据,未真正从数据库拉取新记录。

内容的提问来源于stack exchange,提问作者Lorne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:25:24