2012-07-09 111 views
2

我正在創建一個小型Windows窗體應用程序,它將從後臺線程接收消息,然後將它們添加到主窗體上的列表中。在窗體上我有一個的DataGridView數據源設置爲郵件列表(List<Message>當基礎數據源發生更改時,DataGridView不會在UI中更新

目前,郵件堆積如山,但我不能得到的DataGridView呈現消息。以下是我使用的方法的總結。

1.初始化主要形式設置的結合和startnig消息例程

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方法。我也嘗試過使用的BindingList代替List列表切換到ObservableCollection

+0

您是否試圖將您的列表設置到BindingSource中,並將BindingSource設置爲Gird的源。 BindingSource是保持同步的東西 – MBen 2012-07-09 23:06:55

回答

3

您可以將List<Message>()替換爲自定義類,並繼承BindingList<T>並將其附加到Message Dispatcher中。 例

public class MessageList : BindingList<Message> 
{ 
} 

在主窗體 subsribe的ListChanged事件,你去好。

0

嘗試。它形成了一個雙向連接。 (它位於ComponentModel名稱空間中)

3

當您將List綁定到它時,DataGridView將不會自動更新其顯示,然後修改原始List。它只會顯示您綁定時存在於列表中的數據。

如果您希望DataGridView在綁定集合更改時動態更新,您需要綁定實現IBindingList(如BindingList http://msdn.microsoft.com/en-us/library/ms132679(v=vs.90).aspx)或IBindingListView(如BindingSource http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource(v=vs.90).aspx)的集合。

1

當過我做任何事情的DataGridView這樣我使用以下系統: -

我有一個數據對象,在你的情況列表對象。 然後我創建一個綁定對象並將其數據源設置爲DataObject。 我將DatagridView DataSource設置爲綁定對象。

這樣,當您對數據對象進行更改時,它們會自動過濾到數據網格。

在你的情況,你應該像Turbot說的那樣做,創建一個繼承BindingList對象的類,並且你很好。

相關問題