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

C# EF6.4环境下父子表数据加载到DataGridView并支持排序的最简方案

方案1:手动配置DataGridView列(改动最小,实现最快)

你第一种方案的数据源本身已原生支持排序,只是DataGridView默认不会自动生成导航属性的对应列,仅需手动添加需要展示的列即可:

  1. 先关闭DataGridView自动生成列开关:DataGridView1.AutoGenerateColumns = false;
  2. 手动配置所有需要展示的列,导航属性的列直接指定DataPropertyName为「关联属性名+属性字段」的路径即可:
// 配置列示例
DataGridView1.Columns.Add(new DataGridViewTextBoxColumn()
{
    Name = "BookTitle",
    HeaderText = "书籍标题",
    DataPropertyName = "Books.title"
});
DataGridView1.Columns.Add(new DataGridViewTextBoxColumn()
{
    Name = "AuthorName",
    HeaderText = "作者姓名",
    DataPropertyName = "Authors.name"
});
// 其他需要展示的idBook、idAuthor等列同理添加

// 绑定逻辑和你原本的代码完全一致,排序功能完全保留
Db.BooksAuthors.Include(x => x.Authors).Include(x => x.Books).Load();
DataGridView1.DataSource = Db.BooksAuthors.Local.ToBindingList();

该方案不需要新增任何自定义类,仅需增加几行列配置代码即可完成需求。


方案2:给关联实体加扩展属性(代码更整洁)

如果不想手动配置列,直接给你的BooksAuthors实体类加两个只读扩展属性即可:

public partial class BooksAuthors
{
    public string BookTitle => Books?.title;
    public string AuthorName => Authors?.name;
}

之后直接用你第一种方案的绑定逻辑即可,自动生成列时会识别这两个新增属性,排序功能完全不受影响。


方案3:自定义视图类适配可排序绑定

如果你确实需要使用自定义的BooksAuthorsView视图类,只需要把默认的BindingList替换为支持排序的实现即可,EF框架已原生提供对应工具类,不需要自己手写排序逻辑:

private void Show()
{
    var list = (from BA in Db.BooksAuthors
                select new BooksAuthorsView() 
                { 
                    idBook = BA.idBook, 
                    idAuthor = BA.idAuthor, 
                    BookTitle = BA.Books.title, 
                    AuthorName = BA.Authors.name 
                }).ToList();
    // 用EF内置的SortableBindingList替代默认BindingList即可支持排序
    DataGridView1.DataSource = new SortableBindingList<BooksAuthorsView>(list);
}

注:SortableBindingList属于System.Data.Entity命名空间下的原生类,无需引入第三方依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:04