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

如何在DataGridView中显示Include关联的TrainingReference表列

解决DataGridView显示关联实体TrainingReference属性的问题

你已经通过Include("TrainingReference")正确加载了关联数据,但DataGridView默认只会显示绑定对象的直接值类型属性,而TrainingReference是一个导航属性(复杂对象),所以默认只会显示它的ToString()结果,不会自动展开内部属性。下面给你两种可行的解决方案:

方法1:手动添加DataGridView列并指定关联属性路径

这种方法适合你需要保留TrainingRecord实体作为数据源(比如后续要进行编辑操作)的场景:

在OpMode.View分支中,设置完数据源之后,手动添加对应TrainingReference属性的列,关键是通过DataPropertyName指定关联属性的路径(格式为导航属性名.内部属性名):

Case OpMode.View
    EmployeeList = TrainingRecord.EmployeeList(EmployeeComboBox.SelectedValue)
    ReferencesGrid.DataSource = EmployeeList
    
    ' 隐藏不需要的列(保留你原来的代码)
    ReferencesGrid.Columns("id").Visible = False
    ReferencesGrid.Columns("referenceid").Visible = False
    ReferencesGrid.Columns("employeeid").Visible = False
    ReferencesGrid.Columns("Completed").Visible = False
    ReferencesGrid.Columns("employee").Visible = False
    ReferencesGrid.Columns("trainingreference").Visible = False ' 隐藏导航属性本身的列
    
    ' 手动添加TrainingReference的属性列(示例,替换成你实际需要的属性)
    ' 添加课程名称列
    Dim courseNameCol As New DataGridViewTextBoxColumn()
    courseNameCol.HeaderText = "课程名称"
    courseNameCol.DataPropertyName = "TrainingReference.CourseName" ' 核心:指定关联属性路径
    courseNameCol.Width = 150
    ReferencesGrid.Columns.Add(courseNameCol)
    
    ' 添加课程描述列
    Dim courseDescCol As New DataGridViewTextBoxColumn()
    courseDescCol.HeaderText = "课程描述"
    courseDescCol.DataPropertyName = "TrainingReference.Description"
    courseDescCol.Width = 200
    ReferencesGrid.Columns.Add(courseDescCol)
    
    ' 如果还有其他需要显示的TrainingReference属性,继续添加即可

注意:这里的TrainingReference.CourseName要和你实体类中的属性名完全匹配(包括大小写,虽然VB不区分,但DataGridView的DataPropertyName是严格匹配的)。

方法2:用LINQ投影成匿名类型(更简单的只读场景)

如果只是需要显示数据,不需要后续编辑TrainingRecord实体,那么可以直接通过LINQ将需要的属性(包括关联属性)投影成匿名类型,这样DataGridView会自动识别并生成列:

Case OpMode.View
    ' 获取原始数据
    Dim rawRecords = TrainingRecord.EmployeeList(EmployeeComboBox.SelectedValue)
    
    ' 投影成包含所需属性的匿名类型
    Dim displayList = rawRecords.Select(Function(r) New With {
        ' 保留TrainingRecord中需要显示的属性
        r.due_date,
        r.Status,
        ' 提取TrainingReference中的属性
        .CourseName = r.TrainingReference.CourseName,
        .CourseCategory = r.TrainingReference.Category,
        .Trainer = r.TrainingReference.Owner
    }).ToList()
    
    ' 绑定投影后的列表
    ReferencesGrid.DataSource = displayList
    
    ' 可以调整列头文本(可选)
    ReferencesGrid.Columns("due_date").HeaderText = "到期日期"
    ReferencesGrid.Columns("Status").HeaderText = "状态"

这种方法的好处是不需要手动添加列,DataGridView会自动根据匿名类型的属性生成列,而且避免了处理导航属性列的问题。

关键注意事项

  1. 确保Include("TrainingReference")确实生效:因为你用了Using context,上下文会在方法结束后释放,所以懒加载会失效,必须通过Include提前加载关联数据,这一步你已经做对了。
  2. 检查实体类属性名:确保TrainingReference的属性名和你代码中使用的一致,比如如果实体类中是CourseName,就不能写成courseName。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:58:48