C# EF6.4环境下父子表数据加载到DataGridView并支持排序的最简方案
方案1:手动配置DataGridView列(改动最小,实现最快)
你第一种方案的数据源本身已原生支持排序,只是DataGridView默认不会自动生成导航属性的对应列,仅需手动添加需要展示的列即可:
- 先关闭DataGridView自动生成列开关:
DataGridView1.AutoGenerateColumns = false; - 手动配置所有需要展示的列,导航属性的列直接指定
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
相关产品推荐
相关产品推荐

