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

VB.NET中用Dapper结合MS-Access修改DataGridView的WRH值方案咨询

解决方案

针对你的需求,这里提供三个可行的实现方案,优先推荐数据库查询层面替换,因为性能最优,适配10万条数据的场景:

方案1:SQL查询时直接完成映射(推荐)

利用Access支持的IIF函数,在查询阶段就完成WRH值的替换,同时过滤掉不符合条件的记录(比如004),返回的实体可直接绑定到DataGridView,无需额外处理。

修改GetUsers函数的SQL语句:

Function GetUsers(constr As String) As IEnumerable(Of Users)
    Using con As OleDbConnection = New OleDbConnection(constr)
        ' 使用IIF嵌套实现映射,同时过滤目标WRH值
        Dim sql = "SELECT 
                    Id, 
                    Firstname, 
                    LastName, 
                    IIF(WRH='001','A',IIF(WRH='002','B',IIF(WRH='003','C',WRH))) AS WRH 
                   From Users 
                   Where WRH In ('001','002','003')"
        Return con.Query(Of Users)(sql)
    End Using
End Function

Form1_Load和Users类无需修改,绑定后DataGridView会直接显示映射后的WRH值,同时自动排除WRH=004的记录,完全匹配你的期望结果。

方案2:实体类添加计算属性/数据转换

如果不想修改SQL,可以在数据加载后完成映射,或者给实体类添加只读计算属性用于显示:

方式A:修改实体类添加计算属性

Public Class Users
    Public Property Id() As Integer
    Public Property Firstname() As String
    Public Property LastName() As String
    Public Property WRH() As String

    ' 计算属性,返回映射后的显示值
    Public ReadOnly Property DisplayWRH As String
        Get
            Return WRH switch
                Case "001" : "A"
                Case "002" : "B"
                Case "003" : "C"
                Case Else : WRH
            End Switch
        End Get
    End Property
End Class

之后只需将DataGridView的WRH列绑定到DisplayWRH属性,隐藏原WRH列即可。

方式B:加载数据时转换为匿名类

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim allUsers = GetUsers(constrA).Union(GetUsers(constrB)).Union(GetUsers(constrC)).ToList()
    ' 转换为包含映射后WRH的匿名类
    Dim displayData = allUsers.Select(Function(u) New With {
        u.Firstname,
        u.LastName,
        .WRH = u.WRH switch
            Case "001" : "A"
            Case "002" : "B"
            Case "003" : "C"
            Case Else : u.WRH
        End Switch
    }).ToList()
    DataGridView1.DataSource = displayData
End Sub

这种方式适合需要保留原始WRH值做后续操作的场景,一次性转换的性能表现稳定。

方案3:DataGridView单元格格式化事件处理

在UI层通过CellFormatting事件动态替换显示值,无需修改数据层代码:

添加DataGridView的CellFormatting事件处理:

Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    ' 判断当前列是WRH列
    If DataGridView1.Columns(e.ColumnIndex).Name = "WRH" AndAlso e.Value IsNot Nothing Then
        Dim wrhValue = e.Value.ToString()
        e.Value = wrhValue switch
            Case "001" : "A"
            Case "002" : "B"
            Case "003" : "C"
            Case Else : e.Value
        End Switch
        ' 标记格式化完成,避免重复处理
        e.FormattingApplied = True
    End If
End Sub

注意:10万条数据量下,频繁触发单元格格式化可能会影响界面加载速度,适合数据量较小或无法修改数据层的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:24:54