家有皮总 2023-05-24 15:01 采纳率: 100%
浏览 20
已结题

Winform的DataSource

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

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

  • 写回答

2条回答 默认 最新

  • @晓码自在 2023-05-24 15:10
    关注

    该回答引用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作为数据源,两者需要在同一个线程中同步更新,否则很容易出现此类异常。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月2日
  • 已采纳回答 5月25日
  • 创建了问题 5月24日

悬赏问题

  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏