2013-09-29 14 views
24

Jak można przekonwertować listę do DataTableJak wypełnić DataTable z listy <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; 
    } 
} 

Próbowałem za pomocą:

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

Teraz dostaję pudełko pokazać się, ale jego pusty! Wsparcie!! Co mogę zrobić, aby pudełko rzeczywiście zawierało dane?

+1

można powiedzieć, że 'itemDataView' jest null. Czym dokładnie jest i skąd pochodzi? Wygląda to na inny problem związany z konwersją elementu 'List ' do elementu 'DataTable' –

+0

itemDataView, który został wygenerowany przez zestaw narzędzi Windowsform – MikaAK

+0

Proszę, wyjaśnij swój problem. Twój tytuł mówi, że masz problem z wygenerowaniem 'dataTable'. Ale wydaje się, że to w ogóle nie jest problemem. Twój problem dotyczy 'itemDataView'. – Muctadir

Odpowiedz

18

Spróbuj

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

Ciągle dostaję, że DataGridView ma wartość null – MikaAK

+0

Wtedy twój problem nie jest związany z konwersją, ale z formantem 'DataGridView' dodanym do twojego formularza. Spróbuj usunąć i ponownie dodać i zmienić nazwę na coś znaczącego. –

+0

I TO DZIAŁA THANKYOU !! przepraszam, ale jego jest kod i użyłem datagridview usunąć i przeczytać pracował – MikaAK

2

miałem też wymyślić alternatywne rozwiązania, ponieważ żadna z wymienionych opcji tutaj pracował w moim przypadku. Używałem IEnumerable, a dane bazowe były IEnumerable i właściwości nie można było wyliczyć. To załatwiło sprawę:

// 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

Tylko w przypadku, gdy mają właściwość zerowalne w swoim obiektu klasy:

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; 
} 
Powiązane problemy