2010-07-27 67 views
0

我试图用WPF datagrid实现一个简单的电子表格。 当用户在单元格中输入公式时,引擎会计算公式并使用计算值更新单元格。但我处理的大部分计算都需要很长时间,所以我想要在其他线程中计算这些计算。从其他线程更新wpf datagrid单元格

我试图用下面的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 bcz我使用Dispatcher.BeginInvoke()。我的问题似乎是用户输入值(公式)覆盖了我想要显示的计算值。

回答

1

您无法从另一个线程更新GUI。幸运的.Net提供了一种机制来处理这个问题:

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

例如

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

编辑:对不起原来的代码是为Windows.Forms的

+0

我知道的Dispatcher.Invoke()。你可以看到我的代码。我已经使用它,我的代码不会抛出任何InvalidOperationException。 – 2010-07-27 04:31:34

+0

对不起,我错过了。 问题可能出在匿名函数闭包(即:存储错误的值)。 您是否尝试在Calc例程(它更新单元格值)的末尾设置断点? – sukru 2010-07-27 05:19:11

+0

还有一件事,你可以尝试移动r和c的计算。 – sukru 2010-07-27 05:22:47

0

看一看的WPF Dispatcher Class。您有很多选项可以从Dispatcher执行线程化任务。查看BeginInvoke和Invoke方法。