1

winforms 폼에 바인딩 소스가있는 바인딩 탐색기가 있습니다. 내 데이터 소스는 엔티티 프레임 워크 목록에서 가져옵니다.바인딩 원본에 winforms 사용, 사용자가 레코드를 수정했는지 어떻게 알 수 있습니까?

I 버튼 이벤트를 내가 추가 및 편집이 충분히 쉽게됩니다 Julie Lerman Course at Pluralsight

에서 배운 기술을 사용하여, 내 바인딩 소스의 각 개체의 물리게을 추적, 난 그냥 추가로 작성하고 삭제를 할

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 이벤트가 없습니다. 엔터티가 수정 된 경우 어떻게 추적합니까? 나는 도메인 클래스 사람의 연결이 끊긴 목록에 바인딩하고

참고

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 
} 

과 사람이 그 [업데이트] 에서 상속하는 인터페이스 BindingSource에보고를 이벤트 속성을 볼 때 CurrentItemChanged 속성을 수정할 때 발생시키는 참조하십시오. 그러나 현재 항목 자체가 변경 될 때도 발생합니다.
제기 된 이유는 무엇입니까?

+0

어떻게 당신이 결합되어

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

섹션을 읽어보십시오 : 당신은 수정되지 않은 상태에서 originalPeople을 다시 연결하고 반복적 인 방식에서의 수정 된 사람의 속성 변경 사항을 적용 할 데이터 값을 바인딩 탐색기의 컨트롤에 추가 하시겠습니까? 엔티티 프로퍼티를 컨트롤에 바인딩하는 경우 UI를 통해 값을 변경하면 자동으로 'EntityState.Modified'가 설정됩니다. 엔티티 트래커는 올바르게 바인딩하면이를 처리해야합니다. –

+0

Thanks @DavidTansey 엔티티가 연결 해제되었음을 보여주기 위해 질문을 업데이트했습니다. –

답변

0

엔티티가 연결이 끊어짐에 따라 컨텍스트에 의한 변경 내용 추적이 가능하지 않으므로 변경 사항을 직접 추적해야합니다.

검색하는 사람의 복제본을 만들기 위해 저장소 방법을 변경하면 저장 시점에서 원래의 엔티티를 다시 연결할 수 있습니다.

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

당신은 원래 사람 개체의 복제를 만드는 방법을 알아 섹션 Creating a cloned object containing current, original, or database values를 읽을 수 있습니다.

MyRepository.SavePeople은 originalPeople (복제본)과 modifiablePeople (변경 내용이 포함 된 UI에 바인딩 된 수정 된 사람)의 두 인수를 취합니다. Setting current or original values from another object

+0

감사합니다 @ user978139, 거기에 어떻게 수정 해야할지 생각해야합니다 .... 어쩌면 INotifyChangeProperty와 함께 할 수 있습니다. –

+0

INotifyPropertyChanged는 값이 UI 컨트롤에 업데이트를 알리기 위해 바인딩 상황에서 유용합니다. 저장소가 액세스 할 수있는 각 엔티티에 대해 수정 된 등록 정보의 문자열/부울 키 값 쌍 사전을 유지할 수 있습니다. 저장소에서 사전을 반복하고 수정 된 context.Entry (blog) .Property ("Name")로 속성을 설정합니다.IsModified = true; – user978139

+0

이것은 내 질문에 대답하지 않습니다. 바운드 오브젝트가 변경된 것을 어떻게 알 수 있습니까? –

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; 
      } 
     } 
    }