如何在C#中将DataTable转换为对象类型List

5

我想在C#中将DataTable转换为List<object>。这是我的代码,但它没有起作用。请帮帮我。

public List<object> ShowMessage()
{
    List<object> obj = new List<object>();

    DataTable dt = new DataTable();
    dt.Columns.Add("ID");
    dt.Columns.Add("Name");

    dt.Rows.Add("1","AAA");
    dt.Rows.Add("2", "BBB");
    dt.Rows.Add("3", "CCC");

    foreach (DataRow dr in dt.Rows)
    {
        obj.Add(dr);
    }

    return obj;
}

这是错误信息--

在此输入图片描述


1
你的对象是哪种类型?它为什么不工作? - cuongle
1
哪个部分出了问题?那段代码看起来没有错误。 - nick_w
你有任何错误信息吗?你尝试过调试它吗?从我的角度来看,一切应该都没问题... - besworland
很简单:return dt.AsEnumerable().Cast<object>().ToList() ;-) - Tim Schmelter
我想绑定一个数据表格。我将使用这个列表作为数据源。 - Rashedul Alam
你能否编辑你的帖子并明确你的确切需求和问题? - manas
3个回答

42

如果你有任何类似于这样的列表对象的类型化数据类型

public class MyObj
{
    public string Name { get; set; }
    public int ID { get; set; }
}

那么你可以这样做

private List<MyObj> test(DataTable dt)
{
       
    var convertedList = (from rw in dt.AsEnumerable()
        select new MyObj() 
        {
            ID = Convert.ToInt32(rw["ID"]),
            Name = Convert.ToString(rw["Name"])
        }).ToList();

    return convertedList;
}

或者如果你仍然想要一个List<object>,那么可以像这样做

private List<object> GetListByDataTable(DataTable dt)
{

    var reult = (from rw in dt.AsEnumerable()
        select new
        {
            Name = Convert.ToString(rw["Name"]),
            ID = Convert.ToInt32(rw["ID"])
        }).ToList();

    return reult.ConvertAll<object>(o => (object)o);
}

或者你也可以遵循这个链接,它也提供了通用的解决方案:https://www.c-sharpcorner.com/UploadFile/ee01e6/different-way-to-convert-datatable-to-list/


8
我希望你想要做的是将数据表中的对象(可能是从查询中返回的)插入到列表中。请注意,保留HTML标记。
public List<object> ShowMessage2(DataTable dtInput)
    {
        List<object> objectList = new List<object>();

        foreach(DataRow dr in dtInput.Rows)
        {
            MyObj newObj = new MyObj();
            newObj.ID = Convert.ToInt32(dr["ID"]);  // Beware of the possible conversion errors due to type mismatches
            newObj.Name = dr["Name"].ToString();

            objectList.Add(newObj);
        }
        return objectList;
    }

public class MyObj
{
    public int ID { get; set; }
    public string Name { get; set; }        
}

刚看到你对问题的补充!我不明白为什么你要生成一个列表,如果你只是想在网格视图中显示数据,你可以用一行代码实现!!!

List<object> obj = new List<object>();
DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Name");

dt.Rows.Add("1", "AAA");
dt.Rows.Add("2", "BBB");
dt.Rows.Add("3", "CCC");

dataGridView1.DataSource = dt; // THIS IS ALL U NEED! Just bind the DataTable to the grid as data source!

2

在将DataRow添加到DataRow集合之前,需要先创建它。

例如:

DataTable dt = new DataTable();
        dt.Columns.Add("ID");
        dt.Columns.Add("Name");
        var dr = dt.NewRow();
        dr[0] = "1";
        dr[1] = "AAA";
        dt.Rows.Add(dr);
        ... likewise

        foreach (DataRow dr in dt.Rows)
        {
            obj.Add(dr);
        }

现在列表应该包含行。如果可以,请告诉我是否有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接