gpt4 book ai didi

c# - 基础数据源更改时,DataGridView 不会在 UI 中更新

转载 作者:行者123 更新时间:2023-11-30 20:05:25 25 4
gpt4 key购买 nike

我正在创建一个小型 Windows 窗体应用程序,它将从后台线程接收消息,然后将它们添加到主窗体的列表中。在表单上,​​我有一个 DataGridView,其中 DataSource 设置为消息列表(例如 List<Message> )

目前,消息堆积如山,但我无法让 DataGridView 在消息出现时呈现它们。以下是我使用过的方法的总结。

1.初始化主窗体设置绑定(bind)并启动消息例程

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 反射(reflect)发生的变化。

注意:我也尝试过使用 Invalidate 方法和 ResetBindings 方法。我还尝试将列表切换为 ObservableCollection

最佳答案

您可以替换 List<Message>()到自定义类并继承 BindingList<T>并附上您的 Message Dispatcher进去。示例

public class MessageList : BindingList<Message>
{
}

在你的主窗体中订阅ListChanged事件,你很高兴。

关于c# - 基础数据源更改时,DataGridView 不会在 UI 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11404453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com