2

バックグラウンド スレッドからメッセージを受信し、メイン フォームのリストに追加する小さな 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

4

4 に答える 4

3

List を DataGridView にバインドして元の List を変更しても、DataGridView の表示は自動的に更新されません。バインドした時点でリストに存在していたデータのみが表示されます。

バインドされたコレクションが変更されたときに 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など)。

于 2012-07-09T23:20:42.790 に答える
3

List<Message>()をカスタム クラスに置き換えて、を継承し、BindingList<T>それにアタッチすることができますMessage Dispatcher。例

public class MessageList : BindingList<Message>
{
}

メインフォームでListChangedイベントをサブスクライブすれば、準備完了です。

于 2012-07-10T03:39:27.537 に答える
1

このようなデータグリッドビューで何かをするときは、次のシステムを使用します:-

私は DataObject を持っています。あなたの場合は List オブジェクトです。次に、Binding Object を作成し、そのデータソースを DataObject として設定します。DatagridView DataSource をバインディング オブジェクトとして設定します。

そうすれば、データ オブジェクトに変更を加えると、自動的に Datgrid にフィルターされます。

あなたの場合、Turbot が言うように、BindingList オブジェクトを継承するクラスを作成する必要があります。

于 2012-07-10T08:11:06.840 に答える
0

BindingListの代わりにa を使用してみてくださいList。双方向接続を形成します。(ComponentModel 名前空間にあります)

于 2012-07-09T23:11:35.730 に答える