首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将“system.collections.generic.list”转换为“system.data.datatable”

如何将“system.collections.generic.list”转换为“system.data.datatable”
EN

Stack Overflow用户
提问于 2017-12-25 05:28:07
回答 4查看 7.5K关注 0票数 3

这里,我试图将用户列表uow.Repository<User>().GetAll().ToList();绑定到DataTable dt,但有一个错误,即不能将“system.collections.generic.list”类型转换为“system.data.datatable”行dt = uow.Repository<User>().GetAll().ToList();

下面是我的代码

代码语言:javascript
复制
 public DataTable GetAllUser1()
    {
        DataTable dt = new DataTable();
        dt = uow.Repository<User>().GetAll().ToList();
        return dt;
    }

任何帮助都会很高的appreciated.Thank你

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-12-25 05:50:03

可以使用以下方法将列表转换为DataTable

代码语言:javascript
复制
public DataTable GetAllUser1()
{
    DataTable dt = new DataTable();
    dt = ToDataTable(uow.Repository<User>().GetAll().ToList());
    return dt;
}


public 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)
    {
        //Setting column names as Property names
        dataTable.Columns.Add(prop.Name);
    }
    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;

}
票数 0
EN

Stack Overflow用户

发布于 2017-12-25 05:33:20

可以使用下面的DataTable将列表转换为method

代码语言:javascript
复制
public DataTable GetAllUser1()
{
    DataTable dt = new DataTable();
    dt =ToDataTable(uow.Repository<User>().GetAll().ToList());
    return dt;
}

public static DataTable ToDataTable<T>(this IList<T> data)
{
    PropertyDescriptorCollection properties = 
        TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new DataTable();
    foreach (PropertyDescriptor prop in properties)
        table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
    foreach (T item in data)
    {
        DataRow row = table.NewRow();
        foreach (PropertyDescriptor prop in properties)
             row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
        table.Rows.Add(row);
    }
    return table;
}
票数 0
EN

Stack Overflow用户

发布于 2017-12-25 05:42:50

代码语言:javascript
复制
DataTable dt = new DataTable();
dt = uow.Repository<User>().GetAll().ToList();

不是那样的。您应该使用DataTable方法来填充它。提供一个例子将提供更好的理解。例如,User类包含这些属性;

代码语言:javascript
复制
public class User
{
    public int Id { get; set; }

    public string Name { get; set; }
}

您应该为DataTable指定列;

代码语言:javascript
复制
    DataTable dt = new DataTable();
    dt.Columns.Add("Id");
    dt.Columns.Add("Name");

现在,您可以在一个简单的循环中添加行;

代码语言:javascript
复制
    var userList = uow.Repository<User>().GetAll().ToList();
    DataTable dt = new DataTable();
    dt.Columns.Add("Id");
    dt.Columns.Add("Name");
    foreach (var user in userList)
    {
        var newRow = dt.NewRow();
        newRow["Id"] = user.Id;
        newRow["Name"] = user.Name;
        dt.Rows.Add(newRow);
    }

另外,您可以通过获取属性并使用Reflection访问它们来动态地提供解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47965931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档