如何通过定时器更新DataGridView内容以同步外部CSV文件最新数据
问题解答
核心结论
你的假设确实不正确,dataGridView2.Update()和dataGridView2.Refresh()仅能触发控件的界面重绘,不会重新加载底层数据源,因此无法同步CSV文件的更新内容。
问题原因
你仅在窗体初始化阶段读取了一次CSV文件内容并绑定到DataGridView,后续定时器触发时并没有重新读取更新后的CSV文件,内存中的数据源始终是第一次加载的旧数据,仅刷新控件界面自然不会有变化。
修复方案
- 将读取CSV并绑定数据源的逻辑抽取为独立公共方法,窗体加载和定时器触发时都调用该方法
- 替换定时器事件中原有的重绘逻辑,改为调用重新加载CSV的方法
- 新增异常捕获逻辑,避免其他程序写入CSV时文件被独占导致读取报错
修改后参考代码
using System.IO; using System.Globalization; using CsvHelper; namespace ST_4 { public partial class Watchlist : Form { string fileName; string AppDataPath; string MQFiles; public Watchlist() { InitializeComponent(); // 窗体加载时首次加载CSV LoadWatchlistCsv(); } public void timer2_Tick(object sender, EventArgs e) { // 定时器触发时重新读取CSV并绑定 LoadWatchlistCsv(); } // 抽取的独立加载方法 public void LoadWatchlistCsv() { AppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); MQFiles = Path.Combine(AppDataPath, "Files"); string csvPath = Path.Combine(MQFiles, "Watchlist.csv"); try { List<ElementsWatch> records; using (var reader = new StreamReader(csvPath)) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { records = csv.GetRecords<ElementsWatch>().ToList(); } // 先清空旧数据源再绑定新数据,避免缓存问题 dataGridView2.DataSource = null; dataGridView2.DataSource = records; } catch (IOException) { // 文件被占用时跳过本次刷新,避免程序崩溃 // 调试阶段可在此处添加日志或者弹窗提示排查问题 } } } }
注意事项
- 请确认你的
timer2控件已设置Enabled = true,并配置了合适的Interval属性(单位为毫秒,比如1000代表每秒刷新一次) - 没有高频刷新需求的话建议适当调大Interval值,减少不必要的磁盘IO开销
- 代码中使用
Path.Combine拼接路径,避免手动拼接斜杠导致的路径错误问题
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

