【问题标题】:Winforms DataGridView UI does not updateWinforms DataGridView UI 不更新
【发布时间】:2011-06-08 04:47:23
【问题描述】:

我正在开发一个使用

下载的应用程序
1) Parallel.ForEach(linklist, x => DownloadAsync(x)); 
2) webClient.DownloadStringAsync(new Uri(link.Url));  

class Link 
{
 string url;
 string result;
 int progress;
}

并使用 INotifyPropertyChanged 更新 datagridview。

问题在于下载速度非常快,datagridview 更新第一行,然后 UI 不更新,但随后将鼠标光标移动到 datagridview 行上,每一行都会更新值。

我不明白我错过了什么。

请多多指教,谢谢。

编辑:异步不会阻塞 GUI,所以我没有使用后台线程。

【问题讨论】:

  • 所以您已经将列表设置为 DataGridView 的数据源,并且列表是 ObservableCollection?
  • BindingSource是DataSource,得到LinkList

标签: c# .net windows winforms asynchronous


【解决方案1】:

虽然您没有显示您的代码,但我假设您正在从背景线程更新 UI 元素,这是您不应该做的事情。如果您的目标是 WinForms,您需要使用 BackgroundWorkerControl.Invoke

BackgroundWorker Component Overview
How to: Implement a Form That Uses a Background Operation
How can I update my user interface from a thread that did not create it?

【讨论】:

  • Async 不会阻塞 GUI,不,我没有使用 backgroundworker,同一个线程
  • @Milan Aditya - 对,异步不会阻塞 GUI,但是当异步回调时,它会在非 UI 线程中回调,对吗?因此,您正在从非 UI 线程更新数据网格数据源。 BackgroundWorker 保证回调将发生在 UI 线程中。
  • 是的,你是对的,但我正在做的是我设置了 dataGridView1.DataSource = _BindingSource;在 form_load 上,然后使用 INotifyPropertyChanged 自动更新
  • DataGrid 订阅了列表中的更改,因此当您更新列表时,您正在从非 UI 线程访问数据网格,这可能会导致无法预料的结果。
  • Alex 谢谢你的回复,但我必须告诉你 datagridview 有一些问题或者我完全遗漏了一些东西,尝试使用 INotifyPropertyChanged 更新 datagridview 绑定到 bindingsource 和 object 它不起作用,只是尝试一个简单的 for 循环添加数字,在按钮上单击同一个 UI 线程
【解决方案2】:

你的对象,被绑定,需要实现INotifyPropertyChanged

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多