I have a data list with some property. I want to convert that list data into data table. How to convert a list into datable.
            Asked
            
        
        
            Active
            
        
            Viewed 2.9e+01k times
        
    42
            
            
        - 
                    Could you give us information about type of objects in list? – Kirill Bestemyanov Aug 07 '13 at 10:22
3 Answers
143
            Add this function and call it, it will convert List to 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;
}
 
    
    
        Jelle
        
- 758
- 2
- 14
- 36
 
    
    
        Harshil Raval
        
- 2,115
- 1
- 13
- 10
- 
                    2
- 
                    3Suppose you have list of User.Listrm = new List – Harshil Raval Aug 07 '13 at 10:38(); And in User class there FirstName,LastName,Address etc. properties. Then to convert this list to datatable , just use this DataTable UserDt = rm.ToDataTable(); 
- 
                    1Do we need to add any namespace for this method to work? PropertyInfo[] not getting recognized. – Badhon Jain Apr 30 '14 at 05:48
- 
                    3
- 
                    1click on the classname that has a red line underneath it (as in syntax error) and press ALT+SHIFT+F10. It will show you the namespaces. Select the top one which is System.Reflection. – Shezi May 28 '14 at 06:41
- 
                    
- 
                    1above answer is giving me `Additional information: Parameter count mismatch.` – Jogi May 24 '16 at 18:42
- 
                    
- 
                    FYI, when using this method for SqlBulkCopy, you will need to specify the column mappings https://stackoverflow.com/a/23551356/1445661 – mao47 Mar 14 '18 at 17:00
- 
                    I need the function with some recursion, My Class (Say Order) has property with Object being of another class (Say Product) & that class (Products) has property being of another class (Say Dimensions) ... Current function doesn't add columns for properties of classes (Product & Dimensions) but only Orders. – Mayank Parmar Jan 20 '20 at 11:29
- 
                    @HarshilRaval I think we can't use this method like the way you mentioned because it is not an extension method. – Zeeshanef Jun 17 '21 at 11:59
- 
                    This class does not work at all. I wonder why he got so many points? Each class I give as input returns only the value NULL. – گلی Jul 28 '21 at 08:23
- 
                    For me it works if I add "this" before List. public static DataTable ToDataTable – devielu Jul 30 '21 at 10:31(this List items) 
19
            
            
        you can use this extension method and call it like this.
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;
        }
 
    
    
        Ehsan
        
- 31,833
- 6
- 56
- 65
-1
            
            
        private DataTable CreateDataTable(IList<T> item)
{
    Type type = typeof(T);
    var properties = type.GetProperties();
    DataTable dataTable = new DataTable();
    foreach (PropertyInfo info in properties)
    {
        dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
    }
    foreach (T entity in item)
    {
        object[] values = new object[properties.Length];
        for (int i = 0; i < properties.Length; i++)
        {
            values[i] = properties[i].GetValue(entity);
        }
        dataTable.Rows.Add(values);
    }
    return dataTable;
}
 
    
    
        Mohammad Ali Rony
        
- 4,695
- 3
- 19
- 33
 
    
    
        r.vengadesh
        
- 1,721
- 3
- 20
- 36
- 
                    3`ConvertListToDataTable(...);` is not known in dotnet unless you visit this page where you can find code for this method `http://social.msdn.microsoft.com/Forums/vstudio/en-US/6ffcb247-77fb-40b4-bcba-08ba377ab9db/converting-a-list- – Bellash Feb 11 '14 at 08:51
 
    