5

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

回答:

谢谢丹尼斯,我用你的建议来得到我所追求的:

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;
    }
}
4

1 回答 1

3

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

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

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

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

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

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

于 2009-03-24T11:54:00.307 回答