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
相关产品推荐
相关产品推荐

