web-dev-qa-db-ja.com

WPF DataGridを更新する方法は?

いくつかのデータを含むWPF DataGridがあります。別のウィンドウから行を追加できます。 DataContextは同じ、LINQ-to-SQLオブジェクトです。バインドも同じです。「ItemsSource」プロパティをテーブルにバインドします。

他のウィンドウで、ユーザーが「保存」をクリックすると、プログラムで行を作成し、「InsertOnSubmit」を使用して行を追加します。その後、DataContextの「SubmitChanges」メソッドを使用します。

私の問題は、DataGridが更新されないことです。アプリケーションを再起動すると、新しい行がデータベースに表示されますが、DataGridを更新する方法が見つかりませんでした。

これまで、DataGridのBindingExpressionで「UpdateTarget」を使用しようとしましたが、役に立ちませんでした。 「dataGrid.Items.Refresh()」も試しました—同じ結果です。どうすれば修正できますか?

26
KovBal

更新されない理由は、LINQ-to-SQLがINotifyCollectionChangedを実装していないため、WPFにItemsSourceが更新されたことを通知する方法がないためです。これを修正する最も恐ろしい方法は、LINQ-to-SQLの結果をObservableCollectionにコピーすることです。Insertを実行すると、observableコレクションにも追加されます。その後、更新が表示されます。

21
Ana Betts

ここからdatagrid.Items.Refresh()を試してください http://programmer.wrighton.org/2009/01/wpf-datagrid-items-refresh.html

66
nullpointer

同じ問題にぶつかり、ObservableCollectionの最適な場所はDataContextであることがわかりました。コレクションを更新するために使用できるデザイナーによって生成されたいくつかの部分的なメソッドがあります。このコードはかなりうまく機能します:

partial class DataClassesDataContext
{
    private ObservableCollection<Task> taskCollection;
    public ReadOnlyObservableCollection<Task> TaskView { get; private set; }

    partial void OnCreated()
    {
        taskCollection = new ObservableCollection<Task>(Tasks);
        TaskView = new ReadOnlyObservableCollection<Task>(taskCollection);
    }

    partial void InsertTask(Task instance)
    {
        taskCollection.Add(instance);
        this.ExecuteDynamicInsert(instance);
    }

    partial void DeleteTask(Task instance)
    {
        taskCollection.Remove(instance);
        this.ExecuteDynamicDelete(instance);
    }
}
4
Dark Daskin

問題は、LINQ-to-SQL DataContextを更新する必要があることです。送信が変更された後でも、DataContextは新しい行を正しく認識しません。所有しているDataContextを破棄し、新しいDataContextを作成する必要があります。ほとんどの場合、DataContextは1つの短い操作に使用し、長期にわたるオブジェクトとしては使用しないでください。

2
Stephan

別のウィンドウでグリッドを再ロードする必要がある場合は、単にそのウィンドウを閉じて再度呼び出すことができます。

1
user504737

または、単に検索コード(通常は検索ボタン)を再度呼び出します>私の場合、このように解決しました。

0
Branimir

何らかの理由でItems.Refresh()が機能していません。動作したのは、基になるコレクションにObservableCollectionを継承させてから、そのAddメソッドを呼び出すことでした。

((ContactUIObjects)dgrdContacts.ItemsSource).Add(new ContactUIObject(o));

ContactUIObjectsは、コレクションの基になるグリッドです。

0
Orson