我有一个实体框架一个简单的项目,我有一个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
。
你的问题是,你调用.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;
}
我想这和它允许新行(你需要在你的表的主键,但是你应该有反正)工作正常。
请注意:此行为是有意打破了实体框架4.1 - Web表单数据和EF代码优先Linq查询错误结合
我说应该在我的答案,因为我其实是有点惊讶正是这种容易。 我记得不是在早期版本的实体框架的工作很多,并且我还没有使用4.0非常多。
如果上述解决方案不工作,你可能必须把这个做硬盘的方式,并在保存之前添加新对象自己:
先介绍一个绑定源并在保存这样做(与客户的例子假想实体):
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();
我刚刚从痛苦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(); 保存更改或插入
我曾与一个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;
有用的参考: 一个详细数据绑定教程
如果你要在DataGridView绑定到一个源,然后插入行的唯一恰当的方式是行添加到您的DataGridView是绑定到数据结构。