2009-07-11 14 views
1

私の問題は以下の通りです:dataTableの操作方法は?

私はx列のオブジェクトを持ち、すべての列はy値を持っています。私は今これをExcelに持っていく必要があります。

データテーブルを簡単にエクスポートできるスニペットが見つかりました。だから私はオブジェクトをデータテーブルに持っていきます。これどうやってするの?

言語は、あなたがオブジェクトのフィールドを取得したDataTableに列を追加するためにリフレクションを使用することができますC#

+0

どのプログラミング言語:

public class MyClass { public int ID {get;set;} public string Column1 {get;set;} public DateTime Column2 {get;set;} // ... } 

、あなたがたDataTableにコピーするそれらのリストを持っていると仮定し、ここではどのようにですか? –

+0

C#.net申し訳ありません.............. – Kovu

答えて

4

私はあなたが何をしようとしているのか分かりません。私はあなたがDataTableを作成し、それに既存のオブジェクトをロードしたいと仮定します。あなたのクラスと仮定すると、このようなものになります。

DataTable dt = new DataTable("MyTable"); 
dt.Columns.Add("ID", typeof(int)); 
dt.Columns.Add("Column1", typeof(string)); 
dt.Columns.Add("Column2", typeof(DateTime)); 

foreach (var o in _myObjectList) { 
    DataRow dr = dt.NewRow(); 
    dr["ID"] = o.ID; 
    dr["Column1"] = o.Column1; 
    dr["Column2"] = o.Column2; 
    dt.Rows.Add(dr); 
} 
+0

それは良い方法ですが、まさに私の問題です。 私は最初にcoloumsを知りません。 私はx個のオブジェクトを持っています。 各オブジェクトにはyの値があります。 だから時々私は500と1000の値で2 coloumsを持っている、時々私はそれぞれが自分の価値カウントを持つことができる5 coloumsを持っています。 – Kovu

+1

これは1回のエクスポートでも、さまざまなスプレッドシートでも設定できますか? dr ["column1"]でアドレス指定する代わりに、dr [0]でアドレス指定できます。また、使用可能な列をforeachすることもできます。もしあなたがパターンを持っていれば、あなたはそれを奨励することができます。 – Spence

+1

問題を解決したい場合は、それを記述する必要があります。この情報と問題を理解するために必要なその他の情報を使用して、質問を編集してください。 –

1

です:

private bool IsNullableType(Type theType) 
{ 
    return (theType.IsGenericType && theType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))); 
} 


// Create the columns based on the data in the album info - get by reflection 
var ai = new <your object without data>; 
Type t = ai.GetType(); 

this.dataTable.TableName = t.Name; 

foreach (PropertyInfo p in t.GetProperties()) 
{ 
    var columnSpec = new DataColumn(); 
    // If nullable get the underlying type 
    Type propertyType = p.PropertyType; 
    if (IsNullableType(propertyType)) 
    { 
     var nc = new NullableConverter(propertyType); 
     propertyType = nc.UnderlyingType; 
    } 
    columnSpec.DataType = propertyType; 
    columnSpec.ColumnName = p.Name; 
    this.dataTable.Columns.Add(columnSpec); 
} 

this.dataGridView.DataSource = dataTable; 

その後、テーブルに行を追加する:

var info = new <your object with data>; 
// Add by reflection 
Type t = info.GetType(); 
var row = new object[t.GetProperties().Length]; 

int index = 0; 
foreach (PropertyInfo p in t.GetProperties()) 
{ 
    row[index++] = p.GetValue(info, null); 
} 

this.dataTable.Rows.Add(row); 
関連する問題