2009-10-26 194 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