2013-08-07 26 views

Odpowiedz

96

Wystarczy dodać tę funkcję i nazywają to będzie konwertować List do DataTable.

public static DataTable ToDataTable<T>(List<T> items) 
{ 
     DataTable dataTable = new DataTable(typeof(T).Name); 

     //Get all the properties 
     PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
     foreach (PropertyInfo prop in Props) 
     { 
      //Defining type of data column gives proper data table 
      var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType); 
      //Setting column names as Property names 
      dataTable.Columns.Add(prop.Name, type); 
     } 
     foreach (T item in items) 
     { 
      var values = new object[Props.Length]; 
      for (int i = 0; i < Props.Length; i++) 
      { 
       //inserting property values to datatable rows 
       values[i] = Props[i].GetValue(item, null); 
      } 
      dataTable.Rows.Add(values); 
     } 
     //put a breakpoint here and check datatable 
     return dataTable; 
} 
+1

jak wywołać tę funkcję. Podziękowania za odpowiedź – user2660267

+3

Załóżmy, że masz listę User.List rm = new List (); I w klasie User tam właściwości FirstName, LastName, Address itp. Następnie, aby przekonwertować tę listę do datatable, po prostu użyj tej DataTable UserDt = rm.ToDataTable(); –

+1

Czy potrzebujemy dodać dowolny obszar nazw, aby ta metoda działała? PropertyInfo [] nie zostanie rozpoznany. –

7

możesz użyć tej metody rozszerzenia i wywołać ją w ten sposób.

DataTable dt = YourList.ToDataTable(); 

public static DataTable ToDataTable<T>(this List<T> iList) 
     { 
      DataTable dataTable = new DataTable(); 
      PropertyDescriptorCollection propertyDescriptorCollection = 
       TypeDescriptor.GetProperties(typeof(T)); 
      for (int i = 0; i < propertyDescriptorCollection.Count; i++) 
      { 
       PropertyDescriptor propertyDescriptor = propertyDescriptorCollection[i]; 
       Type type = propertyDescriptor.PropertyType; 

       if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 
        type = Nullable.GetUnderlyingType(type); 


       dataTable.Columns.Add(propertyDescriptor.Name, type); 
      } 
      object[] values = new object[propertyDescriptorCollection.Count]; 
      foreach (T iListItem in iList) 
      { 
       for (int i = 0; i < values.Length; i++) 
       { 
        values[i] = propertyDescriptorCollection[i].GetValue(iListItem); 
       } 
       dataTable.Rows.Add(values); 
      } 
      return dataTable; 
     } 
+0

Dokładnie tego, czego szukałem! –

+0

To daje mi wartości liczbowe dla typu 'List'' string'. – Jogi

-1
static DataTable ConvertListToDataTable(List<string[]> list) 
{ 
    // New table. 
    DataTable table = new DataTable(); 
    // Get max columns. 
    int columns = 0; 
    foreach (var array in list) 
    { 
     if (array.Length > columns) 
     { 
      columns = array.Length; 
     } 
    } 
    // Add columns. 
    for (int i = 0; i < columns; i++) 
    { 
     table.Columns.Add(); 
    } 
    // Add rows. 
    foreach (var array in list) 
    { 
     table.Rows.Add(array); 
    } 
    return table; 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    List<string[]> list = new List<string[]>(); 
    list.Add(new string[] { "Column 1", "Column 2", "Column 3" }); 
    list.Add(new string[] { "Row 2", "Row 2" }); 
    list.Add(new string[] { "Row 3" }); 

    // Convert to DataTable. 
    DataTable table = ConvertListToDataTable(list); 
    dataGridView1.DataSource = table; 
} 

Spróbuj

+2

'ConvertListToDataTable (...);' nie jest znany w dotnet, chyba że odwiedzasz tę stronę, gdzie możesz znaleźć kod tej metody 'http://social.msdn.microsoft.com/Forums/vstudio/en-US/6ffcb247 -77fb-40b4-bcba-08ba377ab9db/conversion-a-list- – Bellash

Powiązane problemy