簡體   English   中英

基礎數據源更改時,UI中的DataGridView不更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM