我能够设置 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/