如何仅使用选定的参数将List <t>转换为DataTable

时间:2016-12-27 16:44:28

标签: c# list listview datatable

我有List<Indicators>指标有多个属性。

我有一个ListView,它将该类的选定属性保存为字符串列表。

我想使用列表视图中的选定属性从List创建一个DataTable。

到目前为止,我可以使用listview中的所选参数为DataTable创建列。我一直坚持如何用所选列中的数据填充每一行。

for区块是我被困的地方,我知道我拥有的东西是不对的。感谢任何帮助。谢谢。

  internal DataTable ConvertToDataTableAll(List<Indicators> data)
    {

        DataTable table = new DataTable();           
        foreach (ListViewItem item in listviewFeatures.Items)
        {

            table.Columns.Add(item.Text);

            //this for block should fill the current column with data.
            for (int i = 0; i < data.Count; i++)
            {
                var row = table.NewRow();

                table.Rows.InsertAt(row, i);
                table.Rows[i][item.Text] = data.Select(x => item.Text);

            }

        }
    }

对CodingYoshis建议进行一些更改的解决方案。 这是在添加上面代码中的所有列并删除for块之后。

        foreach(Indicators ind in data)
        {
            var row = table.NewRow();

            foreach(PropertyInfo prop in ind.GetType().GetProperties())
            {
                if (table.Columns.Contains(prop.Name))
                {
                    row[prop.Name] = prop.GetValue(ind);
                }

            }
            table.Rows.Add(row);
        }

1 个答案:

答案 0 :(得分:0)

您需要为整个表添加一次列,而不是像您一样为每一行添加列。所以应该这样做:

var firstItem = listviewFeatures.Items.FirstOrDefault();
if (firstItem == null)
{
    // Nothing to convert to datatable so return
    return;
}

// We have items so lets initialize the table
DataTable table = new DataTable();
foreach (ColumnHeader header in listviewFeatures.Columns)
{
      table.Columns.Add(header);
}

// Now lets add the rows
foreach (ListViewItem item in listviewFeatures.Items)
{

    // Create one row per row in listview
    var row = table.NewRow();

    // Traverse the listview by each column and fill the row
    foreach (ColumnHeader header in listviewFeatures.Columns)
    {
        row[header] = item.Text;
    }

    // Add row to table. It will add it to the end.
    table.Rows.Add(row);   
}