我能够设置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)
首先,是否需要能够更改 CustomerID?如果这会产生错误,我想情况并非如此,所以您应该将该列标记为 ReadOnly (IsReadonly =“True”我相信)。
其次,如果需要从数据库刷新对象,则需要在数据上下文上调用 Refresh(),并将对象作为参数传递。这将从数据库中拉回当前值。
第三,为了处理整个对象的编辑和回滚,DataGrid 支持 IEditableObject 接口,该接口允许对象公开本地类似事务的方法(基本上,每当调用 BeginEdit 时,它都会生成数据的内部副本,并且可以在需要时恢复更改) )。这都是一个手动过程,但如果我没记错的话,它是 Windows 窗体中已经存在很长时间的界面,您应该能够找到大量有关它的信息(或者这里比我更精通的人可以提供你举一些例子)。
您可以在对象上实现该接口(通过部分类,因为您的对象是 LinqToSQL 类,大概是由设计器生成的)。
这是一篇有关 DataGrid 及其一些选项的文章。它有点旧,但它可能会给你一些更多的指导。这是另一个较短的。
顺便说一下,再次查看WPF 工具包,他们刚刚发布了一个新版本(2009 年 3 月版本),该版本可能比以前提供了更多对版本/验证的支持。
| 归档时间: |
|
| 查看次数: |
3351 次 |
| 最近记录: |