DataGridView的AllowUserToAddRow属性不起作用(DataGridView

2019-06-26 17:47发布

我有一个实体框架一个简单的项目,我有一个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()没有插入我的数据库文件。 所以我想也许它相对于这个问题DataGridViewtrue AllowUserToAddRow属性不会让我去插入行DataGridView

Answer 1:

你的问题是,你调用.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();


Answer 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(); 保存更改或插入



Answer 3:

我曾与一个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;

有用的参考: 一个详细数据绑定教程



Answer 4:

如果你要在DataGridView绑定到一个源,然后插入行的唯一恰当的方式是行添加到您的DataGridView是绑定到数据结构。



文章来源: DataGridView AllowUserToAddRow property doesn't work