Winform的DataSource

用了一个datagrid控件,把datasource绑定到了一个datatable上,
我在其它线程里对datatable进行add操作,总是出现 以下提示

引发的异常:“System.InvalidOperationException”(位于 System.Windows.Forms.dll 中)

该回答引用ChatGPT4与博主@晓码自在合作编写:

这个异常的原因是,你在非UI线程中修改了UI控件(DataGrid)的数据源(DataTable),导致控件无法同步更新。

WinForms控件只能在创建它们的线程上进行修改,如果在其他线程修改控件属性或调用控件方法,会导致此异常。

解决方法有两种:

  1. 在UI线程中修改DataTable,再刷新DataGrid
    你可以使用BeginInvoke在UI线程中执行DataTable的修改操作:
csharp
dataTable.BeginInvoke(new Action(() => {
    // 在这里执行添加数据表操作
    dataTable.Rows.Add(newRow); 
}));

然后调用dataGrid.Refresh()刷新DataGrid,更新UI。

  1. 使用BackgroundWorker在后台线程修改DataTable,完成后在UI线程刷新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作为数据源,两者需要在同一个线程中同步更新,否则很容易出现此类异常。

这个要看下代码,其它线程,要用 Invoke 委托,不要直接操作