2013-09-29 25 views
24

列表如何可以轉換到DataTable如何填寫一個數據表與表<T>

[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); 
     [email protected] = @URL; 
    } 

    public override string ToString() 
    { 
     return this.Name; 
    } 
} 

我嘗試使用:

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; 
} 

現在我得到一個箱子出現,但其空!幫幫我!!我能做些什麼來使盒子實際上有數據?

+1

你說'itemDataView'爲空。究竟是什麼,它來自哪裏?這看起來像是一個不同的問題,你轉換'List '到'DataTable' –

+0

itemDataView是由windowsform工具箱生成的 – MikaAK

+0

請清楚你的問題。你的標題說你生成'dataTable'有問題。但似乎這不是問題。你的問題是'itemDataView'。 – Muctadir

回答

18

試試這個

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; 
} 
+0

我仍然得到DataGridView爲空 – MikaAK

+0

然後你的問題不是與轉換,它與您添加到您的窗體的'DataGridView'控件。嘗試刪除它並重新添加它並將名稱更改爲有意義的名稱。 –

+0

它工作感謝!對不起,但他是我使用datagridview刪除和readd工作的代碼 – MikaAK

2

我也不得不想出了一個替代的解決方案,因爲沒有在這裏列出的選項曾在我的情況。我使用的是IEnumerable,底層數據是IEnumerable,屬性無法枚舉。這奏效了:

// 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; 
} 
32

萬一你在你的類對象可爲空的屬性:

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; 
}