2013-08-07 3 views

ответ

96

Просто добавьте эту функцию и вызвать его, он будет конвертировать список для 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

как назвать эту функцию. Спасибо за ответ – user2660267

+3

Предположим, у вас есть список User.List rm = new Список (); А в классе User есть свойства FirstName, LastName, Address и т. Д. Затем, чтобы преобразовать этот список в datatable, просто используйте этот DataTable UserDt = rm.ToDataTable(); –

+1

Нужно ли добавлять пространство имен для работы этого метода? PropertyInfo [] не распознается. –

7

вы можете использовать этот метод расширения и называть его следующим образом.

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

Именно то, что я искал! –

+0

Это дает мне числовые значения для '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; 
} 

Попробуйте

+2

'ConvertListToDataTable (...);' не известно в dotnet, если вы не заходите на эту страницу, где вы можете найти код для этого метода 'http://social.msdn.microsoft.com/Forums/vstudio/en-US/6ffcb247 -77fb-40b4-bcba-08ba377ab9db/превращающего а-list- – Bellash

Смежные вопросы