簡體   English   中英

從其他線程更新wpf datagrid單元

[英]update wpf datagrid cell from other thread

我正在嘗試使用WPF數據網格實現一個簡單的電子表格。 當用戶在單元格中輸入公式時,引擎將計算公式並使用計算出的值更新單元格。 但是我處理的大多數計算都需要很長時間,因此我想在其他線程中進行計算。

我嘗試使用CellEditEnding事件來實現此目標,如下所示。 (dataGrid1的ItemsSource綁定到DataTable dtab。)

private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) {
    Action calc = () => {
        int r = dataGrid1.Items.IndexOf(e.Row.Item);
        int c = dataGrid1.Columns.IndexOf(e.Column);
        dtab.Rows[r].SetField(c, "X"); // a calculated value
    };            
    Action update = () => {
        if (dataGrid1.Dispatcher.CheckAccess()) calc();
        else dataGrid1.Dispatcher.BeginInvoke(calc);
    };

    //update(); // run from the same ui thread
    Task.Factory.StartNew(update); // run from a different thread
}

當它從同一UI線程更新單元格值時,單元格將用值“ X”更新,但從不同線程更新時,它不是。 如何從其他線程更新值為“ X”的單元格?

編輯:我的代碼不會拋出任何InvalidOperationException,因為我使用了Dispatcher.BeginInvoke()。 我的問題似乎是用戶輸入值(公式)覆蓋了我要顯示的計算值。

您不能從另一個線程更新GUI。 幸運的是,.Net提供了一種處理此問題的機制:

uiControl.**Dispatcher**.Invoke(delegate)

例如

dataGrid1.Dispatcher.Invoke(() => MyUpdateFunction(dataGrid1, data))

編輯:抱歉,原始代碼適用於Windows.Forms

使用調度程序不是一個好主意。 如果編碼不正確,它會使用戶界面無響應。 如果計划在多線程設置中使用datagrid,則應使用事件來反映更新。 我建議結合使用ObservableCollection和INotifyPropertyChanged作為更好的選擇。 我在這里發布了一個模板:

http://www.codeproject.com/Articles/1086714/A-Template-For-Using-Datagrid-in-Monitoring-UI

看一下WPF Dispatcher類 您有很多選擇可以從Dispatcher執行線程化任務。 查看BeginInvoke和Invoke方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM