检测在DataGrid中编辑行的时间

时间:2011-12-22 17:46:05

标签: wpf datagrid wpfdatagrid

我一直试图谷歌这个,但一直无法找到适合我的解决方案。

我有一个DataGrid,它显示客户端不知道的SQL表中的一些信息。 客户端只是向服务器发送请求并获得List< SomeClass>作为响应然后它显示在DataGrid中。

我需要检测用户何时更改行,并且我需要用户输入的新值。 目前我正在使用RowEditEnding事件。然后处理此事件的方法可以:

private void editRowEventHandler(object sender, DataGridRowEditEndingEventArgs e)
{
    SomeClass sClass = e.Row.DataContext as SomeClass;
    // Send sClass to the server to be saved in the database...
}

这给了我正在编辑的行。但是它在变化之前给了我一行,而且我无法弄清楚如何在变化发生后获得该行。

这里是否有人知道我该怎么做或者能指出我可以找到的方向?

2 个答案:

答案 0 :(得分:4)

请参阅讨论here,以避免逐个单元格地读出。

private void OnRowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
    DataGrid dataGrid = sender as DataGrid;
    if (e.EditAction == DataGridEditAction.Commit) {
        ListCollectionView view = CollectionViewSource.GetDefaultView(dataGrid.ItemsSource) as ListCollectionView;
        if (view.IsAddingNew || view.IsEditingItem) {
            this.Dispatcher.BeginInvoke(new DispatcherOperationCallback(param => 
            { 
                // This callback will be called after the CollectionView
                // has pushed the changes back to the DataGrid.ItemSource.

                // Write code here to save the data to the database.
                return null; 
            }), DispatcherPriority.Background, new object[] { null });
        }
    }
}

答案 1 :(得分:1)

在您的情况下,您正在尝试检测对象的更改。它归结为SomeClass的属性,因此你需要关注“Cell”而不是“Row”

假设你的datagrid是resultGrid,我想出了下面的代码:

resultGrid.CellEditEnding += resultGrid_CellEditEnding;
void resultGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            var yourClassInstance = e.EditingElement.DataContext;
            var editingTextBox = e.EditingElement as TextBox;
            var newValue = editingTextBox.Text;
        }

“e”还包含有关Cell的Row和Column的信息。因此,您将知道单元格正在使用哪个编辑器。在这种情况下,我假设它是一个文本框。 希望它有所帮助。