4

我有一个带有实体框架的简单项目,我有一个DataGridViewForm我将它的AllowUserToAddRow属性设置为,true但我仍然无法向其中添加新行。

这是我的代码:

DBEntities context = new DBEntities();
private void Form1_Load(object sender, EventArgs e)
{
    var q = (from i in context.myTable
             select i).ToList();
    DataGridView.DataSource = q;
}

private void btnSave_Click(object sender, EventArgs e)
{
    context.SaveChanges();
    MessageBox.Show("saved successfully");
}

如果我使用BindingSource控件,它允许我插入行,DataGridView但是在我在我的数据库文件中调用context.SaveChanges()nothing insert 之后使用这种方法。所以我想也许它与这个问题有关DataGridViewtrue AllowUserToAddRow属性不允许我在DataGridView.

4

4 回答 4

2

您的问题是您调用.ToList()并实现了查询 - 这似乎破坏了完整的数据绑定。

应该能够简单地拥有:

DBEntities context = new DBEntities();
private void Form1_Load(object sender, EventArgs e)
{
    var q = (from i in context.myTable
             select i);
    DataGridView.DataSource = q;
}

我试过这个,它可以很好地允许新行(你确实需要在你的表中有一个主键,但无论如何你应该有它)。


请注意:此行为已在 Entity Framework 4.1 中被故意破坏 - Webforms data binding with EF Code-First Linq query error


我说应该在我的回答中,因为我实际上有点惊讶它这么容易。我记得它在早期版本的 Entity Framework 中运行得不是很好,而且我没有经常使用 4.0。

如果上面的解决方案不起作用,您可能必须以艰难的方式执行此操作并在保存之前自己添加新对象:

首先引入一个绑定源,然后在保存时执行类似的操作(在示例中使用假想的 Customer 实体):

foreach (Customer customer in bs.List)
{         
    // In my db customerId was an identity column set as primary key
    if (customer.CustomerId == 0)
        context.Customers.AddObject(customer);
}
context.SaveChanges();
于 2012-08-03T19:32:43.417 回答
2

我刚刚痛苦地从 4 升级到 EF 6,我遇到了类似的问题,EF6 中的解决方案如下,我已经展示了 where 语句以获得进一步的帮助。

DBEntities context = new DBEntities();
private void Form1_Load(object sender, EventArgs e)
{
  context.MyTable.Where(e => e.myField == 1).Load();

  BindingSource bs = new BindingSource();
  bs.DataSource = context.MyTable.Local.ToBindingList();
  myDatagridView.DataSource = bs;
}

您现在可以使用 context.SaveChanges(); 保存更改或插入

于 2014-01-31T16:26:43.090 回答
1

我在 Interbase 方言的自定义数据库实现中遇到了类似的问题。我的解决方案类似于上面的解决方案:

var tableAList = _dbImplementation.SelectAll<TableA>().ToList();
var bindingSource = new BindingSource();
bindingSource.DataSource = typeof (TableA);
foreach (var tableA in tableAList)
{
    bindingSource.Add(tableA);
}
dataGridView.DataSource = bindingSource;

有用的参考资料:详细的数据绑定教程

于 2014-07-08T23:10:37.357 回答
0

如果要将 dataGridView 绑定到源,则插入行的唯一适当方法是将行添加到 DataGridView 绑定到的数据结构中。

于 2012-08-03T17:50:23.923 回答