Cómo llenar una tabla de datos con List

Cómo se puede convertir una lista en una tabla de datos

[Serializable] public class Item { public string Name { get; set; } public double Price { get; set; } public string @URL { get; set; } public Item(string Name, string Price, string @URL) { this.Name = Name; this.Price = Convert.ToDouble(Price); this.@URL = @URL; } public override string ToString() { return this.Name; } } 

Intenté usar:

 static DataTable ConvertToDatatable(List list) { DataTable dt = new DataTable(); dt.Columns.Add("Name"); dt.Columns.Add("Price"); dt.Columns.Add("URL"); foreach (var item in list) { dt.Rows.Add(item.Name, Convert.ToString(item.Price), item.URL); } return dt; } 

¡Ahora me aparece una caja pero está vacía! ¡¡Ayuda!! ¿Qué puedo hacer para que la caja tenga datos?

En caso de que tengas una propiedad que admite valores NULL en tu clase:

 private static DataTable ConvertToDatatable(List data) { PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); DataTable table = new DataTable(); for (int i = 0; i < props.Count; i++) { PropertyDescriptor prop = props[i]; if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) table.Columns.Add(prop.Name, prop.PropertyType.GetGenericArguments()[0]); else table.Columns.Add(prop.Name, prop.PropertyType); } object[] values = new object[props.Count]; foreach (T item in data) { for (int i = 0; i < values.Length; i++) { values[i] = props[i].GetValue(item); } table.Rows.Add(values); } return table; } 

Prueba esto

 static DataTable ConvertToDatatable(List list) { DataTable dt = new DataTable(); dt.Columns.Add("Name"); dt.Columns.Add("Price"); dt.Columns.Add("URL"); foreach (var item in list) { var row = dt.NewRow(); row["Name"] = item.Name; row["Price"] = Convert.ToString(item.Price); row["URL"] = item.URL; dt.Rows.Add(row); } return dt; } 

También tuve que buscar una solución alternativa, ya que ninguna de las opciones enumeradas aquí funcionaba en mi caso. Estaba usando un IEnumerable y los datos subyacentes eran un IEnumerable y las propiedades no se podían enumerar. Esto hizo el truco:

 // remove "this" if not on C# 3.0 / .NET 3.5 public static DataTable ConvertToDataTable(this IEnumerable data) { List list = data.Cast().ToList(); PropertyDescriptorCollection props = null; DataTable table = new DataTable(); if (list != null && list.Count > 0) { props = TypeDescriptor.GetProperties(list[0]); for (int i = 0; i < props.Count; i++) { PropertyDescriptor prop = props[i]; table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); } } if (props != null) { object[] values = new object[props.Count]; foreach (T item in data) { for (int i = 0; i < values.Length; i++) { values[i] = props[i].GetValue(item) ?? DBNull.Value; } table.Rows.Add(values); } } return table; }