2017-04-17 10 views
0

可変サイズのオブジェクトリスト(ここではレコード)をバインドする方法ここではFieldと呼ばれる)をDataGridViewに送り、内部リストの各Fieldオブジェクトが(Valueプロパティを介して)セルにバインドされ、外部リストの各Recordオブジェクトが行にバインドされます。 考えられるのは、各レコードオブジェクトの内部リストの項目数に基づいて、可変数の列でDataGridViewを動的に作成することです。プログラムでいっぱいに別の可変サイズのオブジェクトリストを含むオブジェクトの可変サイズのリストをC#のDataGridViewにバインドする方法

public List<Record> Records{ get; set; } 

レコードリスト:私はのようなものを持っている

public class Field 
    { 
public String Name { get; set; }   
public String Value { get; set; }   
    } 

メインプログラムで:

public class Record 
    { 
     public List<Field> Fields { get; set; } 
    } 

とFieldクラス: はここに私のレコードクラスのコードですリスト内の各レコードは、フィールドリストに同じ量のオブジェクトがあります。今度は、このデータをDataGridViewにバインドし、外部リストの各RecordオブジェクトがDataGridView内のセルであるテーブルの行として表示する方法でバインドします。 これは可能ですか?もしそうなら、どうしたらいいですか?

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

次に使用:

+0

これは、データバインディングを使用することで可能ではありません。あなたはループ 'Field''sとカラムを作成する必要があります - @ Ofirの答えを見てください。フィールドのリストの代わりにクラスを使用できない理由は何ですか? – Fabio

答えて

0

あなたは(これはあなたがすべてで最初のレコードを持っていると仮定し)の列を設定する必要があり、それらのDataGridView

まずDataGridViewRowのリストにそれを変換して追加することができますLINQはRecord

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

それぞれを変換し、最終的にはにそれらをロード:

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; 
    } 
} 
関連する問題