【问题标题】:C# using reflection on a list of objects to create a data gridC# 使用对象列表上的反射来创建数据网格
【发布时间】:2018-11-27 00:31:07
【问题描述】:

所以我有来自各种 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 列网格,您的问题并未阐明您使用数据构建的结构。可以举几个例子吗
  • 在单元格中嵌套数据网格将是一个糟糕的 UI/UX,其他人都使用 Treeviews 进行这种“递归”加载。
  • 它甚至是您开始使用的数据表吗?为什么是数据网格?您真的希望在动态结构中编辑动态类型吗?我认为动态构建树视图可能是您最好的选择。
  • 它以包含属性的对象列表和其他对象列表开始。那么树视图会是更好的方法吗?

标签: c# wpf datatable datagrid


【解决方案1】:

我决定使用 Web Browser 控件并将数据表转换为 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;
    }

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2015-10-14
    • 2012-05-15
    • 2013-10-13
    • 2021-05-20
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多