1

winformsフォームにバインディングソースを持つバインディングナビゲーターがあります。私のデータソースは、エンティティ フレームワーク リストから取得されます。

Pluralsightの Julie Lerman コースで学んだ手法を使用して、バインディング ソース内の各エンティティの状態を追跡したいと考えています。

追加と編集は簡単です。追加ボタンと削除ボタンのイベントを入力するだけです。

    private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
    {
        ((IEntity)(this.personBindingSource.Current)).State = EntityState.Added;
    }

    private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
    {
        ((IEntity)(this.personBindingSource.Current)).State = EntityState.Deleted;
    }

ただし、EditItemClick イベントはありません。エンティティが変更されたかどうかを追跡するにはどうすればよいですか?

ドメインクラス Person の非接続リストにバインドしていることに注意してください

 List<Person> people = MyRepository.GetPeople();
 this.personBindingSource.DataSource =people;
 this.personBindingNavigator.BindingSource = this.personBindingSource;

インターフェイス IENtity があります

public interface IEntity
{

    EntityState State { get; set; }
}



public enum EntityState
{
    Unchanged,
    Added,
    Modified,
    Deleted
}

Person はその [Update] から継承し、bindingSource イベント プロパティを見ると、プロパティが変更されると CurrentItemChanged が発生することがわかります。ただし、現在のアイテム自体が変更された場合にも発生します。
それがどの理由で提起されたかを解決する方法はありますか?

4

2 に答える 2

0
private void bindingSource_ListChanged(object sender, ListChangedEventArgs e)
    {
        if (e.ListChangedType == ListChangedType.ItemChanged)
        {
            var entity = (IEntity)((BindingSource)sender).Current;
            if (entity.State == EntityState.Unchanged)
            {
                entity.State = EntityState.Modified;
            }
        }
    }
于 2014-07-07T00:01:04.073 に答える
0

エンティティが切断されているため、コンテキストによる変更追跡は利用できないため、自分で変更を追跡する必要があります。

取得する人のクローンを作成するようにリポジトリ メソッドを変更すると、保存時に元のエンティティを再接続できます。

List<Person> originalPeople;
List<Person> modifiablePeople = MyRepository.GetPeople(out originalPeople);

現在の値、元の値、またはデータベースの値を含む複製オブジェクトの作成のセクションを読ん で、元の人物オブジェクトの複製を作成する方法を確認できます。

MyRepository.SavePeople は、originalPeople (クローン) と modifiablePeople (変更を含む UI にバインドされた変更された人物) の 2 つの引数を取ります。次に、変更されていない状態で originalPeople を再アタッチし、変更された人物からプロパティの変更を繰り返し適用します。

var entry = context.Entry(original Person); 
entry.CurrentValues.SetValues(modifiedPerson);

セクションを読む: 別のオブジェクトから現在の値または元の値を設定する

于 2014-07-06T08:02:08.257 に答える