在Gridview boundfield中访问包含的类属性

时间:2010-09-15 14:27:10

标签: c# asp.net class properties

我想知道为什么asp.net在GridTemplates中工作时不允许访问Gridview的Boundfields中包含类的属性..

Class User
{
 Diagnosis diagnosis { get; set; } // Contained class
}

Class Diagnosis
{
   string DiagnosisCode { get; set; }
}


 gridview.datasource =
   new List<User>() { 
   new User() { 
   diagnosis = new Diagnosis() { DiagnosisCode = "MALARIA" }} }


 <boundfield datafield='<#% User.diagnosis.DiagnosisCode %>' />

1 个答案:

答案 0 :(得分:0)

首先,使用代码按原样,您将DataField属性(它应该查看的列的NAME)设置为它应该查看的列的VALUE。在运行时,GridView将尝试绑定到名为“MALARIA”的用户上的字段(或者更可能的是,它将无法确定“User”对象是什么,以便首先将值注入到标记中)。 BoundField也不必知道包含它正在寻找的属性的对象是User类型;它将使用您指定的列的名称尝试简单的反射GetProperty()调用;如果失败,那么该列的绑定就会失败。

通过更正这些内容,您仍然会发现BoundField不会反过来通过像“diagnostic.DiagnosisCode”这样的复合成员标识符进行递归。解决方案是在诊断上实现ICustomTypeDescriptor或ITypedList,每个方法都公开了BoundField将用于帮助它通过复合标识符进行递归的方法。