1

给定一个具有如下 BindingSource 集的 DataGridView:

在 winform 上,我们使用设计器添加一个名为 myBindingSource 的 BindingSource 对象。然后在 Form.Designer.cs 上我们将它添加到 InitializeComponents()

myBindingSource.DataSource = typeof(MyLinq.Person); //Mylinq is the autogenerated Linq Model/Diagram

稍后,在表单本身中,我们执行以下操作:

myDataView.DataSource = myBindingSource;

然后我们有一个填充网格的方法……</p>

using ( myDataContext mdc = new MyDataContext() )
{
    myDataView.DataSource = from per in mdc.person
                            select per;
}

顺便说一句,我已经在 Design Time 中设置了列,一切正常。由于 LINQ 2 SQL 没有返回 Anonymous,“myDataView”是可编辑的,问题来了……</p>

问题是:我如何坚持这些变化?

数据网格中有几十个事件,我不确定哪个更合适。即使我尝试其中一个事件,我仍然不知道我需要执行什么代码才能将这些更改发送回数据库以保持更改。

我记得在 ADO.NET DataSet 时代,你会做 dataadapter.Update(dataset);

还可以想象,retrieve 和 persist() 都在业务层上,方法签名如下所示:

public void LoadMyDataGrid(DataGridView grid);

该方法采用表单的网格并使用上面显示的 LINQ2SQL 查询填充它。

现在我想创建一个这样的方法:

public void SaveMyDataGrid(DataGridView grid); // or similar

这个想法是这个方法不在同一个类(表单)上,许多例子倾向于假设一切都在一起。

4

2 回答 2

3

RowValidated 事件将是检查是否该将更改持久化到数据库的好地方。

    this.dataGridView1.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowValidated);

    private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
    {
        MyLinq.Person person = dataGridView1.Rows[e.RowIndex].DataBoundItem as MyLinq.Person;

        if (person != null)
        {
            // save this person back to data access layer
        }
    }

编辑后:

我不会将数据网格实例传回您的服务层。我会传回IEnumerable<MyLinq.Person>IList<MyLinq.Person>迭代您的服务层中的集合,具体取决于执行的逻辑;将更改持久保存到数据访问层(您的数据库)

于 2009-10-26T16:46:03.847 回答
1

DataContext 对象上的“保存”方法是SubmitChanges().

using (MyContext c = new MyContext())
{
     var q = (from p in c.People
             where p.Id == 1
             select p).First();
     q.FirstName = "Mark";
     c.SubmitChanges();
}

正如 Michael G 所提到的,您需要收集更改,并将它们传递回 bll 对象。

于 2009-10-26T18:17:14.067 回答