You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C# WinForms中用Entity Framework在DataGridView显示外键值

在C# WinForms中用Entity Framework在DataGridView显示外键关联值

我来帮你搞定这个问题!在WinForms里用EF把外键对应的关联值显示在DataGridView里其实很简单,分几步就能实现:

1. 先确认EF模型的关联关系没问题

首先得保证你的实体类里已经配置好导航属性,这样EF才能识别两张表的关联。比如你的实体应该是这样的:

public class Customer
{
    public int Id { get; set; }
    public string CustomerName { get; set; }
    // 这里是customer表的其他字段
    public int CustomerTypeId { get; set; } // 外键字段
    public CustomerType CustomerType { get; set; } // 关联CustomerType的导航属性
}

public class CustomerType
{
    public int Id { get; set; }
    public string TypeName { get; set; } // 这就是你要显示的外键对应值,比如"个人客户"、"企业客户"
    // customer_type表的其他字段
    public ICollection<Customer> Customers { get; set; }
}

如果是数据库优先生成的模型,记得检查EDMX里有没有自动生成这个导航属性;如果是代码优先,要确保外键关系配置正确。

2. 修改GetCustomers方法,加载关联数据

你原来的方法只查了Customer表,但EF默认不会自动加载关联的CustomerType数据,所以得用Include方法把关联数据一起查出来。修改后的方法如下:

public List<Customer> GetCustomers()
{
    using (var db = new Vehicle_Management_SystemEntities())
    {
        // 用Include加载关联的CustomerType,这样每个Customer对象里才有对应的类型数据
        return db.Customers.Include(c => c.CustomerType).ToList();
    }
}

注意要引用System.Data.Entity命名空间(EF6),如果是EF Core的话引用Microsoft.EntityFrameworkCore就行。

3. 绑定DataGridView并配置显示列

这里有两种常用方式,推荐第一种,更可控:

方式一:手动添加列(推荐)

在WinForms设计器里打开你的DataGridView,手动添加需要显示的列:

  • 比如添加一个列,DataPropertyName设为Id,HeaderText设为"客户ID"
  • 再添加一个列,DataPropertyName设为CustomerName,HeaderText设为"客户名称"
  • 关键的外键列:添加一个列,DataPropertyName设为CustomerType.TypeName,HeaderText设为"客户类型"

然后在窗体加载事件里绑定数据:

private void YourForm_Load(object sender, EventArgs e)
{
    // 实例化你的数据服务类
    var customerRepo = new YourCustomerRepository();
    var customers = customerRepo.GetCustomers();
    // 绑定到DataGridView
    dataGridView1.DataSource = customers;
}

这样绑定后,DataGridView会自动把CustomerType的TypeName显示出来。

方式二:自动生成列后调整

如果你开启了DataGridView的自动生成列,可以在DataBindingComplete事件里调整显示:

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    // 隐藏不需要的外键ID列
    if (dataGridView1.Columns["CustomerTypeId"] != null)
    {
        dataGridView1.Columns["CustomerTypeId"].Visible = false;
    }
    // 把自动生成的CustomerType列改成显示TypeName
    if (dataGridView1.Columns["CustomerType"] != null)
    {
        dataGridView1.Columns["CustomerType"].HeaderText = "客户类型";
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.DataBoundItem is Customer customer)
            {
                // 注意判空,避免空引用
                row.Cells["CustomerType"].Value = customer.CustomerType?.TypeName;
            }
        }
    }
}

不过这种方式不如手动添加列灵活,适合快速测试。

几个要注意的点

  • 一定要用Include加载关联数据,不然CustomerType会是null,显示为空;
  • 替换代码里的字段名(比如TypeName)成你实际数据库里的字段名;
  • 如果用EF Core,Include的用法和EF6基本一致,只是命名空间不同。

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

火山引擎 最新活动