【问题标题】:C# SQL DataGridView change field before updating databaseC# SQL DataGridView 在更新数据库之前更改字段
【发布时间】:2017-07-06 11:05:45
【问题描述】:

我有一个带有绑定到 SQL 数据库的 DataGridView 的 WindowsForms 应用程序。除了一个(“ts_last_edit”)之外的所有列都是可编辑的。 每次有人更改其他一些列并保存更改时,我只想以编程方式使用当前 DateTime 更新“ts_last_edit”列。 我试过这个:

...
    this.MyTableAdapter.Adapter.RowUpdating += Adapter_RowUpdating;
...
private void Adapter_RowUpdating(object sender, SqlRowUpdatingEventArgs e)
{
  e.Row["ts_last_edit"]=DateTime.Now;    
}

但它不起作用,因为 e.Row 显然是一个只读属性。

我尝试更改 UPDATE SQL 命令并且它有效:

private void Adapter_RowUpdating(object sender, SqlRowUpdatingEventArgs e)
{
// pseudo code
string newSqlCommand= "STUFF CURRENT DATE AND TIME IN COLUMN ts_last_edit";
e.Command.CommandText = newSqlCommand;
}

这工作正常,但我想知道是否有更好的方法来做到这一点。 谢谢

【问题讨论】:

  • But it did not work because e.Row is a read-only property apparently. 抛出了什么确切异常?
  • 需要更新row_leave事件中的值
  • @njwills 没有抛出异常。但也没有变化。
  • @Krishna 我想在将行保存到数据库时存储 DateTime,而不是在行失去焦点时存储
  • 什么时候将它保存到数据库中?不是排假吗?你有按钮吗?如果是的话,就在那里

标签: c# sql datagridview


【解决方案1】:

您需要在更新时间后将更改合并回数据集

private void brandBookBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
  this.Validate();
  var changes = dataSet1.GetChanges();
  if(changes!=null && changes.Tables["BrandBook"].Rows.Count>0)
  {
    foreach(row in changes.Tables["BrandBook"].Rows)
    {
      row["ts_last_edit"] = DateTime.Now;
    }
  }
  dataSet1.Merge(changes, false,System.Data.MissingSchemaAction.Add);
  this.brandBookBindingSource.EndEdit();
  this.tableAdapterManager.UpdateAll(this.dataSet1);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多