2015-01-11 41 views
0

我有一個DataGrid充滿'可驗證的對象'。一個對象的驗證大約需要150ms。刷新DataGrid而不凍結應用程序(異步)

一排看起來是這樣的:

enter image description here

如果我確認一個對象也可以是有效或無效:

enter image description here

enter image description here

我可以驗證所有的對象在DataGrid中。 目前我刷新數據網格GUI後驗證所有對象(數據網格在驗證禁用期間)。但是,如果數據網格充滿了數千個對象,則可能需要幾分鐘時間,但用戶應該看到進度。我的想法是:每次驗證後刷新數據網格。但刷新需要很長時間(如100-300ms)...如果我的數據網格中有500個對象,它必須刷新500次,刷新期間應用程序GUI凍結...基本上,gui在驗證過程中永久凍結

有沒有辦法刷新一行?或者:是否有可能刷新數據網格異步? 我不在乎數據網格是否凍結(它已被禁用),但應用程序不應凍結。

編輯:我正在使用DataBinding到ObservableCollection。每次驗證後,我都會觸發PropertyChanged事件(INotifyPropertyChanged)。雖然每次驗證後都不會更新...

回答

0

這是棘手的業務,因爲您不能異步刷新網格,因爲這意味着您將在單獨的線程上這樣做,並且唯一的線程應該更新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 
0

你能告訴我們一些代碼,你如何填充DataGrid?

通常你不想刷新整個列表。相反,您應該使用數據綁定和屬性更改通知刷新/更新僅更改的值。

這可以通過將有效性列綁定到您的數據對象上的有效性屬性(希望實現INotifyPropertyChanged),然後在完成驗證檢查後更新此屬性來實現。沒有看到一些代碼就很難更具體。