是否可以为新行设置 DataGridRow 单元格的值?

Zac*_*ber 2 c# wpf xaml entity-framework datagridview

我对 WPF 和 XAML 非常陌生,所以我可能会以错误的方式处理这个问题。

我有一个使用实体框架绑定到数据源的 DataGrid。

当我向 DataGrid 添加新行时,我希望名为“Created”的列之一自动填充当前日期和时间。

数据最终存储在 SQL Server 上。

SQL Server 上的“Created”列不可为空,但具有默认值“getdate()”。它与我们当前的 MS Access 应用程序配合得很好。运行手动插入查询时,只需省略“已创建”列的值即可触发默认值。

新行使用默认值“1/1/0001 12:00:00 AM”而不是当前日期和时间,尽管 SQL Server 的默认值为“getdate()”。

我试过了:

  • 更改模型以使该列的默认值不是“(无)”而是“DateTime.Now”,我也尝试了“Now”。两者都不起作用。
  • 更改模型以使该列的可为空属性为 true。
  • 我尝试了 DataGridView 的“AddingNewItem”事件,但无法让它工作。
  • 我尝试了 DataGridView 的“RowEditEnding”事件,但也不知道如何让它工作。
  • 我尝试从 DataGridView 中完全删除有问题的列,但是当在 dbContext 对象上调用 SaveChanges() 时,它会抛出一个异常,指出 datetime2 到 datetime 的转换导致了超出范围的异常或类似的情况。确切的错误是(第一个异常是“UpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常。”):错误

我不知道该怎么做。我知道“视图”只应该负责呈现数据,但我不确定如何更改模型,以便该特定表的新行不发送“已创建”列的值或者在添加新行时始终传递当前日期和时间。

我花了几个小时查看 WPF 文档、实体框架文档、Stack Overflow、MSDN 文档...我快要抓狂了!任何帮助将不胜感激!

Dre*_*Jex 5

我很确定 DataGrid.AddingNewItem 事件就是您想要的事件。尝试这样的事情:

<DataGrid ItemsSource="{Binding Collection}" 
          CanUserAddRows="True"
          AddingNewItem="DataGrid_AddingNewItem">
Run Code Online (Sandbox Code Playgroud)

然后在你的代码隐藏中:

private void DataGrid_AddingNewItem(object sender, AddingNewItemEventArgs e)
{
    e.NewItem = new Model
    {
        Created = DateTime.Now //whatever you put here will be the default value
    };
}
Run Code Online (Sandbox Code Playgroud)