我正在使用.NET 4.0,我从这样的列表中获取数据库的结果:
List<Customers> customers = context.Customers().ToList();
然后我将其分配给BindingSource
:
bindingSource1.DataSource = null;
bindingSource1.DataSource = customers;
bindingSource
用作网格视图的数据源,可以执行更改 - 添加新记录,编辑,删除。
问题是当我想取消更改并将gridview中的数据恢复为数据库中的数据时。
我有以下代码取消更改:
private void cancelChanges()
{
// Refresh the modified entries
var objectsModified = context.ObjectStateManager.GetObjectStateEntries(
System.Data.EntityState.Modified | System.Data.EntityState.Deleted)
.Select(e => e.Entity);
context.RefreshFromDb(objectsModified);
// Detach the added entries
var objectsAdded = context.ObjectStateManager.GetObjectStateEntries(
System.Data.EntityState.Added)
.Select(e => e.Entity);
foreach (var item in objectsAdded)
{
context.Customers().Detach(item as Customers);
}
}
我可以看到它有效,但问题是List仍然保留旧记录(应该被取消),因此也是绑定源,最后它们仍然显示在网格中。
答案 0 :(得分:1)
由于您从上下文写入列表,因此您只能获得单向数据绑定。要做你想做的事,尝试这样的事情:
context.Customers().Load();
bindingSource1.DataSource = context.Customers.Local.ToBindingList();
dataGridView1.DataSource = gridSource;
问题是您告诉数据库放弃更改,但由于您的列表在此时与控件绑定并且从数据库中分离,因此您无法看到反映的更改。或者,您可以在调用CancelChanges以从数据库重新加载当前数据后再次调用customers = context.Customers().ToList()
。