如何使用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; }