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

C# WinForm中SqlDataAdapter应用自定义更新时绑定值修改不生效如何解决

问题根因

你的代码存在两个核心问题导致修改无法写入数据库:

  1. 代码直接修改TextBox的Text属性时,WinForm数据绑定默认仅在控件失去焦点时才会将值同步回底层DataSet,你修改后立即调用da.Update,此时DataSet中的对应字段还没有收到更新后的值。
  2. 你仅为SqlDataAdapter配置了查询语句,没有生成对应的更新命令,Update方法无法执行数据库写入操作。

解决步骤

步骤1:为SqlDataAdapter自动生成更新命令

在frmItem_Load方法中初始化SqlDataAdapter后,添加SqlCommandBuilder自动生成增删改命令,要求你的myitems表必须以id作为主键:

private void frmItem_Load(object sender, EventArgs e) {    
  string scon = System.Configuration.ConfigurationManager.ConnectionStrings["myitems"].ToString();
  da = new SqlDataAdapter("Select * From myitems where id > 0 ", scon);
  // 新增以下行,自动生成更新所需的命令
  SqlCommandBuilder cb = new SqlCommandBuilder(da);
  ds = new DataSet();
  da.Fill(ds);
  bindingSource1.DataSource = ds.Tables[0];            
  bindingNavigator1.BindingSource = this.bindingSource1;
  this.txtId.DataBindings.Add(new Binding("Text", bindingSource1, "id", true));
  this.txtItem.DataBindings.Add(new Binding("Text", bindingSource1, "item", true));
  this.txtUpdatedwhen.DataBindings.Add(new Binding("Text", bindingSource1, "updatedwhen", true));
}

步骤2:修改保存逻辑,强制将控件值同步回数据源

修改btnSave_Click方法,设置时间后手动触发绑定值回写:

private void btnSave_Click(object sender, EventArgs e)
{
  this.txtUpdatedwhen.Text = DateTime.Now.ToString();
  // 新增以下行,强制将文本框的最新值写入绑定的DataSet
  this.txtUpdatedwhen.DataBindings["Text"].WriteValue();
  da.Update(ds); 
}

补充说明

如果不希望手动调用WriteValue,也可以在创建绑定时将数据源更新模式改为值变化立即同步:

this.txtUpdatedwhen.DataBindings.Add(new Binding("Text", bindingSource1, "updatedwhen", true, DataSourceUpdateMode.OnPropertyChanged));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:15:02