将数据从父表和子表加载到 DataGridView 的最简单方法,可以进行排序

Posted

技术标签:

【中文标题】将数据从父表和子表加载到 DataGridView 的最简单方法,可以进行排序【英文标题】:Simplest way to load data to DataGridView from parent and child table with possibility of sorting 【发布时间】:2022-01-06 14:43:44 【问题描述】:

我使用 C# 和 EF 6.4,我正在为我的问题寻找干净且简单的解决方案。 我有这样的简单基础:

我想将数据加载到 DataGridView 看起来像这样:

我尝试了以下解决方案:

1

//sorting working, but doesn`t show columns "name" and "title" 
Db.BooksAuthors.Include(x => x.Authors).Load();
DataGridView1.DataSource = Db.BooksAuthors.Local.ToBindingList;

2

//sorting not working, but shows columns "name" and "title" 
public class BooksAuthorsView

    public Int32 idBook  get; set; 
    public Int32 idAuthor  get; set; 
    public string BookTitle  get; set; 
    public string AuthorName  get; set; 

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 );
    DataGridView1.DataSource = new BindingSource()  DataSource = new BindingList<BooksAuthorsView>(list.ToList) ;

编辑: 我检查了这个solution。它有效,但它是最简单的解决方案吗?

【问题讨论】:

还要编辑/保存?还是只读的? 很好奇你是如何在不把 () 放在最后的情况下调用方法的;这段代码是从VB转换过来的吗? 我本来希望像 DataGridView1.DataSource = Db.BooksAuthors.Select(BA =&gt; new BooksAuthorsView() idBook = BA.idBook, idAuthor = BA.idAuthor, BookTitle = BA.Books.title, AuthorName = BA.Authors.name ).ToList() 这样的东西可以正常工作,tbh @Caius Jard 我只需要只读。是的,它是从VB转换而来的 【参考方案1】:

如果想通过点击列标题进行排序,可以参考以下代码:

public DataTable dvtodt(DataGridView dv)
    
        DataTable dt = new DataTable();
        DataColumn dc;
        for (int i = 0; i < dv.Columns.Count; i++)
        
            dc = new DataColumn();
            dc.ColumnName = dv.Columns[i].HeaderText.ToString();
            dt.Columns.Add(dc);
        
        for (int j = 0; j < dv.Rows.Count; j++)
        
            DataRow dr = dt.NewRow();
            for (int x = 0; x < dv.Columns.Count; x++)
            
                dr[x] = dv.Rows[j].Cells[x].Value;
            
            dt.Rows.Add(dr);
        
        return dt;
    

private int SortOrder_ = 0;

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    
        
        int nColumnIndex = e.ColumnIndex;
        DataTable d = dvtodt(dataGridView1);
        if (SortOrder_ == 0)
        
            d.DefaultView.Sort = this.dataGridView1.Columns[nColumnIndex].Name + " ASC";
            SortOrder_ = 1;
        
        else if (SortOrder_ == 1)
        
            d.DefaultView.Sort = this.dataGridView1.Columns[nColumnIndex].Name + " desc"; 
            SortOrder_ = 0;
        
        dataGridView1.Columns.Clear();
        dataGridView1.DataSource = d;
    

【讨论】:

谢谢。但排序不起作用。当我点击标题栏时,什么也没有发生。 @CzarnyLewis,我编辑了我的答案。如果您有任何问题,请告诉我。

以上是关于将数据从父表和子表加载到 DataGridView 的最简单方法,可以进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何将父表和子表数据移动到存档表(具有相同的列)

什么是数据库中的父表和子表?

什么是父表和子表

需要来自 Oracle SQL 查询的父表和子表的 XML

Laravel:使用同步或 updateOrCreate 更新父表和子表?

oracle中建父表和子表的语句是啥?