VB.NET项目需求:从JSON提取数据并计算各矿场总耗时
VB.NET 矿场耗时汇总与界面动态更新问题
问题核心
你需要实现两个核心功能:
- 从JSON文件中按矿场名称分组,汇总对应
results字段的总耗时 - 动态更新GroupBox中的矿场列表:新增记录时,已存在的矿场累加耗时,不存在则新增行
当前代码仅显示第一个矿场,是因为循环内的Return语句直接中断了遍历逻辑。
现有代码问题分析
你的addnewMinelabel函数在For Each循环的第一次迭代就执行了Return mineName,导致循环直接终止,后续矿场数据完全没被处理。此外,代码仅实现了矿名显示,完全缺失耗时汇总的核心逻辑。
解决方案
1. 先实现数据分组汇总
使用LINQ对反序列化后的MineDetails列表按矿名分组,计算每组的总耗时:
' 确保你的MineDetails类与JSON结构匹配 Public Class MineDetails Public Property Mine As String Public Property Results As Double ' 耗时字段,类型根据实际需求调整 End Class ' 分组汇总逻辑 Dim jsonData = File.ReadAllText(GetFileName()) Dim mineList = JsonConvert.DeserializeObject(Of List(Of MineDetails))(jsonData) Dim groupedMines = mineList.GroupBy(Function(m) m.Mine) _ .Select(Function(g) New With { .MineName = g.Key, .TotalHours = g.Sum(Function(m) m.Results) }).ToList()
2. 修复界面加载函数(显示所有矿场汇总)
把原函数改成无返回值的Sub,移除循环内的Return,遍历汇总后的结果创建控件:
Public Sub LoadMineSummary() ' 清空GroupBox避免重复加载旧数据 GroupBox1.Controls.Clear() lblMineName = 0 ' 重置位置计数器 Dim jsonData = File.ReadAllText(GetFileName()) Dim mineList = JsonConvert.DeserializeObject(Of List(Of MineDetails))(jsonData) ' 分组汇总数据 Dim groupedMines = mineList.GroupBy(Function(m) m.Mine) _ .Select(Function(g) New With { .MineName = g.Key, .TotalHours = g.Sum(Function(m) m.Results) }).ToList() ' 遍历创建汇总标签 For Each mine In groupedMines Dim summaryLabel As New Label() GroupBox1.Controls.Add(summaryLabel) summaryLabel.Top = lblMineName * 27 summaryLabel.Left = 10 summaryLabel.AutoSize = True ' 格式化显示矿名和总耗时 summaryLabel.Text = $"{mine.MineName} - 总耗时: {mine.TotalHours:F2}" lblMineName += 1 Next End Sub
调用这个Sub即可将所有矿场的汇总数据加载到GroupBox中。
3. 新增记录时的动态更新
方法1:简单重新加载(适合新手)
新增记录后,保存到JSON文件,再调用LoadMineSummary()刷新界面:
Public Sub AddNewRecord(newRecord As MineDetails) ' 读取现有数据 Dim jsonData = File.ReadAllText(GetFileName()) Dim mineList = JsonConvert.DeserializeObject(Of List(Of MineDetails))(jsonData) ' 添加新记录 mineList.Add(newRecord) ' 保存回JSON文件 File.WriteAllText(GetFileName(), JsonConvert.SerializeObject(mineList, Formatting.Indented)) ' 刷新界面 LoadMineSummary() End Sub
方法2:实时更新控件(无需重新读取文件)
如果不想重新加载全部数据,可以直接检查GroupBox中的现有标签,更新或新增:
Public Sub UpdateSummaryOnAdd(newMineName As String, newHours As Double) ' 查找是否已存在该矿场的标签 Dim existingLabel = GroupBox1.Controls.OfType(Of Label)() _ .FirstOrDefault(Function(l) l.Text.StartsWith($"{newMineName} -")) If existingLabel IsNot Nothing Then ' 提取当前总耗时并累加 Dim currentHours As Double If Double.TryParse(existingLabel.Text.Split(": ")(1), currentHours) Then currentHours += newHours existingLabel.Text = $"{newMineName} - 总耗时: {currentHours:F2}" End If Else ' 新增标签 Dim summaryLabel As New Label() GroupBox1.Controls.Add(summaryLabel) summaryLabel.Top = lblMineName * 27 summaryLabel.Left = 10 summaryLabel.AutoSize = True summaryLabel.Text = $"{newMineName} - 总耗时: {newHours:F2}" lblMineName += 1 End If ' 别忘了同时把新记录保存到JSON文件 ' 可复用AddNewRecord里的保存逻辑 End Sub
内容的提问来源于stack exchange,提问作者Kenneth Berrian
相关产品推荐
相关产品推荐

