动态 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。
我有一个存储过程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。