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

