实体框架无法修改datagrid中的数据

时间:2013-10-10 17:58:38

标签: c# winforms entity-framework datagrid

我正在尝试学习实体框架,但我没有什么问题,我自己无法解决 我正在将数据从MS SQL数据库加载到数据网格,并尝试从那里修改/添加数据。 但我不知道如何实现这一目标。 这是我的代码:

    using (var context = new OrdersDataModelContainer())
        {
            var customersQuery = from o in context.Payments
                                 select o;
            dataGridView1.DataSource = customersQuery;
        }

当我这样做时,我得到了这个:

ScreenShot 1

当我调整代码时:

    using (var context = new OrdersDataModelContainer())
        {
            var customersQuery = from o in context.Payments
                                 select o;
            dataGridView1.DataSource = customersQuery.ToList();
        }

我的表单看起来:

enter image description here

但是我无法修改数据或添加新行。

任何人都可以通过显示一些代码段或指向我能找到解决方案的地方来帮助解决这个问题吗?

谢谢!

@Update 我使用VS 2012和SQL Server 2012(如果重要的话)

1 个答案:

答案 0 :(得分:2)

这是因为网格的基础数据源不支持修改。解决方案:

using (var context = new OrdersDataModelContainer())
{
    var customersQuery = from o in context.Payments
                         select o;
    dataGridView1.DataSource = new BindingList<Payments>(customersQuery.ToList());
}

感谢King King的评论

<强>更新 要保存更改,您需要保留实际跟踪现在在网格中显示的检索实体上的修改的上下文。因此,一种方式(也许是最简单的方法)是将上下文声明为表单成员:

public partial class Form1 : Form
{
     private MyDBContext context = new MyDBContext(); // whatever your context name is

     private void btnLoadData_Click(object sender, EventArgs e) // when you want to load the data
     {
        var customersQuery = from o in context.Payments
                             select o;
        dataGridView1.DataSource = new BindingList<Payments>(customersQuery.ToList());
     }

     private void btnSaveChanges_Click(object sender, EventArgs e) // when you want to save
     {  
       context.SaveChanges();
     }
}

请注意,不建议长时间保留context。有很多关于背景生命周期的文章。