2017-09-22 14 views
1

Dans mon exemple, j'ai essayé d'afficher les informations pivotantes dans le contrôle Grid avec la source des éléments donnés. Dans ce cas, pour passer la source des éléments, j'ai besoin de convertir le DataTable en IList<myType> en C#.Comment convertir rapidement DataTable en IList <myType>

J'ai essayé toutes les méthodes de conversion traditionnelles, y compris le code ci-dessous pour convertir le DataTable en IList.

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

Mais les toutes les méthodes traditionnelles ne sont pas utiles pour moi car, je ne sais pas exactement quels sont les objets sont utilisés et leurs types dans les colonnes respectives DataTable. Aussi le DataTable ayant plus de nombre de colonnes et de lignes.

Par exemple, j'ai les valeurs de colonne ci-dessous dans ma table de données.

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 

Et enfin je veux faire ce qui suit pro-grammaticalement,

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

Dans mon application, j'ai plus de 10000 colonnes de données, il est donc impossible d'ajouter chaque objet à partir des données table dans la liste.J'ai besoin de passer plus de temps et de connaissances pour trouver le type de données de chaque colonne disponible dans DataTable puis de créer les propriétés en fonction de leurs types pour la classe myType.

Veuillez donc fournir un moyen optimal et rapide de convertir le DataTable en IList<myType>.

+1

Avez-vous essayé d'utiliser un ORM comme Entity Framework? – dymanoid

+0

Oui, mais ORM n'est utile que si j'ai moins d'entités. Dans le cas où j'ai plus de nombre d'entités, il est difficile de créer la classe avec trouver le type de données de chaque colonne. J'ai besoin de la méthode programmatique pour trouver le type et créer la classe efficacement. –

+0

Pouvez-vous nous expliquer pourquoi vous avez 10 000 colonnes? – mjwills

Répondre

1

S'il vous plaît essayer,

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

Exemple pour appeler,

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

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

+0

Merci. Mais mon vrai problème est de savoir comment la classe "Student" est définie en initialisant les propriétés obtenues à partir de chaque ligne de table de données.Existe-t-il un moyen pro grammatical pour définir la classe en initialisant les propriétés disponibles dans la table de données? Pour mon exemple, j'ai besoin de créer la classe "Plan" avec "PlanRowPID", "PlanRowClass", etc., pro-grammatiquement. –

1

Dans ce cas, passer la source des éléments, j'ai besoin de convertir le DataTable en IList en C#.

Tu ne peux pas mettre juste la propriété ItemsSource à la DefaultView du DataTable?

dataGrid.ItemsSource = dt.DefaultView; 

Ensuite, il n'est pas nécessaire de le convertir en liste.

DataView implémente IList.