LINQ2SQLを使用したDataGridView編集後の変更のコミット(Winforms)
-
06-07-2019 - |
質問
次のように設定されたBindingSourceを持つDataGridViewを指定します。
winformでは、デザイナーを使用して、myBindingScourceと呼ばれるBindingSourceオブジェクトを追加します。 次に、Form.Designer.csで、これをInitializeComponents()
に追加しますmyBindingSource.DataSource = typeof(MyLinq.Person); //Mylinq is the autogenerated Linq Model/Diagram
後で、フォーム自体で:
myDataView.DataSource = myBindingSource;
そしてグリッドにデータを取り込むメソッドがあります<!>#8230;
using ( myDataContext mdc = new MyDataContext() )
{
myDataView.DataSource = from per in mdc.person
select per;
}
余談ですが、Design Timeで列を設定しましたが、すべて正常に表示されます。 LINQ 2 SQLは匿名を返さないため、<!> quot; myDataView <!> quot;編集可能です、そしてここに質問が来ます<!>#8230;
質問:これらの変更を保持するにはどうすればよいですか
データグリッドには多数のイベントがあり、どちらが適切かはわかりません。イベントの1つを試しても、変更を永続化するためにそれらの変更をDBに送信するために実行する必要のあるコードがまだわかりません。
ADO.NET DataSetの時代のことを思い出します。dataadapter.Update(dataset);
検索とpersist()の両方がビジネスレイヤー上にあり、メソッドシグネチャが次のようになっていることも想像してください。
public void LoadMyDataGrid(DataGridView grid);
そのメソッドはフォームのグリッドを取得し、上記のLINQ2SQLクエリを使用してそれを設定します。
次に、次のようなメソッドを作成します。
public void SaveMyDataGrid(DataGridView grid); // or similar
アイデアは、このメソッドが同じクラス(フォーム)上にないということです。多くの例では、すべてが一緒になっていると仮定する傾向があります。
解決
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>
を渡し、サービスレイヤーのコレクションを繰り返し処理します。実行されるロジックに応じて、変更をデータアクセスレイヤー(データベース)に保持します
他のヒント
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オブジェクトに戻す必要があります。