BindingSource を使用して NHibernate オブジェクトを DataGridView にバインドしています。オブジェクトをデータベースに強く接続する必要があります。つまり、オブジェクトに何らかの変更が加えられた場合、コミット (ユーザーが [保存] ボタンを押す) またはロールバック後に変更がデータベースに反映される必要があります。それ以外の場合はトランザクション ([キャンセル] ボタン)。しかし、いくつかの問題があります: 1. トランザクションがロールバックされた場合、オブジェクトは影響を受けません。2. オブジェクト リストの変更を監視する方法。BindingSource イベントを使用するとモデルが壊れ、リスト項目が削除された後に BindingSource 変更イベントが呼び出されるため、データベース内のオブジェクトを削除することさえできません。皆さん、そのようなモデルを実装する方法が本当にわかりません。このスコープで有効期限が切れている場合は、何かアドバイスしてください。
クラス
class AudienceFormController
{
private AudiencesForm _form;
private IList<AudienceType> _audiences;
private BindingSource _bindingSource;
private void BindTable()
{
_audiences = Controller.Manager.RetrieveAll<AudienceType>(SessionAction.Begin);
_bindingSource = new BindingSource();
_bindingSource.DataSource = _audiences;
_bindingSource.AllowNew = true;
_form.AudienceTypesDataGridView.DataSource = _bindingSource;
_form.AudienceTypesDataGridView.AllowUserToAddRows = true;
_form.AudienceTypesDataGridView.AutoGenerateColumns = true;
_form.SaveATypeButton.Click += new EventHandler(SaveATypeButton_Click);
_form.CancelATypeButton.Click += new EventHandler(CancelATypeButton_Click);
_bindingSource.ListChanged += new System.ComponentModel.ListChangedEventHandler(_bindingSource_ListChanged);
}
void _bindingSource_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
{
switch (e.ListChangedType)
{
case ListChangedType.ItemChanged:
{
Controller.Manager.Save(_bindingSource.List[e.NewIndex]);
break;
}
//case ListChangedType.ItemDeleted:
// {
// Controller.Manager.Save(_bindingSource.List[e.OldIndex]);
// break;
// }
}
}
void CancelATypeButton_Click(object sender, EventArgs e)
{
Controller.Manager.RollBack();
_bindingSource.DataSource = Controller.Manager.RetrieveAll<AudienceType>(SessionAction.Begin);
}
void SaveATypeButton_Click(object sender, EventArgs e)
{;
Controller.Manager.Commit();
}
public AudienceFormController(AudiencesForm form)
{
_form = form;
BindTable();
}
}