我想知道为什么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 %>' />
答案 0 :(得分:0)
首先,使用代码按原样,您将DataField属性(它应该查看的列的NAME)设置为它应该查看的列的VALUE。在运行时,GridView将尝试绑定到名为“MALARIA”的用户上的字段(或者更可能的是,它将无法确定“User”对象是什么,以便首先将值注入到标记中)。 BoundField也不必知道包含它正在寻找的属性的对象是User类型;它将使用您指定的列的名称尝试简单的反射GetProperty()调用;如果失败,那么该列的绑定就会失败。
通过更正这些内容,您仍然会发现BoundField不会反过来通过像“diagnostic.DiagnosisCode”这样的复合成员标识符进行递归。解决方案是在诊断上实现ICustomTypeDescriptor或ITypedList,每个方法都公开了BoundField将用于帮助它通过复合标识符进行递归的方法。