需要澄清如何将自定义更新应用于数据适配器源



我已经创建了一个记录视图表单,它通过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更新。

我被如何解决这个问题难住了。如能指点,不胜感激。

放了一段时间,今天又回来了,我找到了一个解决办法。

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

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

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

然后在form load时创建builder对象,并将update命令初始化为字符串变量…后面没有使用,但是现在填充了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);        

我希望这能帮助到别人。

相关内容

最新更新