下午好,
我目前正尝试首先在winforms应用程序中使用/Code。我的类PrintQueueItem映射到数据库中的一个视图,该视图只返回PrintQueueItem,该视图的PrintStatus值等于“PrintStatus”。这是通过一个DataGridView向最终用户显示的,这样他们就可以在一天结束时查看要批量打印的内容。用户可以添加PrintQueueItem的实例,这也显示在DataGridView中。
当我试图取消设置为打印的项目时,我的问题就出现了。我将PrintStatus设置为取消,然后运行ExecuteSqlCommand来更新数据库。在此之后,我尝试重新加载信息,但是项目仍然显示在DataGridView中。我不知道为什么这是因为当我获得计数(通过本地)后,信息再次加载,它已经减少了一个。你知道为什么会像我想的那样,BindingList为数据绑定提供双向同步,用户界面会随着数据的变化而更新吗?
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;PrintStatus在PrintQueueItem和Reload上的更新
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,而且我无法实现BindingList.Filter方法来过滤显示在DataGridView中的数据。有关这方面的任何建议也是值得欢迎的。
谢谢你的帮助。
发布于 2012-12-20 02:33:12
喝了几杯啤酒,又过了一段时间,让我头脑中混乱的逻辑从今天早些时候起就消失了;我开始思考到底发生了什么,然后我突然想到,当我试图把SaveChanges称为并发异常时,它正在发生。
我没有注意引发的异常类型,因此没有正确地处理它。此后,我将代码更新为以下内容:当发生DbUpdateConcurrencyException (预期的,因为视图不再包含记录)时,将从数据库中刷新遇到此问题的实体:
try
{
if (Program.YesNoQuestion(string.Format("Cancel print job for the selected document?", printQueueGridView.SelectedRows.Count)) != System.Windows.Forms.DialogResult.Yes)
{
return;
}
PrintQueueItem item = printQueueBinding.Current as PrintQueueItem;
if (item == null)
{
throw new ArgumentNullException("Could not obtain an instance of 'PrintQueueItem'");
}
item.PrintStatus = "Cancelled";
this.db.Database.ExecuteSqlCommand("exec usp_PrintQueue_Update {0}, {1}", item.PrintQueueID,
item.PrintStatus);
//this.db.PrintQueue.Load();
this.db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
foreach (DbEntityEntry entry in ex.Entries)
{
entry.Reload();
}
}请让我知道是否有更好的方法去做这件事,因为我总是对其他想法开放,并且总是对以正确的方式做事感兴趣。祝你有一个美好的夜晚!
https://stackoverflow.com/questions/13961126
复制相似问题