バックグラウンド スレッドからメッセージを受信し、メイン フォームのリストに追加する小さな Windows フォーム アプリケーションを作成しています。フォームには、DataSourceがメッセージリストに設定されたDataGridViewがあります(例)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