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

VB.NET中如何不用SQL JOIN通过DataRelation在DataGridView展示关联表数据

实现方案

假设你给DataRelation起的名字是Relation_Table1_NameID_Table2_ID,表1叫Table1,表2叫Table2,关联逻辑是表1的Name_ID关联表2的主键ID,你可以按下面两种方法二选一实现:

方法1:给表1新增计算列直接绑定(最常用)

这种方法不需要改DataGridView的列逻辑,直接新增列绑定即可:

  • 先确认你的DataRelation已经创建完成,示例代码如下(如果你已经创建可以跳过这步)
DataRelation relation = new DataRelation("Relation_Table1_NameID_Table2_ID",
    dataSet.Tables["Table2"].Columns["ID"],
    dataSet.Tables["Table1"].Columns["Name_ID"]);
dataSet.Relations.Add(relation);
  • 给表1添加表达式列,直接通过DataRelation读取关联表的Name字段值
DataColumn nameCol = new DataColumn("关联Name", typeof(string));
// 表达式固定格式:Parent(关联关系名).目标字段名
nameCol.Expression = "Parent(Relation_Table1_NameID_Table2_ID).Name";
dataSet.Tables["Table1"].Columns.Add(nameCol);

之后你只需要把DataGridView的数据源绑定到Table1,隐藏原来的Name_ID列,展示新增的关联Name列即可。

方法2:处理DataGridView的CellFormatting事件(适合需要自定义展示逻辑的场景)

如果你不想修改DataTable结构,可以用DataGridView的格式化事件动态取值:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    // 只处理Name_ID列,也可以换成你实际的Name_ID列索引判断
    if (dataGridView1.Columns[e.ColumnIndex].Name == "Name_ID" && e.RowIndex >= 0)
    {
        DataRowView rowView = dataGridView1.Rows[e.RowIndex].DataBoundItem as DataRowView;
        if (rowView != null)
        {
            // 通过DataRelation获取关联的父行
            DataRow parentRow = rowView.Row.GetParentRow("Relation_Table1_NameID_Table2_ID");
            if (parentRow != null)
            {
                e.Value = parentRow["Name"];
                e.FormattingApplied = true;
            }
        }
    }
}

绑定完数据源之后,你只需要把这个事件绑定到DataGridView的CellFormatting事件上即可生效。

注意:两种方法都要求你提前确认DataRelation的名称、两张表的字段名和你实际的命名一致,避免表达式或者获取父行时出现报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:48:04