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

VB.NET+SQL Server计算剩余天数:DataGridView单元格为空问题求助

解决DataGridView计算剩余天数单元格为空的问题

你的代码主要存在两个核心问题,导致单元格返回空值:

  • DateInterval类型错误
    你使用DateInterval.Year计算的是年份差值,但实际需要的是天数差,应改为DateInterval.Day。

  • 未处理DBNull空值
    数据库中ValidadeLicenca字段可能存在空值,直接赋值给Date类型会抛出异常,导致循环提前终止,后续行的计算无法执行。

以下是修正后的完整代码:

Private Sub ValidadeLicencas_Load(sender As Object, e As EventArgs) Handles Me.Load
    Conectar()

    Dim cmd As New SqlCommand("SELECT AlvaraNumero,NomeEmpresa,ContactoEmpresa,ValidadeLicenca FROM EmissaoLicenca", conexoes)

    Dim da As New SqlDataAdapter
    da.SelectCommand = cmd
    Dim dt As New DataTable
    dt.Clear()
    da.Fill(dt)
    DataGridViewValidade.DataSource = dt
    conexoes.Close()

    DataGridViewValidade.AllowUserToAddRows = False

    Dim ColDias As New DataGridViewTextBoxColumn
    ColDias.Name = "drestantes"
    ColDias.HeaderText = "Dias Restantes"
    ColDias.Width = 150
    DataGridViewValidade.Columns.Insert(4, ColDias)

    For Each row As DataGridViewRow In DataGridViewValidade.Rows
        ' 跳过新行(兼容AllowUserToAddRows设置)
        If row.IsNewRow Then Continue For
        
        ' 判断单元格值是否为空,避免类型转换异常
        If Not IsDBNull(row.Cells("ValidadeLicenca").Value) Then
            Dim expdata_v As Date = CDate(row.Cells("ValidadeLicenca").Value)
            ' 使用DateInterval.Day计算天数差,参数顺序为:起始日期、结束日期
            Dim calcdias_v As Integer = DateDiff(DateInterval.Day, Date.Now, expdata_v)
            ' 可选:处理过期情况,显示0而非负数
            row.Cells("drestantes").Value = Math.Max(calcdias_v, 0)
        Else
            ' 空日期时显示提示文本
            row.Cells("drestantes").Value = "无到期日期"
        End If
    Next

End Sub

补充说明:

  • 新增IsDBNull判断,确保空值不会中断循环,所有行都能完成计算。
  • 替换DateInterval.Year为DateInterval.Day,正确计算剩余天数。
  • 可选的Math.Max处理,避免过期日期显示负数,可根据业务需求调整。

内容的提问来源于stack exchange,提问作者code4fun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:55:20