2013-10-17 85 views
1

我有一個DataGridView和一個自定義列表。我將它綁定使用:在新行後更新datagridview

datagridview.DataSource = MyList; 

的問題是,每當我從一個線程新行添加到列表中,它不會在DataGridView中顯示新行。有什麼方法可以簡單地覆蓋OnNewData事件類型DoRefresh(),並且可能不會丟失滾動位置?

SyncList的我使用的是:

public class SyncList<T> : System.ComponentModel.BindingList<T> 
    { 
     private System.ComponentModel.ISynchronizeInvoke _SyncObject; 
     private System.Action<System.ComponentModel.ListChangedEventArgs> _FireEventAction; 

     public SyncList() 
      : this(null) 
     { 
     } 

     public SyncList(System.ComponentModel.ISynchronizeInvoke syncObject) 
     { 

      _SyncObject = syncObject; 
      _FireEventAction = FireEvent; 
     } 

     protected override void OnListChanged(System.ComponentModel.ListChangedEventArgs args) 
     { 
      if (_SyncObject == null) 
      { 
       FireEvent(args); 
      } 
      else 
      { 
       _SyncObject.Invoke(_FireEventAction, new object[] { args }); 
      } 
     } 
+0

據我所知,你的控制不會更新,只是因爲你更新'MyList'。如果您使用WinForms,[自定義對象列表視圖](http://objectlistview.sourceforge.net/cs/index.html)可能會有所幫助。 – gunr2171

+0

我正在使用SyncList,因此數據正在更新'實時'。但我必須重新分配datagridview的列表才能顯示新行。 – user2320462

回答

0

你的列表需要執行INotifyPropertyChanged自動更新綁定控件工作。如果你這樣做,你需要在添加或刪除列表中的項目時引發PropertyChanged事件。

或者,只需使用已經正確實現此接口的BindingList或ObservableCollection。

綁定列表:http://msdn.microsoft.com/en-us/library/ms132679.aspx

觀察到的集合:http://msdn.microsoft.com/en-us/library/ms668604.aspx

+0

謝謝!你能否請檢查我的更新答案,並告訴我是否可以簡單地擴展SyncList以使datagridview顯示新行?謝謝 – user2320462

+0

它看起來像是重寫OnListChanged,這就是爲什麼DataGrid沒有獲取更改通知事件。您需要調用基類OnListChanged: http://msdn.microsoft.com/en-us/library/ms132698.aspx – BradleyDotNET