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

VB.NET绑定MS Access数据到DataGridView如何显示关联表文本而非外键

问题原因

你当前仅查询了tblProduct单表的数据,获取到的Brand字段本身就是存储的外键ID值,因此绑定到DataGridView后只会显示数字ID,不会自动关联tblBrand表的文本内容。

方案1:修改SQL关联查询(最简单,无编辑需求优先选)

直接调整查询语句通过JOIN关联两张表,直接查询出品牌名称字段,不需要额外修改控件逻辑:

Public Sub LoadProductList()
    DGVProducts.DataSource = Nothing
    DGVProducts.Refresh()
    DGVProducts.RefreshEdit()
    ' 注意替换sql中tblBrand的主键字段、品牌名称字段为你实际的字段名
    cm = New OleDb.OleDbCommand("select p.*, b.BrandName as 品牌 from tblProduct p left join tblBrand b on p.Brand = b.BrandID", cn)
    da = New OleDb.OleDbDataAdapter(cm)

    Dim ds As New DataSet

    da.Fill(ds, "tblProduct")
    DGVProducts.DataSource = ds
    DGVProducts.DataMember = "tblProduct"
    ' 隐藏原有的Brand外键ID列
    DGVProducts.Columns("Brand").Visible = False
    ' 以下是你原来的表头配置逻辑,按需调整即可
    'DGVProducts.Columns(0).HeaderCell.Value = "#"
    'DGVProducts.Columns(1).HeaderCell.Value = "Barcode"
    'DGVProducts.Columns(2).HeaderCell.Value = "Alias"
    'DGVProducts.Columns(3).HeaderCell.Value = "Product Name"
    'DGVProducts.Columns("品牌").HeaderCell.Value = "Brand"
    'DGVProducts.Columns(5).HeaderCell.Value = "Category"
    'DGVProducts.Columns(6).HeaderCell.Value = "Principal"
    'DGVProducts.Columns(7).HeaderCell.Value = "UOM"
    'DGVProducts.Columns(8).HeaderCell.Value = "Re-order Qty"
    'DGVProducts.Columns(9).HeaderCell.Value = "Qty"
    cn.Close()

    DGVProducts.ClearSelection()
    DGVProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
    'DGVProducts.Columns(7).Visible = False
    'DGVProducts.Columns(8).Visible = False
End Sub

方案2:使用ComboBox列映射(适合需要编辑品牌的场景)

如果你需要在DataGridView里直接下拉选择修改品牌,就用这个方案:

Public Sub LoadProductList()
    DGVProducts.DataSource = Nothing
    DGVProducts.Refresh()
    DGVProducts.RefreshEdit()
    ' 先查询品牌表数据
    Dim brandCm As New OleDb.OleDbCommand("select BrandID, BrandName from tblBrand", cn)
    Dim brandDa As New OleDb.OleDbDataAdapter(brandCm)
    Dim brandDt As New DataTable()
    brandDa.Fill(brandDt)
    
    ' 查询产品表
    cm = New OleDb.OleDbCommand("select * from tblProduct", cn)
    da = New OleDb.OleDbDataAdapter(cm)

    Dim ds As New DataSet
    da.Fill(ds, "tblProduct")
    DGVProducts.DataSource = ds
    DGVProducts.DataMember = "tblProduct"
    
    ' 删掉自动生成的Brand列,替换成ComboBox列
    DGVProducts.Columns.Remove("Brand")
    Dim brandCol As New DataGridViewComboBoxColumn()
    brandCol.Name = "Brand"
    brandCol.HeaderText = "Brand"
    brandCol.DataSource = brandDt
    brandCol.DisplayMember = "BrandName" ' 显示的文本字段
    brandCol.ValueMember = "BrandID" ' 对应的值字段
    brandCol.DataPropertyName = "Brand" ' 绑定产品表的外键字段
    DGVProducts.Columns.Insert(4, brandCol) ' 插入到原来Brand列的位置
    
    ' 原来的表头配置逻辑按需保留
    cn.Close()

    DGVProducts.ClearSelection()
    DGVProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
End Sub

注意:以上代码中出现的BrandID、BrandName均为示例字段名,需要替换成你tblBrand表中实际对应的主键字段名、品牌名称字段名。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:42:03