[英]Why is my DataGridView not updating changes on the underlying DataTable
[英]DataGridView not updating in UI when underlying datasource changes
我正在創建一個小的Windows窗體應用程序,它將從后台線程接收消息,然后將它們添加到主窗體上的列表中。 在表單上,我有一個DataGridView ,其DataSource設置為消息列表( 例如List<Message>
)
目前,消息正在堆積,但是我無法讓DataGridView在消息出現時呈現它們。 這是我使用的方法的摘要。
1.初始化設置綁定的主窗體並啟動消息例程
internal Main(IMessageDispatcher messageDispatcher, IMessagePublisher messagePublisher)
{
InitializeComponent();
_messageEntries = new List<Message>();
BindToMessageEntriesList();
_messageDispatcher = messageDispatcher;
_messageDispatcher.OnMessageReceived += MessageDispatcher_OnMessageReceived;
_messageDispatcher.Start();
}
private void BindToMessageEntriesList()
{
MessageEntriesGrid.DataSource = _messageEntries;
}
2.處理收到的消息並添加到內部列表
private void MessageDispatcher_OnMessageReceived(Message message)
{
lock (_logEntries)
{
_messageEntries.Add(message);
}
var cb = new RefreshListCallbackDelegate(RefreshView);
this.Invoke(cb);
}
3.刷新主線程
private void RefreshView()
{
MessageEntriesGrid.Refresh();
}
誰能建議我如何使UI反映更改的發生。
注意:我也嘗試使用Invalidate方法和ResetBindings方法。 我也嘗試過將列表切換為ObservableCollection
將列表綁定到列表然后修改原始列表時,DataGridView不會自動更新其顯示。 它將僅顯示綁定時列表中存在的數據。
如果希望DataGridView在綁定集合更改時動態更新,則需要綁定實現IBindingList的集合(例如BindingList http://msdn.microsoft.com/zh-cn/library/ms132679(v=vs.90) .aspx )或IBindingListView(例如BindingSource http://msdn.microsoft.com/zh-cn/library/system.windows.forms.bindingsource(v=vs.90).aspx )。
您可以將List<Message>()
替換為自定義類,並繼承BindingList<T>
然后將Message Dispatcher
附加到其中。 例
public class MessageList : BindingList<Message>
{
}
在您的主窗體中訂閱ListChanged
事件,您就可以開始了。
每當我像這樣用datagridview做任何事情時,我都會使用以下系統:
我有一個DataObject,在您的情況下為List對象。 然后,我創建一個綁定對象,並將其數據源設置為DataObject。 我將DatagridView數據源設置為綁定對象。
這樣,當您對數據對象進行更改時,它們會自動過濾到Datgrid。
在您的情況下,您應該像Turbot說的那樣做,創建一個繼承BindingList對象的類,然后就可以開始工作了。
嘗試使用BindingList
而不是List
。 它形成雙向連接。 (在ComponentModel命名空間中)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.