2

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();
    }
}
4

0 に答える 0