如何将列表转换为数据表

时间:2013-08-07 10:19:04

标签: c# asp.net

我有一些属性的数据列表。我想将列表数据转换为数据表。如何将列表转换为datable。

3 个答案:

答案 0 :(得分:119)

只需添加此功能并调用它,它就会将 List转换为DataTable

public static DataTable ToDataTable<T>(List<T> items)
{
        DataTable dataTable = new DataTable(typeof(T).Name);

        //Get all the properties
        PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo prop in Props)
        {
            //Defining type of data column gives proper data table 
            var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType);
            //Setting column names as Property names
            dataTable.Columns.Add(prop.Name, type);
        }
        foreach (T item in items)
        {
           var values = new object[Props.Length];
           for (int i = 0; i < Props.Length; i++)
           {
                //inserting property values to datatable rows
                values[i] = Props[i].GetValue(item, null);
           }
           dataTable.Rows.Add(values);
      }
      //put a breakpoint here and check datatable
      return dataTable;
}

答案 1 :(得分:12)

您可以使用此扩展方法并像这样调用它。

DataTable dt =   YourList.ToDataTable();

public static DataTable ToDataTable<T>(this List<T> iList)
        {
            DataTable dataTable = new DataTable();
            PropertyDescriptorCollection propertyDescriptorCollection =
                TypeDescriptor.GetProperties(typeof(T));
            for (int i = 0; i < propertyDescriptorCollection.Count; i++)
            {
                PropertyDescriptor propertyDescriptor = propertyDescriptorCollection[i];
                Type type = propertyDescriptor.PropertyType;

                if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
                    type = Nullable.GetUnderlyingType(type);


                dataTable.Columns.Add(propertyDescriptor.Name, type);
            }
            object[] values = new object[propertyDescriptorCollection.Count];
            foreach (T iListItem in iList)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    values[i] = propertyDescriptorCollection[i].GetValue(iListItem);
                }
                dataTable.Rows.Add(values);
            }
            return dataTable;
        }

答案 2 :(得分:-2)

static DataTable ConvertListToDataTable(List<string[]> list)
{
    // New table.
    DataTable table = new DataTable();
    // Get max columns.
    int columns = 0;
    foreach (var array in list)
    {
        if (array.Length > columns)
        {
            columns = array.Length;
        }
    }
    // Add columns.
    for (int i = 0; i < columns; i++)
    {
        table.Columns.Add();
    }
    // Add rows.
    foreach (var array in list)
    {
        table.Rows.Add(array);
    }
    return table;
}

protected void Button1_Click(object sender, EventArgs e)
{  
    List<string[]> list = new List<string[]>();
    list.Add(new string[] { "Column 1", "Column 2", "Column 3" });
    list.Add(new string[] { "Row 2", "Row 2" });
    list.Add(new string[] { "Row 3" });

    // Convert to DataTable.
    DataTable table = ConvertListToDataTable(list);
    dataGridView1.DataSource = table;
}

试试这个