所以我有来自各种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都是不同类型的对象,但是我希望它们成为各自单元中的自己的表。如果不可能,我可以存储某种触发器来打开表。
答案 0 :(得分:0)
我决定使用Web浏览器控件并将数据表转换为html表。
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;
}