bindingnavigator - 需要澄清如何将自定义更新应用到数据适配器源
问题描述
我创建了一个记录视图表单,其中包含一些通过 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;
然后在表单加载时创建构建器对象,并将更新命令初始化为字符串变量......之后不再使用,但现在填充了 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);
我希望这可以帮助别人。
推荐阅读
- python - 如何应用不区分大小写的过滤器
- python - Django Rest Framework,允许:未在通用视图中设置 POST
- r - 当在带有特殊字符的列名上调用 as.h2o 时,R 中的新版本 h2o 仍会产生额外的行
- numpy - 如何将多个 numpy 数组组合成一个用于 cython 的 memoryview?
- linux - 从 Docker 采购(“打点”)shell 脚本
- polymer - 聚合物 3“未捕获的参考错误:聚合物未定义”
- c# - 当我尝试制作自定义文本框时,密码字符不起作用
- python - Python将几个数据帧附加到一个内部函数中
- php - PHP Prepared 语句返回错误值
- laravel - 放入 laravel API