Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 刷新DataGrid而不冻结应用程序(异步)_C#_Wpf_Asynchronous_Datagrid_Refresh - Fatal编程技术网

C# 刷新DataGrid而不冻结应用程序(异步)

C# 刷新DataGrid而不冻结应用程序(异步),c#,wpf,asynchronous,datagrid,refresh,C#,Wpf,Asynchronous,Datagrid,Refresh,我有一个充满“可验证对象”的数据网格。一个对象的验证大约需要150毫秒 一行如下所示: 如果我验证一个对象,它可以是有效的,也可以是无效的: 我可以验证DataGrid中的所有对象。 目前,我在验证所有对象后刷新datagrid gui(datagrid在验证期间处于禁用状态)。但是,如果datagrid中填充了数千个对象,可能需要几分钟的时间,但是用户应该可以看到进度。我的想法是:在每次验证后刷新数据网格。但是刷新需要很长时间(比如100-300毫秒)。。。如果我的datagrid中有5

我有一个充满“可验证对象”的数据网格。一个对象的验证大约需要150毫秒

一行如下所示:

如果我验证一个对象,它可以是有效的,也可以是无效的:

我可以验证DataGrid中的所有对象。 目前,我在验证所有对象后刷新datagrid gui(datagrid在验证期间处于禁用状态)。但是,如果datagrid中填充了数千个对象,可能需要几分钟的时间,但是用户应该可以看到进度。我的想法是:在每次验证后刷新数据网格。但是刷新需要很长时间(比如100-300毫秒)。。。如果我的datagrid中有500个对象,它必须刷新500次,在刷新期间,应用程序GUI会冻结。。。基本上,gui是在验证过程中永久冻结的

有没有办法只刷新一行?或者:是否可以异步刷新datagrid? 我不在乎datagrid是否冻结(无论如何它都被禁用),但应用程序不应该冻结


编辑:我正在使用数据绑定到一个可观察的集合。每次验证后,我都会触发PropertyChanged事件(INotifyPropertyChanged)。虽然每次验证后都不会更新网格…

但这是一项棘手的工作,因为您无法异步刷新网格,因为这意味着您将在单独的线程上进行刷新,而唯一应该更新UI的线程是UI线程

但是,如果您有一个与网格关联的数据源,则可以对数据源使用
System.ComponentModel.BindingList
。然后可以在单独的线程上更新绑定列表,这将只影响更新的行或单元格。这里有一个例子

这是类级声明/赋值:

Private myList As New System.ComponentModel.BindingList(Of String)(New List(Of String)({"First", "Second", "Third"}))
以下是表单加载事件处理程序:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    DataGridView1.DataSource = myList
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    myList.RaiseListChangedEvents = False

    Task.Factory.StartNew(Sub()
                              Me.Invoke(Sub() myList.Add("Fourth"))
                          End Sub)

    myList.RaiseListChangedEvents = True
    myList.ResetBindings()
End Sub
然后,您可以在主代码使用的任何方法中执行此操作。我正在使用按钮单击事件处理程序:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    DataGridView1.DataSource = myList
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    myList.RaiseListChangedEvents = False

    Task.Factory.StartNew(Sub()
                              Me.Invoke(Sub() myList.Add("Fourth"))
                          End Sub)

    myList.RaiseListChangedEvents = True
    myList.ResetBindings()
End Sub

你能给我们看一些你如何填充DataGrid的代码吗

通常,您不希望刷新整个列表。相反,您应该使用数据绑定和属性更改通知来仅刷新/更新已更改的值

这可以通过将validity列绑定到数据对象上的validity属性(实现INotifyPropertyChanged)并在完成验证检查后更新此属性来实现。如果没有看到一些代码,就很难说得更具体