net mostrar lista convert array c# ado.net datatable

mostrar - list to dataset c#



Cómo rellenar un datatable con List<T> (3)

Esta pregunta ya tiene una respuesta aquí:

¿Cómo se puede convertir una lista a un datatable?

[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<Item> 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 un cuadro pero está vacío! ¡¡Ayuda!! ¿Qué puedo hacer para que la caja tenga datos?


En caso de que tenga una propiedad anulable en su objeto de clase:

private static DataTable ConvertToDatatable<T>(List<T> 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<Item> 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 encontrar una solución alternativa, ya que ninguna de las opciones enumeradas aquí funcionó 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<T>(this IEnumerable<T> data) { List<IDataRecord> list = data.Cast<IDataRecord>().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; }