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

标签 linq wpfdatagrid

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

但是,当更改 CustomerID 时,它会从我处理的数据库中收到错误,但是 我现在如何 (1) 回滚 Datagrid 控件或 (2) 从数据库 View 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;
}

回答:

谢谢丹尼斯,我用你的建议来得到我所追求的:
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;
    }
}

最佳答案

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

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

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

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

Here's一篇关于 DataGrid 的文章以及您使用它的一些选项。它有点旧,但它可能会给你更多的指示。 Here是另一个更短的。

顺便看看WPF toolkit同样,他们刚刚发布了一个新版本(2009 年 3 月版本),它可能对版本/验证的支持比它使用的更多。

关于linq - 如何使用 LINQ-to-SQL 回滚对 WPF DataGrid 控件的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/676783/

相关文章:

c# - Linq 分组依据并与多个表求和

wpf - 我可以只编辑一行 WPF DataGrid 吗?

c# - RowEditEnding 事件获取空值

wpfdatagrid - 如何为 WPF DATAGRID 滚动条应用样式

.net - 使用 LINQ 计算文本字段中的单词出现次数

c# - 需要帮助编写 LINQ 语句

c# - MvvmLight EventToCommand 和 WPFToolkit DataGrid 双击

上下滚动时,带有 AlternatingRowBackground 的 WPF Datagrid 滚动方式不同

c# - 基于列以编程方式在共享点中创建 TreeView

c# - LINQ 包含追加 % 和转义 %