23

我将列表绑定entities到这样的数据网格视图:

var orders = context.Order.ToList();

BindingList<Order> orderList = new BindingList<Order>(orders);

dataGridView1.DataSource = orderList;

用户可以直接在 datagridview 上编辑或添加新的。当用户单击Save按钮时,为了优化性能,我想检索已更改/新的实体列表以执行插入/更新。我怎样才能做到这一点?

编辑定义向gridview添加新行:

BindinList<Order> orders = (BindingList<Order>)dataGridView1.Datasource;

order.Add(new Order());

编辑 2解决:

BindinList<Order> orders = (BindingList<Order>)dataGridView1.Datasource;

Order order = new Order();

context.Order.Add(order);

order.Add(order);
4

1 回答 1

48
List<Object> modifiedOrAddedEntities = context.ChangeTracker.Entries()
 .Where(x => x.State == System.Data.EntityState.Modified 
        || x.State == System.Data.EntityState.Added)
 .Select(x=>x.Entity).ToList();

将 EF 实体绑定到 aDataGridView时,通常最好IBindingListDbSet.Local ObservableCollection. 通过这种方式,您可以获得两种数据绑定方式,并且您的新实体会在通过添加时自动添加到上下文中BindingSource.Add()IBindingList.Add()。一旦正确绑定,最简单的方法就是设置DataGridView.AllowUserToAddRows为 true,用户输入的新行将是添加到上下文中的新实体。

context.Orders.Load();
BindingList<Order> bindingList = context.Orders.Local.ToBindingList();
BindingSource ordersBindingSource = new BindingSource();
ordersBindingSource.DataSource = bindingList;
dataGridView1.DataSource = ordersBindingSource ;

System.Data.Entity必须引用才能使用.ToBindingList(),并且您必须使用 EF4.1 或更高版本。

于 2013-07-04T06:43:57.920 回答