如何在C#

时间:2017-04-17 17:36:18

标签: c# winforms data-binding datagridview

如何将包含另一个可变大小的对象列表(此处称为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中的一个单元格。 那可能吗?如果是这样,我该怎么办?

1 个答案:

答案 0 :(得分:0)

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

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

foreach (Field field in this.Records.First().Fields) 
{ 
    dgv.Columns.Add(field.Name, field.Name); 
}

然后使用LINQ转换每个RecordDataGridViewRow

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;
    }
}