![](/img/trans.png)
[英]Why is my DataGridView not updating changes on the underlying DataTable
[英]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.