You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:14:55