2010-12-30 3 views
0

Ich habe eine Anwendung, wo ich die Ansicht basierend auf den Nachrichten von einem WCF-Dienst erhalten aktualisieren müssen. Ich benutze den MVP für die ui. Die Ansicht hat eine dataGridView auf einem Gewinnformular, in dem die empfangenen Nachrichten angezeigt werden. Ich habe eine verbindliche Liste für diese Ansicht in meinem Referenten.Aktualisieren von BindingList auf dem ui Thread mit mehrmals aufrufen

Ich aktualisiere die Bindungsliste durch Aufrufen von in der DataGridView aufrufen. Meine Frage ist, wenn ich viele Nachrichten (~ 10/sec) empfange, macht es Sinn, alle diese Nachrichten in einer separaten Liste zu sammeln und dann innerhalb des Aufrufs hinzuzufügen, fügen Sie sie der Bindungsliste hinzu oder rufen Sie invoke zum Hinzufügen jeder Nachricht auf zur verbindlichen Liste.

public class Presenter 
{ 
    private List<ClientMessage> newMessages; 
    private BindingList<ClientMessage> messageDataSource; 
    public void Presenter() 
    { 
     newMessages = new List<ClientMessage>(); 
     Views.AuditorGridView.DataSource = messageDataSource; 
    } 

    public void ReceiveMessages(List<ClientMessage> messageList) 
    { 
     //...some other message related processing 
     foreach (ClientMessage message in messageList) 
     { 
      if (messageIdList.Contains(message.ID)) continue; 
      messageIdList.Add(message.ID); 
      messageDataSource.Add(message); 
      View.gridView.BeginInvoke(new InvokeDelegate(GridInvokeMethod1)); 
     } 
    } 

    private void GridInvokeMethod1() 
    { 
     Views.AuditorGridView.DataSource = messageDataSource; 
    } 

    //OR 

    public void ReceiveMessages(List<ClientMessage> messageList) 
    { 
     //...some other message related processing 
     newMessages.Clear(); 
     foreach (ClientMessage message in messageList) 
     { 
      if (messageIdList.Contains(message.ID)) continue; 
      messageIdList.Add(message.ID); 
      newMessages.Add(message); 
     } 
     View.gridView.BeginInvoke(new InvokeDelegate(GridInvokeMethod2)); 
    } 

    private void GridInvokeMethod2() 
    { 
     foreach (ClientMessage message in newMessages) 
     { 
      messageDataSource.Add(message); 
     } 
    } 
} 

Antwort

0

Haben Sie versucht, BindingSource zu verwenden. Sie können Ihre Bindungen aussetzen (so dass Sie neue Elemente in Ihrer Liste hinzufügen und dann fortsetzen können). Auf diese Weise erhält Ihr Grid Bulk-Updates.

Möglicherweise müssen Sie hierfür BindingList verwenden (damit Aktualisierungen der Quelle im Ziel (in Ihrem Fall Gitter) widergespiegelt werden

Verwandte Themen