2010-12-30 11 views
0

私はwcfサービスから受信したメッセージに基づいてビューを更新する必要があるアプリケーションがあります。 MVPを使用しています。ビューには、受信したメッセージを表示するwinフォームのdataGridViewがあります。私はプレゼンターのこのビューのバインディングリストを持っています。複数の呼び出しを使用してuiスレッドのbindingListを更新する

私はdataGridViewの呼び出しを呼び出してバインディングリストを更新します。私の質問は、私は別のリスト内のすべてのメッセージを収集し、その後、呼び出し呼び出しの中でそれらをバインディングリストに追加するか、各メッセージを追加するための呼び出しを呼び出すのが大好きです(〜10/sec)バインディングリストに追加します。

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); 
     } 
    } 
} 

答えて

0

BindingSourceを使用してみましたか?バインディングを中断することができます(リストに新しい項目を追加してから再開することができます)。そうすれば、グリッドは一括更新されます。

これでBindingListを使用する必要があるかもしれません(ソースの更新がターゲット(あなたのケースのグリッド)に反映されるように)

関連する問題