繁体   English   中英

基础数据源更改时,UI中的DataGridView不更新

[英]DataGridView not updating in UI when underlying datasource changes

我正在创建一个小的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

将列表绑定到列表然后修改原始列表时,DataGridView不会自动更新其显示。 它将仅显示绑定时列表中存在的数据。

如果希望DataGridView在绑定集合更改时动态更新,则需要绑定实现IBindingList的集合(例如BindingList http://msdn.microsoft.com/zh-cn/library/ms132679(v=vs.90) .aspx )或IBindingListView(例如BindingSource http://msdn.microsoft.com/zh-cn/library/system.windows.forms.bindingsource(v=vs.90).aspx )。

您可以将List<Message>()替换为自定义类,并继承BindingList<T>然后将Message Dispatcher附加到其中。

public class MessageList : BindingList<Message>
{
}

在您的主窗体中订阅ListChanged事件,您就可以开始了。

每当我像这样用datagridview做任何事情时,我都会使用以下系统:

我有一个DataObject,在您的情况下为List对象。 然后,我创建一个绑定对象,并将其数据源设置为DataObject。 我将DatagridView数据源设置为绑定对象。

这样,当您对数据对象进行更改时,它们会自动过滤到Datgrid。

在您的情况下,您应该像Turbot说的那样做,创建一个继承BindingList对象的类,然后就可以开始工作了。

尝试使用BindingList而不是List 它形成双向连接。 (在ComponentModel命名空间中)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM