C# 如何将包含另一个可变大小对象列表的可变大小对象列表绑定到C中的DataGridView#

C# 如何将包含另一个可变大小对象列表的可变大小对象列表绑定到C中的DataGridView#,c#,winforms,data-binding,datagridview,C#,Winforms,Data Binding,Datagridview,如何将包含另一个可变大小对象列表(此处称为字段)的可变大小对象列表(此处称为记录)绑定到DataGridView,方法是内部列表中的每个字段对象绑定到一个单元格(通过值属性),外部列表中的每个记录对象绑定到一行。 其思想是根据每个记录对象的内部列表中的项数,动态生成具有可变列数的DataGridView。 以下是我的Record类代码: public class Record { public List<Field> Fields { get; set; }

如何将包含另一个可变大小对象列表(此处称为字段)的可变大小对象列表(此处称为记录)绑定到DataGridView,方法是内部列表中的每个字段对象绑定到一个单元格(通过值属性),外部列表中的每个记录对象绑定到一行。 其思想是根据每个记录对象的内部列表中的项数,动态生成具有可变列数的DataGridView。 以下是我的Record类代码:

public class Record
    {
        public List<Field> Fields { get; set; }
    }
在主程序中,我有如下内容:

    public List<Record> Records{ get; set; }
公共列表记录{get;set;}
记录列表以编程方式填充,并且列表中的每个记录在其字段列表中具有相同数量的对象。现在,我想将此数据绑定到DataGridView,使外部列表中的每个记录对象在表中显示为一行,其中每个字段都是DataGridView中的一个单元格。
可能吗?如果是,我怎么做

您可以将其转换为
DataGridViewRow
列表,并将其添加到
DataGridView

首先,您需要设置列(假设您有第一条记录):

然后使用LINQ将每个
记录
转换为
DataGridViewRow

IEnumerable<DataGridViewRow> rows = this.Records.Select(rec =>
{
    var row = new DataGridViewRow();
    row.SetValues(rec.Fields.Select(field => field.Value));
    return row;
});

如果要使用
数据源
,则必须从中创建一个
数据表。
您可以创建和扩展方法,并按如下方式使用它:

dgv.DataSource = this.Records.ToDataTable();
扩展类:

public static class RecordListExtensions
{
    public static DataTable ToDataTable(this List<Record> records)
    {
        DataTable table = new DataTable();
        foreach (var field in records.First().Fields) { table.Columns.Add(field.Name); }

        foreach (var record in records)
        {
            table.Rows.Add(record.Fields.Select(field => field.Value).ToArray());
        }

        return table;
    }
}
公共静态类RecordListExtensions
{
公共静态数据表ToDataTable(此列表记录)
{
DataTable=新的DataTable();
foreach(records.First().Fields中的var字段){table.Columns.Add(field.Name);}
foreach(记录中的var记录)
{
table.Rows.Add(record.Fields.Select(field=>field.Value.ToArray());
}
返回表;
}
}

使用数据绑定无法做到这一点。您需要循环
字段
,并创建列-请参阅@Ofir的答案。您不能使用类而不是字段列表的原因是什么?
dgv.Rows.Add(rows);
dgv.DataSource = this.Records.ToDataTable();
public static class RecordListExtensions
{
    public static DataTable ToDataTable(this List<Record> records)
    {
        DataTable table = new DataTable();
        foreach (var field in records.First().Fields) { table.Columns.Add(field.Name); }

        foreach (var record in records)
        {
            table.Rows.Add(record.Fields.Select(field => field.Value).ToArray());
        }

        return table;
    }
}