将子对象绑定到DataField和DataSource

5
class A 
{ 
  int ID; 
  B ClassB; 
}

class B 
{ 
  string Title; 
}

使用上面的模拟类作为示例 - 我有一个动态创建的GridView。我将X个BoundFields添加到其中的Columns集合中,然后将一个集合分配给DataSource,但是我的子对象没有绑定。

BoundFields的DataField属性设置为“ClassB.Title”,而DataSource是类型为A的对象集合,但它一直抛出异常“在所选数据源上未找到名称为'ClassB.Title'的字段或属性。”

您有什么想法吗?

干杯

1个回答

12

这是因为BoundField使用反射来评估对象属性 - 显然,类A没有名为ClassB.Title的属性,因此出现了问题。

您可以使用模板字段来解决这个问题。例如:

<asp:templatefield headertext="SomeColumn">
     <itemtemplate>
          <%#Eval("ClassB.Title")%>
     </itemtemplate>
</asp:templatefield>
请注意,您可以使用强类型表达式(例如)而不是使用以下类型的典型模板字段标记:
<asp:templatefield headertext="SomeColumn">
     <itemtemplate>
          <%# ((A)(Container.DataItem)).ClassB.Title  %>
     </itemtemplate>
</asp:templatefield>

请注意将数据项(data-item)转换为您特定的类(A)进行类型转换。

编辑: 另一种选择是构建自己的BoundField,可以进行嵌套属性查找 - 例如:

public class MyBoundField : BoundField
{
   protected override object GetValue(Control controlContainer)
   {
      string dataField = this.DataField;
      if (string.IsNullOrEmpty(dataField)) { return null; }
      if (!dataField.Contains('.'))
      {
         // use base implemenation
         return base.GetValue(controlContainer);
      }

      // design time support
      if (base.DesignMode)
      {
        return this.GetDesignTimeValue();
      }

      // Use data-binder to evaluate nested property look-ups
      return DataBinder.Eval(controlContainer, dataField);
   }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接