当前位置:  开发笔记 > 编程语言 > 正文

将通用列表转换为C#中的数据集

如何解决《将通用列表转换为C#中的数据集》经验,为你挑选了4个好方法。

我有一个通用的对象列表.每个对象有9个字符串属性.我想将该列表转换为可以传递给datagridview的数据集......最好的方法是什么?



1> Bennett Dill..:

我为回答这个问题而道歉,但我认为这是查看我的最终代码的最简单方法.它包含可为空类型和空值的修复程序:-)

    public static DataSet ToDataSet(this IList list)
    {
        Type elementType = typeof(T);
        DataSet ds = new DataSet();
        DataTable t = new DataTable();
        ds.Tables.Add(t);

        //add a column to table for each public property on T
        foreach (var propInfo in elementType.GetProperties())
        {
            Type ColType = Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType;

            t.Columns.Add(propInfo.Name, ColType);
        }

        //go through each property on T and add each value to the table
        foreach (T item in list)
        {
            DataRow row = t.NewRow();

            foreach (var propInfo in elementType.GetProperties())
            {
                row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value;
            }

            t.Rows.Add(row);
        }

        return ds;
    }


感谢这个,很棒的片段:)只是一个bugfix,我在foreach之前添加了if(list.Count()!= 0),因为,如果你要转换的列表是空的,代码将抛出异常.
大!这刚刚在我正在做的一个项目中救了我的命!

2> Christian Ha..:

您是否尝试过直接将列表绑定到datagridview?如果没有,请首先尝试,因为它会为您节省很多痛苦.如果您已经尝试过,请告诉我们出了什么问题,以便我们为您提供更好的建议.数据绑定根据数据对象实现的接口提供不同的行为.例如,如果你的数据对象只实现IEnumerable(例如List),你会得到非常基本的单向绑定,但如果它实现IBindingList以及(如BindingList,DataView),那么你得到双向绑定.



3> 小智..:

上面有Lee的扩展代码有一个错误,你需要在迭代列表中的项目时将新填充的行添加到表t中.

public static DataSet ToDataSet(this IList list) {

Type elementType = typeof(T);
DataSet ds = new DataSet();
DataTable t = new DataTable();
ds.Tables.Add(t);

//add a column to table for each public property on T
foreach(var propInfo in elementType.GetProperties())
{
    t.Columns.Add(propInfo.Name, propInfo.PropertyType);
}

//go through each property on T and add each value to the table
foreach(T item in list)
{
    DataRow row = t.NewRow();
    foreach(var propInfo in elementType.GetProperties())
    {
            row[propInfo.Name] = propInfo.GetValue(item, null);
    }

    //This line was missing:
    t.Rows.Add(row);
}


return ds;

}



4> Lee..:

您可以创建一个扩展方法,通过反射添加所有属性值:

public static DataSet ToDataSet(this IList list)
{
    Type elementType = typeof(T);
    DataSet ds = new DataSet();
    DataTable t = new DataTable();
    ds.Tables.Add(t);

    //add a column to table for each public property on T
    foreach(var propInfo in elementType.GetProperties())
    {
        t.Columns.Add(propInfo.Name, propInfo.PropertyType);
    }

    //go through each property on T and add each value to the table
    foreach(T item in list)
    {
        DataRow row = t.NewRow();
        foreach(var propInfo in elementType.GetProperties())
        {
            row[propInfo.Name] = propInfo.GetValue(item, null);
        }
    }

    return ds;
}

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有