2013-10-11 3 views
1

DataGridView에서 데이터 수정을 처리하는 데 약간의 문제가 있습니다. 난 그냥이 같은 DataGridView에에 데이터 소스를 바인딩 :ObservableCollection의 변경 처리

 private void Form1_Load(object sender, EventArgs e) 
    { 
     var customersQuery = new ObservableCollection<Payment>(context.Payments); 
     customersQuery.CollectionChanged += new NotifyCollectionChangedEventHandler(customerQuery_Changed); 
     dataGridView1.DataSource = new BindingSource() { DataSource = customersQuery }; 

    } 
    OrdersDataModelContainer context = new OrdersDataModelContainer(); 

나는 다음과 같은 변화를 처리 해요 :

private void customerQuery_Changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == NotifyCollectionChangedAction.Add) 
     { 
      foreach (Payment p in e.NewItems) 
      { 
       context.Payments.Add(p); 
      } 
     } 
     if (e.Action == NotifyCollectionChangedAction.Remove) 
     { 
      foreach (Payment p in e.OldItems) 
      { 

       context.Payments.Remove(p); 
      } 
     } 
     context.SaveChanges(); 
    } 

이 작품을 제거하지만 추가 할 잘. 셀이 비어 있기 때문에 새로운 행을 클릭하면 액션 추가가 호출됩니다. 예외가 발생합니다. 어떻게하면 행동을 변경하여 삽입 후 Add를 호출하여 다음 행으로 전환 할 수 있습니까? 또 다른 문제점은 기존 데이터 행을 수정 한 경우입니다. 새 데이터를 삽입 한 후에 만 ​​데이터베이스에서 업데이트됩니다.

아무에게도 해결책을 물을 수 있습니까? 그러나이가에 던져 질 수있는 최신 지점입니다,

public class MyCollection<T> : System.Collections.ObjectModel.ObservableCollection<T> 
{ 
    public event CollectionChangeEventHandler RealCollectionChanged; 

    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     base.OnCollectionChanged(e); 
     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add && e.NewItems.Count > 0) 
     { 
      this.OnRealCollectionChanged(e.NewItems[0]); 
     } 
    } 

    protected virtual void OnRealCollectionChanged(object element) 
    { 
     if (this.RealCollectionChanged != null) 
     { 
      this.RealCollectionChanged(this, new CollectionChangeEventArgs(CollectionChangeAction.Add, element)); 
     } 
    } 
} 

이 이벤트는 표준 한 후 발생합니다 :

답변

1

On CollectionChanged 새 비어있는 요소를 삽입하십시오. PropertyChanged에서 값을 요소에 삽입합니다.

+0

그것은 작동합니다. 감사. 그러나 더 이상 "우아한"방법이 있습니까? – szpic

+0

바인딩 옵션을 찾으려고했는데, "새 행에서 unfocus 컬렉션을 가져 오십시오."라는 말은 추가 한 직후가 아니지만 볼 수는 없습니다. 그리드에 빈 행이 나타나고 업데이트 값이 업데이트되었을 때 빈 엔티티를 만들면 충분히 멋지게 보입니다. – Nikita

+0

예. 당신 말이 맞습니다. 그러나 나는 한가지 더 많은 선택을해야합니다. 누군가가 newRow를 추가하기로 결정한 다음 삭제하면 삭제됩니다. :) – szpic

1

는 다음과 같은 클래스를 사용할 수 있습니다.

+0

고마워요! 솔직히이 코드 스 니펫을 이해할 수는 없지만 그것에 대해 읽을 것입니다 :) – szpic

관련 문제