こんにちは、
私は現在、winformsアプリケーション内でEntity Framework DbContext /CodeFirstを操作しようとしています。私のクラスPrintQueueItemは、 「Pending」に等しいPrintStatusを持つPrintQueueItemのみを返すデータベース内のビューにマップされます。これは、DataGridViewを介してエンドユーザーに表示されるため、エンドユーザーは1日の終わりにバッチ印刷される内容を表示できます。ユーザーはPrintQueueItemのインスタンスを追加でき、これはDataGridView内にも表示されます。
印刷するように設定されているアイテムをキャンセルしようとすると、問題が発生します。PrintStatusをCanceledに設定してから、ExecuteSqlCommandを実行してデータベースを更新します。この後、情報をリロードしようとしましたが、アイテムはまだDataGridView内に表示されています。情報が再度ロードされた後、(ローカル経由で)カウントを取得したときに、これが1つ減った理由がわかりません。BindingListがデータバインディングの双方向同期を提供し、UIがデータの変更に応じて更新されると思ったので、これがなぜであるかについて何か考えはありますか?
PrintQueueItem(モデル)
public class PrintQueueItem
{
public PrintQueueItem()
{
this.PrintQueueID = Guid.NewGuid();
this.PrintStatus = "Pending";
this.DateAdded = DateTime.Now;
}
public Guid PrintQueueID { get; set; }
public Guid DocumentID { get; set; }
public string PrintStatus { get; set; }
public DateTime DateAdded { get; set; }
public virtual Documentation Document { get; set; }
}
初期バインディング
this.printQueueBinding.DataSource = db.PrintQueue.Local.ToBindingList();
this.printQueueGridView.AutoGenerateColumns = false;
this.printQueueGridView.DataSource = printQueueBinding;
PrintQueueItemのPrintStatusを更新し、リロードします
PrintQueueItem item = printQueueBinding.Current as PrintQueueItem;
if (item == null)
{
throw new ArgumentNullException("Could not obtain instance of selected 'PrintQueueItem'");
}
item.PrintStatus = "Cancelled";
this.db.Database.ExecuteSqlCommand("exec usp_PrintQueue_Update {0}, {1}",item.PrintQueueID, item.PrintStatus);
this.db.PrintQueue.Load();
いくつかの追加の注意事項
ExecuteSqlCommandを呼び出す代わりに、SaveChangesを呼び出そうとしましたが、次のような例外が発生しました。
"Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded."
これは、アイテムが更新されたときにビューにアイテムが見つからなくなったためだと思います。そうでない場合はお知らせください。
アプリケーションでフィルタリングではなくフィルタリングされたビューを使用する理由は、BindingListがIBindingListViewを実装しておらず、DataGridView内に表示されるデータをフィルタリングするためのBindingList.Filterメソッドを実装できないためです。これに関する提案も歓迎します。
ご協力ありがとうございました。