如何使用LINQ-to-SQL回滚对WPF DataGrid控件的更改?

Edw*_*uay 5 linq wpfdatagrid

我能够设置WPF Datagrid,通过linq-to-sql显示Northwind数据库表,并处理TheDataGrid_RowEditEnding事件,以便保存回数据库.

但是,当CustomerID被更改时,它会从我处理的数据库中获取错误,但我现在如何(1)回滚Datagrid控件或(2)从数据库视图LINQ-to-SQL重新获取原始数据(通过LINQ我在下面做的反馈似乎有某种缓存,它不刷新):

<Grid DockPanel.Dock="Bottom">
    <toolkit:DataGrid x:Name="TheDataGrid" 
                      AutoGenerateColumns="True"
                      RowEditEnding="TheDataGrid_RowEditEnding"/>
</Grid>



private void TheDataGrid_RowEditEnding(object sender, Microsoft.Windows.Controls.DataGridRowEditEndingEventArgs e)
{
    try
    {
        _db.SubmitChanges();
    }
    catch (Exception ex)
    {
        RefreshData();
        Message.Text = ex.Message;
    }
}

public void RefreshData()
{
    var customers = from c in _db.Customers
                    select c;
    TheDataGrid.ItemsSource = customers;
}
Run Code Online (Sandbox Code Playgroud)

回答:

谢谢Denis,我用你的建议得到了我的意思:

private void TheDataGrid_RowEditEnding(object sender, Microsoft.Windows.Controls.DataGridRowEditEndingEventArgs e)
{
    try
    {
        _db.SubmitChanges();
    }
    catch (Exception ex)
    {
        Customer customer = e.Row.Item as Customer;
        _db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, customer);
        Message.Text = ex.Message;
    }
}
Run Code Online (Sandbox Code Playgroud)

Den*_*ler 3

首先,是否需要能够更改 CustomerID?如果这会产生错误,我想情况并非如此,所以您应该将该列标记为 ReadOnly (IsReadonly =“True”我相信)。

其次,如果需要从数据库刷新对象,则需要在数据上下文上调用 Refresh(),并将对象作为参数传递。这将从数据库中拉回当前值。

第三,为了处理整个对象的编辑和回滚,DataGrid 支持 IEditableObject 接口,该接口允许对象公开本地类似事务的方法(基本上,每当调用 BeginEdit 时,它都会生成数据的内部副本,并且可以在需要时恢复更改) )。这都是一个手动过程,但如果我没记错的话,它是 Windows 窗体中已经存在很长时间的界面,您应该能够找到大量有关它的信息(或者这里比我更精通的人可以提供你举一些例子)。

您可以在对象上实现该接口(通过部分类,因为您的对象是 LinqToSQL 类,大概是由设计器生成的)。

这是一篇有关 DataGrid 及其一些选项的文章。它有点旧,但它可能会给你一些更多的指导。是另一个较短的。

顺便说一下,再次查看WPF 工具包,他们刚刚发布了一个新版本(2009 年 3 月版本),该版本可能比以前提供了更多对版本/验证的支持。