2009-10-26 152 views
1

假设有一个BindingSource的设置这样一个DataGridView:提交更改

在一个winform,我们添加使用设计,称为myBindingScource一个BindingSource的对象。 然后在Form.Designer.cs我们将其添加到InitializeComponents()

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

后来,在窗体本身我们做:

myDataView.DataSource = myBindingSource; 

,然后我们有一个填充网格的方法...

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

作为旁白,我已经设置了设计时间的列,并且一切都显示正常。 由于LINQ 2 SQL没有返回匿名的“名为myDataView”是可编辑的,而这里来的问题...

的问题是:我怎么坚持这些变化?

数据网格中有几十个事件,我不确定哪一个更合适。即使我尝试了其中一个事件,但仍然不知道我需要执行哪些代码才能将这些更改发回给数据库以便保留更改。我记得早在ADO.NET DataSet的日子里,你会做dataadapter.Update(dataset);

也可以设想,无论是恢复和坚持()是在业务层和方法签名如下所示:

public void LoadMyDataGrid(DataGridView grid); 

该方法采用以下形式的网格,并使用上面显示的LINQ2SQL查询填充它。

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

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

的想法是,这种方法并不是在同一类(形式),许多例子往往认为一切都在一起。

回答

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 
     } 
    } 

您的编辑后:

我不会的DataGrid实例,回传给你的服务层。我会传回IEnumerable<MyLinq.Person>IList<MyLinq.Person>,然后遍历服务层中的集合,并取决于所执行的逻辑;坚持对数据访问层(您的数据库)的更改

+0

我对“//保存此人”部分代码感兴趣。 我有一个来自数据库的人物,并被放置在一排。该行已被编辑。现在我想让LINQ把这些变化放回去。在NHIBERNATE等人中,每个类/对象都有“.save()”或“.persist()”方法。但我不知道如何告诉LINQ(通过阅读下面的cloggings示例),更新人物对象。 – 2009-10-27 10:31:56

+0

我在这里找到了解决方案(附件):http://geekswithblogs.net/michelotti/archive/2007/12/17/117791.aspx – 2009-10-27 10:59:04

1

DataContext对象上的'save'方法是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对象。

+0

但是,如果我有一个People对象来自Datagrid中的行,如何我可以告诉DataContext更新那个“Person”吗?我记得在其他OR映射器中,每个对象都有一个.persist()或.save()方法。 从MichaelG的代码中检索的对象是一个“Person”对象。我需要告诉LINQ,继续并更新这个人。 – 2009-10-27 10:29:48

+0

看到上面的评论,解决方案是我需要“附加”断开的对象回来,我需要我的时间戳。 – 2009-10-27 10:59:36