C# VS中AddbookingRow重载错误及DataGridView刷新不显示新记录求助
解决方法
核心思路:放弃手动添加行,改用DataAdapter重新从数据库加载数据
手动循环添加行容易因自增主键、字段匹配问题出错,直接用DataAdapter填充DataSet是最可靠的同步方式,能自动处理自增主键映射,避免ID负数和重载错误。
具体实现步骤
- 配置DataSet的自增主键(关键)
在DataSet的booking表设计器中,将bookId字段的:
AutoIncrement设为trueAutoIncrementSeed设为-1AutoIncrementStep设为-1
这样DataSet会用临时负数ID标记新行,提交到数据库后会自动替换为真实的自增ID,避免冲突。
- 重构刷新逻辑
替换你手动清空、循环添加的代码,改用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();
- 更新记录后的处理流程
当你在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
相关产品推荐
相关产品推荐

