【问题标题】:Refresh DataGrid without freezing the application (asynchronous)刷新 DataGrid 而不冻结应用程序(异步)
【发布时间】:2015-01-11 21:24:14
【问题描述】:

我有一个填充了“可验证对象”的 DataGrid。一个对象的验证大约需要 150 毫秒。

一行如下所示:

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

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

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

编辑:我正在使用 DataBinding 到 ObservableCollection。每次验证后,我都会触发 PropertyChanged 事件 (INotifyPropertyChanged)。虽然每次验证后都不会更新...

【问题讨论】:

    标签: c# wpf asynchronous datagrid refresh


    【解决方案1】:

    这是一项棘手的工作,因为您不能异步刷新网格,因为这意味着您将在单独的线程上执行此操作,并且唯一应该更新 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
    

    【讨论】:

      【解决方案2】:

      您能否向我们展示一些有关如何填充 DataGrid 的代码?

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

      这可以通过将有效性列绑定到数据对象上的有效性属性(希望实现 INotifyPropertyChanged),然后在完成验证检查后更新此属性来实现。不看代码很难说得更具体。

      【讨论】:

        猜你喜欢
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多