首页 > 解决方案 > 需要澄清如何将自定义更新应用到数据适配器源

问题描述

我创建了一个记录视图表单,其中包含一些通过 BindingSource 和 BindingNavigator 绑定的元素。数据字段的查看操作正常。请注意,变量 da 和 ds 在这种形式下是全局的。

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);
  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));
}

我使用行标题鼠标 dbl-click 事件从项目的数据网格视图中显示此记录视图表单。来自 dgv 的请求行被正确选择,其行数据正确显示在记录视图表单中。

private void dgvItems_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) {
  frmItem gfrmItem = new frmItem();
  string sID = this.dgvItems.CurrentRow.Cells[0].Value.ToString();
  gfrmItem.FilterByID(sID);
  gfrmItem.Show();
}

我在导航器中添加了一个保存按钮,以便我可以保存单个记录。我正在尝试做的是在通过按钮单击保存记录之前以编程方式应用日期/时间戳更新。

private void btnSave_Click(object sender, EventArgs e)
{
  this.txtUpdatedwhen.Text = DateTime.Now.ToString();
  da.Update(ds); 
}

尽管日期/时间值根据代码更改并显示在表单中,但更新并未应用日期/时间更改。

我认为文本框值已绑定到基础数据集,并且会接受更改,就像我手动输入它一样......但这并没有发生。我读过其他一些帖子,使用数据适配器更新是解决此问题的正确方法,而不是执行直接 sql 更新之类的操作。

我很困惑如何解决这个问题。任何指针将不胜感激。

标签: bindingnavigator

解决方案


搁置了一会儿,今天又回到了它,我找到了一个解决方案。

我在其他帖子中看到了一个常见的工作误解。
那就是数据适配器不会自动填充其命令,即使您将活动连接传递到创建步骤也是如此。

所以我的解决方案是创建一个全局 SqlCommandBuilder 变量以及我正在使用的其他变量

SqlDataAdapter da;
SqlConnection sc;
SqlCommandBuilder sb;
DataSet ds;

然后在表单加载时创建构建器对象,并将更新命令初始化为字符串变量......之后不再使用,但现在填充了 dataadapter 命令。

string scon = System.Configuration.ConfigurationManager.ConnectionStrings["networkadmin"].ToString();
sc = new SqlConnection(scon);
sc.Open();
string sSelect = "Select * From datatable where id > 0 Order By fld1;";
}
this.da = new SqlDataAdapter(sSelect, sc);

sb = new SqlCommandBuilder(da);

// This initiates the commands, though the target var is not used again.
string uCmd = sb.GetUpdateCommand().ToString();

this.ds = new DataSet();
this.da.Fill(this.ds);

然后更新步骤按预期工作:

this.txtUpdatedwhen.Text = DateTime.Now.ToString();
DataRowView current = (DataRowView)bindingSource1.Current;
current["updatedwhen"] = this.txtUpdatedwhen.Text;            
bindingSource1.EndEdit();
this.da.Update(ds);        

我希望这可以帮助别人。


推荐阅读