如何使用List 填充数据表
如何将列表转换为数据表
[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; } }
我试过用:
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; }
现在我得到一个盒子出现,但它是空的! 救命!! 我该怎么做才能使盒子实际上有数据?
万一你的类对象中有一个可为空的属性:
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; }
试试这个
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; }
我还必须提出一个替代解决方案,因为这里列出的选项都不适用于我的情况。 我使用的是IEnumerable,底层数据是IEnumerable,无法枚举属性。 这样就可以了:
// 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; }