动态 N 列绑定到 DetailsView?

Dynamic N columns bind to DetailsView?

我有一个存储过程return下面的数据:

HEIGHT    LENGTH    WEIGHT    WIDTH
0         0         0         0

列将是动态的,最多可以有 N 列。

我想做的是将此结果绑定到详细信息视图,然后让用户键入值。

但是当我绑定到详细信息视图时出现以下错误:

ID 为 'detailsViewProcessParameter' 的 DetailsView 没有任何可用于生成字段的属性。确保您的数据源有内容。

这是我用来 return 对象列表然后绑定到详细信息视图的方法:

public static List<object> GetProcessParameters(int formulaId)
{
    using (var db = new SurfaceTreatment.SurfaceTreatmentEntities())
    {
        var paramFormulaId = new SqlParameter { ParameterName = "formulaId", Value = formulaId };
        var query = db.Database.SqlQuery<object>("exec usp_GetProcessParameters @formulaId", paramFormulaId).ToList();
        return query.ToList();
    }
}

我怀疑我应该在我的 LINQ 中使用 "select new { PropertyName = Value, PropertyName = Value}" 来消除错误。

但是,当 PropertyName(列名)是动态的时,我如何 select 新建?

如何使用反射来解决这个问题?

或者有更好的方法吗?

如果将控件的 AutoGenerateRows 设置为 true,所有行都应自动生成。我认为不需要进行反射。

请注意,为 DataKeyNames 设置的任何 属性 将不可编辑。

这里的问题是您要返回并因此将 objects 的列表(即 List<object> )绑定到 DetailsView。我怀疑您的对象没有任何 public 属性 DetailsView 需要生成行并因此抛出错误。

当使用列表绑定到 DetailsView(或 GridView)时,上下文中的对象(由一些 Class 表示)必须具有 public 属性。例如,假设我们将用户列表 List<User> 绑定到 DetailsView,那么这里 User class 必须具有 public 属性,这些属性将形成 DetailsView 的行(或 GridView 中的列).

public class User
        {
           public string Name { get; set; }
           public int Age { get; set; }
           public string Mail { get; set; }
        }

根据这个基本概念,检查您的 query 变量是什么样的,并尝试将此 query 变量映射到具有 public 属性的 Class

由于在您的情况下,列本质上是动态的,因此您必须首先能够确定具有这些值的列的总数,在运行时构建相应的 DataTable 并将该数据 table 绑定到 Detailsview。