动态N列绑定到DetailsView?

时间:2015-04-24 06:39:45

标签: c# asp.net linq detailsview

我有一个存储过程,它返回以下数据:

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?

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

或者有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您为控件设置AutoGenerateRowstrue,则应自动生成所有行。我认为没有必要进行反思。

请注意,为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。