VB.NET DataGridView统计跨两日含两种不同状态的ID数量
解决方案
核心逻辑说明
要统计昨日和今日均有记录且两天状态不同的ID数量,需先筛选日期范围内的有效行,再按ID分组,最后验证分组内的记录是否满足「跨日期状态不同」的条件。
完整代码示例
' 定义昨日和今日的日期边界 Dim today As Date = Date.Today Dim yesterday As Date = today.AddDays(-1) ' 筛选并统计符合条件的ID Dim validIds = From row In DataGridView3.Rows.Cast(Of DataGridViewRow)() Where Not row.IsNewRow _ AndAlso row.Cells("Status").Value IsNot DBNull.Value _ AndAlso row.Cells("Date").Value IsNot DBNull.Value _ AndAlso row.Cells("ID").Value IsNot DBNull.Value Let status = CStr(row.Cells("Status").Value) Let recordDate = CDate(row.Cells("Date").Value) ' 仅保留昨日和今日的记录 Where recordDate = yesterday OrElse recordDate = today ' 按ID分组 Group By id = CStr(row.Cells("ID").Value) Into g = Group ' 验证分组条件:同时存在昨日、今日记录,且两天状态不同 Where g.Any(Function(r) CDate(r.Cells("Date").Value) = yesterday) _ AndAlso g.Any(Function(r) CDate(r.Cells("Date").Value) = today) _ AndAlso g.First(Function(r) CDate(r.Cells("Date").Value) = yesterday).Cells("Status").Value <> _ g.First(Function(r) CDate(r.Cells("Date").Value) = today).Cells("Status").Value Select id ' 获取符合条件的ID数量 Dim targetCount = validIds.Count() ' 若需要具体ID数组,可使用: ' Dim targetIdsArray = validIds.ToArray()
代码细节说明
- 有效行过滤:排除DataGridView的新增空白行,同时确保Status、Date、ID列无空值,避免类型转换报错。
- 日期范围筛选:精准锁定昨日和今日的记录,缩小处理范围。
- 分组验证:按ID分组后,检查每个分组是否同时包含两天的记录,且两天的Status值不相等。
- 结果输出:通过
Count()直接得到符合条件的ID数量,或用ToArray()获取具体ID列表。
对原有代码的修正点
- 补充了明确的昨日/今日日期判断,解决原代码未锁定日期范围的问题。
- 用分组逻辑替代混乱的嵌套查询,关联同一ID的跨日期记录。
- 完善了空值和新行的判断,避免运行时异常。
内容的提问来源于stack exchange,提问作者AndyN
相关产品推荐
相关产品推荐

