【问题标题】:In a WPF datagrid, how do I get the new row after cell edit?在 WPF 数据网格中,如何在单元格编辑后获取新行?
【发布时间】:2015-06-04 09:55:15
【问题描述】:

我的DataGrid 绑定到DataTable。在网格中的每个单元格编辑后,我需要获取新的DataRow 值。只有在焦点从行而不是单元格中丢失后,我才会获得新值。

<DataGrid ItemsSource="{Binding}" CellEditEnding="grid_CellEditEnding"/>


private void grid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{  
   //Both the DataTable and the row obtained from "e" has the old row. 
}

我应该怎么做才能获得新的DataRow

【问题讨论】:

  • 这是正常的,在 CellEditEnding 中你只有正在编辑的行的信息
  • @demonplus 我确实想要编辑的行。在我使用的那个方法中,我只得到了旧的行值,而我想要新的行值。
  • 你会如何处理新的行信息?

标签: c# wpf datagrid


【解决方案1】:

正如其名称所暗示的,CellEditEnding 事件在提交编辑之前立即被触发。遗憾的是,由于没有 CellEditEnded 事件,因此没有直接的方法来做你想做的事。

这里有三个选项:

  1. 将单元格的绑定UpdateSourceTrigger 设置为PropertyChanged,以便动态应用更改而不是等待提交。
  2. 将单元格的绑定NotifyOnSourceUpdated 设置为True,然后在代码隐藏中添加Binding.AddSourceUpdatedHandler(MyDataGrid,OnDataGridSourceUpdated)(查看此处了解更多信息:http://wpf.codeplex.com/discussions/39356)。
  3. 或同时处理CellEditEndingRowEditEnding 事件。在 CellEditEnding 中,使用Dispatcher.BeginInvoke 强制调用DataGrid.CommitEdit()。在 RowEditEnding 中,再次使用BeginInvoke 来执行您的代码。它将在行编辑提交后执行,但您必须通过其索引或类似的方式手动检索行值(在此处查看类似示例(第 5 点):http://blogs.msdn.com/b/vinsibal/archive/2009/04/14/5-more-random-gotchas-with-the-wpf-datagrid.aspx) - 请记住由于您无法控制代码的执行时间,因此您的项目可能会进一步更改、重新排列或类似的事情,因此如果没有您的工作,这不是 100% 可靠的。

【讨论】:

  • 我没有单元格绑定。我已将整个网格绑定到 DataTable。我尝试使用 BeginInvoke 但无济于事。 BeginInvoke 仅在我使用 RowEditEnding 时才有效。但我需要 CellEditEnding 上的新行。
  • 问题是 CellEditEnding 上没有新行,因为尚未提交更改。未对您的 DataRow 对象应用任何更改。您可以通过调用DataGrid.CommitEdit() 方法来强制应用它们。每次编辑单元格时都会触发 RowEditEnding 事件,然后您可以使用 RowEditEnding 处理程序中的BeginInvoke 方法。
  • 更新了我的第三点以反映这个建议......有点太复杂了,但应该可以......
  • 我在 CellEditEnding 中使用了 Dispatcher.BeginInvoke 来调用虚拟方法。那没有调用 RowEditEnding 事件。我猜这就是你让我做的?
  • 在该方法上致电DataGrid.CommitEdit。这应该会触发 RowEditEnding 事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
相关资源
最近更新 更多