我有一个包含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
中插入行。
答案 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;
答案 3 :(得分:0)
如果要将dataGridView绑定到源,则插入行的唯一合适方法是向DataGridView绑定到的数据结构添加行。