2013-10-11 54 views
1

我在處理datagridView中的數據修改時遇到了小問題。 我一個DataSource綁定到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(); 
    } 

刪除的作品,但不添加這麼好。當我點擊新行時,添加動作被稱爲co我得到異常,因爲單元格是空的。簡單地說,我可以在插入完成後改變行爲來調用Add,並切換到下一行? 另一個問題是修改現有的數據行。只有在插入新數據後才更新數據庫。

任何人都可以給我解決方案或點我應該搜索它?

回答

1

On CollectionChanged插入新的空元素。 在PropertyChanged中向元素插入值。

+0

它的工作原理。謝謝。但是還有沒有更「優雅」的方式? – szpic

+0

我試圖找到綁定選項,即在添加一個之後,「在未更新集合上從新行更新集合」,但沒有看到這樣的結果。空行出現在網格上時創建空實體,更新值,更新時看起來足夠優雅。 – Nikita

+0

是的。你是對的,但我必須再處理一個選項。當有人決定添加newRow然後將其留空時刪除:) – szpic

1

您可以使用下面的類:

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

本次活動將在標準相繼被拋出,但是這是其可以在拋出的最新點。

+0

謝謝!說實話,我不明白這段代碼片段,但會讀到它:) – szpic