2017-09-22 4 views
1

サンプルでは、​​グリッドコントロールのピボット情報を指定したアイテムのソースで表示しようとしました。この場合、アイテムのソースを渡すために、DataTableをC#のIList<myType>に変換する必要があります。DataTableをIListにすばやく変換するには<myType>

DataTableIListに変換するために、以下のコードを含む従来の変換方法をすべて試しました。

dt.AsEnumerable().Cast<object>().ToList() 

しかし、すべての伝統的な方法は、私は正確にそれぞれの列に使用されているオブジェクトとそのタイプがDataTableにあるかわからない、ので、私のために有用ではありません。 DataTableには、より多くの列数と行数があります。

たとえば、データテーブルに次の列の値があります。

PlanRowPID,PlanRowClass,PlanRowVendor,PlanRowColor 
PID 0,CLASS 8,VENDOR A,COLOR D 
PID 1,CLASS 7,VENDOR B,COLOR C 
PID 2,CLASS 9,VENDOR C,COLOR B 
PID 3,CLASS 6,VENDOR D,COLOR B 

そして最後に私がやりたい、次のプロ文法的に、データから、それぞれ、すべてのオブジェクトを追加することはできませんので、私は、10000のを超えるデータ列を持っている私のアプリケーションで

IList<myType> list = new IList<myType>; 
list.Add(new myType() {PlanRowPID = "PID 0",PlanRowClass = "CLASS 8",PlanRowVendor = "VENDOR A",PlanRowColor=COLOR D}); 
list.Add(new myType() {PlanRowPID = "PID 1",PlanRowClass = "CLASS 7",PlanRowVendor = "VENDOR B",PlanRowColor=COLOR C}); 
list.Add(new myType() {PlanRowPID = "PID 2",PlanRowClass = "CLASS 9",PlanRowVendor = "VENDOR C",PlanRowColor=COLOR B}); 

各列のデータ型をDataTableで見つけて、myTypeクラスの型に基づいてプロパティを作成するために、より多くの時間と知識を費やす必要があります。

DataTableIList<myType>に変換する最適かつ迅速な方法を指定してください。

+1

Entity FrameworkのようなORMを使用しようとしましたか? – dymanoid

+0

はい、ORMは、エンティティの数が少ない場合にのみ役立ちます。多くのエンティティがある場合は、各列のデータ型を検索してクラスを作成するのは難しいです。タイプを見つけてクラスを効率的に作成するためのプログラム的な方法が必要です。 –

+0

10,000カラムがある理由をお聞かせください。 – mjwills

答えて

1

てみてください、

private static List<T> ConvertDataTable<T>(DataTable dt) 
{ 
    List<T> data = new List<T>(); 
    foreach (DataRow row in dt.Rows) 
    { 
     T item = GetItem<T>(row); 
     data.Add(item); 
    } 
    return data; 
} 

private static T GetItem<T>(DataRow dr) 
{ 
    Type temp = typeof(T); 
    T obj = Activator.CreateInstance<T>(); 

    foreach (DataColumn column in dr.Table.Columns) 
    { 
     foreach (PropertyInfo pro in temp.GetProperties()) 
     { 
      if (pro.Name == column.ColumnName) 
       pro.SetValue(obj, dr[column.ColumnName], null); 
      else 
       continue; 
     } 
    } 
    return obj; 
} 

例を呼び出すために、

List<Student> studentDetails = new List<Student>(); 
studentDetails = ConvertDataTable<Student>(dt); 

出典: - http://www.c-sharpcorner.com/UploadFile/ee01e6/different-way-to-convert-datatable-to-list/

+0

ありがとうございます。しかし、私の実際の問題は、各データテーブルの行から得られたプロパティを初期化してクラス "Student"を定義する方法です。データテーブルで利用可能なプロパティを初期化して、定義されたクラスのためのプロ文法が存在するか?私の例では、プログラミカルに "PlanRowPID"、 "PlanRowClass"などのクラス "Plan"を作成する必要があります。 –

1

この場合、項目ソースを渡すために、私はDataTableを変換する必要がありますC#ではIListになります。

は、あなただけのDataTableDefaultViewからItemsSourceプロパティを設定することができませんか?

dataGrid.ItemsSource = dt.DefaultView; 

次に、リストに変換する必要はありません。

DataViewIListを実装します。

関連する問題