我有一个存储过程,它返回以下数据:
HEIGHT LENGTH WEIGHT WIDTH 0 0 0 0
列将是动态的,最多可以有N列。
我想要做的是将此结果绑定到Details View,然后让用户键入值。
但是当我绑定到详细信息视图时,我有以下错误:
DetailsView with id' detailsViewProcessParameter'没有任何属性或属性来生成字段。确保您的数据源包含内容。
这是我用来返回对象列表然后绑定到详细信息视图的方法:
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();
}
}
我怀疑我应该使用&#34;选择新的{PropertyName = Value,PropertyName = Value}&#34;在我的LINQ中,以摆脱错误。
但是当PropertyName(列名)是动态的时候如何选择new?
如何使用反射来解决这个问题?
或者有更好的方法吗?
答案 0 :(得分:1)
如果您为控件设置AutoGenerateRows
为true
,则应自动生成所有行。我认为没有必要进行反思。
请注意,为DataKeyNames
设置的任何属性都不可编辑。
答案 1 :(得分:1)
这里的问题是您正在返回并因此将objects
列表List<object>
绑定到DetailsView。我怀疑你的对象没有DetailsView需要生成行的任何公共属性,从而抛出错误。
当使用列表绑定到DetailsView(或称为GridView)时,上下文中的对象(由某些Class
表示)必须具有公共属性。例如,假设我们将一个用户List<User>
列表绑定到DetailsView,那么User
类必须具有公共属性,这些属性将形成DetailsView的行(或GridView中的列)。
public class User
{
public string Name { get; set; }
public int Age { get; set; }
public string Mail { get; set; }
}
使用此基本概念,请检查query
变量的外观,并尝试将此query
变量映射到具有公共属性的Class
。
因为在您的情况下,列本质上是动态的,您必须首先能够确定具有该值的列的总数,在运行时构造相应的DataTable并将该数据表绑定到Detailsview。