【发布时间】:2012-07-10 16:11:06
【问题描述】:
我正在创建一个小型 Windows 窗体应用程序,它将从后台线程接收消息,然后将它们添加到主窗体上的列表中。在表单上,我有一个 DataGridView,其中 DataSource 设置为消息列表(例如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
【问题讨论】:
-
您是否尝试将列表设置为 BindingSource,并将 BindingSource 设置为网格的源。 BindingSource 使事物保持同步