C# WinForm中SqlDataAdapter应用自定义更新时绑定值修改不生效如何解决
问题根因
你的代码存在两个核心问题导致修改无法写入数据库:
- 代码直接修改
TextBox的Text属性时,WinForm数据绑定默认仅在控件失去焦点时才会将值同步回底层DataSet,你修改后立即调用da.Update,此时DataSet中的对应字段还没有收到更新后的值。 - 你仅为
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
相关产品推荐
相关产品推荐

