C# WinForm期权链数据获取成功但DataGridView网格无显示无报错排查
问题排查及修复方案
核心问题点
GetOptionsTableRow方法逻辑完全错误
你写的该方法永远只返回表的第一行,369条数据全部覆盖写入同一行,最终要么只显示最后一条数据,要么因为主键冲突报错,错误被空catch吞掉后无任何提示。- 绑定源被挂起后未恢复
按钮点击事件里你调用了optionsTableBindingSource.SuspendBinding(),还将RaiseListChangedEvents设为false,后台任务跑完后没有恢复绑定、开启变更通知,绑定源停止更新界面自然不会刷新。 - 跨线程操作UI绑定数据源
你把DataTable的更新逻辑全部放在BackgroundWorker的后台线程中执行,直接操作绑定到UI控件的数据源属于线程不安全操作,就算数据写入正确也可能出现不刷新的问题,隐藏异常同样会被空catch吞掉。 - 空吞异常导致无法定位问题
代码中所有try-catch都是空实现,赋值错误、行添加错误、主键冲突等异常全部被屏蔽,无法感知到运行时报错。 - 行添加逻辑重复
旧的GetOptionsTableRow已经把新行添加到Rows集合中,后续new_row判断中又重复添加同一行,触发主键重复异常,被catch吞掉后无法正常插入数据。
修复步骤
- 重写
GetOptionsTableRow方法,每次返回全新的行对象:
private OptionsTableRow GetOptionsTableRow() { return OptionsTable.NewOptionsTableRow(); }
- 给
downloadWorker添加RunWorkerCompleted事件,在UI线程恢复绑定:
private void downloadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // 恢复期权表绑定 optionsTableBindingSource.RaiseListChangedEvents = true; optionsTableBindingSource.ResumeBinding(); optionsTableBindingSource.ResetBindings(false); // 恢复其他表绑定 positionsTableBindingSource.RaiseListChangedEvents = true; positionsTableBindingSource.ResumeBinding(); positionsTableBindingSource.ResetBindings(false); resultsTableBindingSource.RaiseListChangedEvents = true; resultsTableBindingSource.ResumeBinding(); resultsTableBindingSource.ResetBindings(false); // 恢复界面控件原有状态 updateButton.Visible = true; autoRefreshCheckBox.Visible = true; downloadLabel.Visible = false; }
- 移除所有无意义的空catch,至少添加日志输出或者Debug打印,方便定位运行时错误。
- 建议将DataTable的更新逻辑迁移到
RunWorkerCompleted事件中执行,避免跨线程操作UI绑定数据源的问题。
内容的提问来源于stack exchange,提问作者quicklearner
相关产品推荐
相关产品推荐

