用了一个datagrid控件,把datasource绑定到了一个datatable上,
我在其它线程里对datatable进行add操作,总是出现 以下提示
引发的异常:“System.InvalidOperationException”(位于 System.Windows.Forms.dll 中)
用了一个datagrid控件,把datasource绑定到了一个datatable上,
我在其它线程里对datatable进行add操作,总是出现 以下提示
引发的异常:“System.InvalidOperationException”(位于 System.Windows.Forms.dll 中)
该回答引用ChatGPT4与博主@晓码自在合作编写:
这个异常的原因是,你在非UI线程中修改了UI控件(DataGrid)的数据源(DataTable),导致控件无法同步更新。
WinForms控件只能在创建它们的线程上进行修改,如果在其他线程修改控件属性或调用控件方法,会导致此异常。
解决方法有两种:
csharp
dataTable.BeginInvoke(new Action(() => {
// 在这里执行添加数据表操作
dataTable.Rows.Add(newRow);
}));
然后调用dataGrid.Refresh()刷新DataGrid,更新UI。
csharp
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (s, e) => {
// 在后台线程中执行添加数据表操作
dataTable.Rows.Add(newRow);
};
worker.RunWorkerCompleted += (s, e) => {
// 在UI线程中刷新UI
dataGrid.Refresh();
};
worker.RunWorkerAsync(); // 启动后台线程
这两个方法的思路都是将UI更新操作放在UI线程执行,而其它操作则可以在后台线程执行,从而避免多线程访问UI控件引发异常。
DataGrid作为UI控件,其绑定的DataTable作为数据源,两者需要在同一个线程中同步更新,否则很容易出现此类异常。