DataGridView AllowUserToAddRow属性不起作用

时间:2012-08-03 16:26:21

标签: c# linq entity-framework datagridview bindingsource

我有一个包含Entity Framework的简单项目,我的DataGridView中有一个Form,我将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()后,在我的数据库文件中没有插入任何内容。所以我认为可能与DataGridView true AllowUserToAddRow属性相关的问题可能不允许我在DataGridView中插入行。

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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();保存更改或插入

答案 2 :(得分: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;

有用的参考:A Detailed Data Binding Tutorial

答案 3 :(得分:0)

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