如何将包含另一个可变大小的对象列表(此处称为Field)的可变大小的对象列表(此处称为Record)绑定到DataGridView,其方式是内部列表中的每个Field对象都绑定到一个单元格(通过Value属性)并且外部列表中的每个Record对象都绑定到一行。 我们的想法是根据每个Record对象的内部列表中的项目数,使用可变数量的列动态生成DataGridView。 这是我的Record类代码:
public class Record
{
public List<Field> Fields { get; set; }
}
和Field类:
public class Field
{
public String Name { get; set; }
public String Value { get; set; }
}
在主程序中我有类似的东西:
public List<Record> Records{ get; set; }
记录列表以编程方式填充,列表中的每个记录在其“字段”列表中具有相同数量的对象。现在,我希望将这些数据绑定到DataGridView,使外部列表中的每个Record对象显示为表中的一行,其中每个Fields都是DataGridView中的一个单元格。 那可能吗?如果是这样,我该怎么办?
答案 0 :(得分:0)
您可以将其转换为DataGridViewRow
列表,并添加DataGridView
首先你需要设置列(假设你有第一条记录):
foreach (Field field in this.Records.First().Fields)
{
dgv.Columns.Add(field.Name, field.Name);
}
然后使用LINQ转换每个Record
到DataGridViewRow
IEnumerable<DataGridViewRow> rows = this.Records.Select(rec =>
{
var row = new DataGridViewRow();
row.SetValues(rec.Fields.Select(field => field.Value));
return row;
});
最后将它们加载到DataGridView
:
dgv.Rows.Add(rows);
如果您想使用DataSource
,则必须从中创建DataTable
您可以创建和扩展方法并使用它:
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;
}
}