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" と思います)。

次に、データベースからオブジェクトを更新する必要がある場合は、datacontext で Refresh() を呼び出して、オブジェクトをパラメーターとして渡す必要があります。これにより、データベースから現在の値が引き戻されます。

第 3 に、オブジェクト全体の編集とロールバックを処理するために、DataGrid は IEditableObject インターフェイスをサポートします。これにより、オブジェクトはトランザクションのようなローカル メソッドを公開できます (基本的に、BeginEdit が呼び出されるたびにデータの内部コピーを作成し、必要に応じて変更を元に戻すことができます)。 )。これはすべて手動のプロセスですが、私が間違っていなければ、これは Windows フォームに長い間存在していたインターフェイスであり、それに関する多くの情報を見つけることができるはずです (または、ここで私よりも詳しい人が提供できるはずです)。あなたはいくつかの例)。

そのインターフェイスをオブジェクトに実装できます (オブジェクトはおそらくデザイナーによって生成された LinqToSQL クラスであるため、部分クラスを介して)。

これは、DataGrid とそれに関するいくつかのオプションに関する記事です。少し古いですが、参考になるかもしれません。これは別の短いものです。

ところで、WPF ツールキットをもう一度確認してください。彼らは新しいバージョン (2009 年 3 月バージョン) をリリースしたばかりで、以前よりも多くの編集/検証をサポートしている可能性があります。

于 2009-03-24T11:54:00.307 に答える