C#在对象列表上使用反射来创建数据网格

时间:2018-11-27 00:31:07

标签: c# wpf datatable datagrid

所以我有来自各种API调用的响应数据。这些调用中的每个调用都返回一个对象列表,每个对象也可以包含一个对象列表。由于存在许多不同的对象类型,因此该方法必须是通用的。我的目标是拥有一个包含对象属性的数据网格,如果该属性是另一个列表,则添加一个数据网格控件。

public static DataTable GetDataGrid(this IList list)
    {
        var dt = new DataTable();
        foreach (var o in (IEnumerable)list)
        {
            var r = dt.NewRow();
            foreach (var f in o.GetType().GetProperties())
            {
                if (!dt.Columns.Contains(f.Name))
                {
                    dt.Columns.Add(f.Name);
                }
                var value = f.GetValue(o);
                Type t = value.GetType();
                // if it is an integer list just concat the values
                if (value is IList<int?>)
                {
                    r[f.Name] = (String.Join<int?>(",", (IEnumerable<int?>)value));
                }// if it is another object list create a datagrid
                else if (value is IList)
                {
                    // CREATE A DATA GRID
                }// if it is not a list just add the value
                else
                {
                    r[f.Name] = value;
                }

            }
            dt.Rows.Add(r);
        }
        return dt;

    }

这就是我走了多远,但这也只是一个数据表

编辑: Example

因此,我想要表中下方的原始数据。系统内存,进程内存和GPU都是不同类型的对象,但是我希望它们成为各自单元中的自己的表。如果不可能,我可以存储某种触发器来打开表。

1 个答案:

答案 0 :(得分:0)

我决定使用Web浏览器控件并将数据表转换为html表。

Datatable to html Table

 public static string ConvertDataTableToHTML(this DataTable dt)
    {
        string html = "<table>";
        //add header row
        html += "<tr>";
        for (int i = 0; i < dt.Columns.Count; i++)
            html += "<td>" + dt.Columns[i].ColumnName + "</td>";
        html += "</tr>";
        //add rows
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            html += "<tr>";
            for (int j = 0; j < dt.Columns.Count; j++)
                html += "<td>" + dt.Rows[i][j].ToString() + "</td>";
            html += "</tr>";
        }
        html += "</table>";
        return html;
    }