【问题标题】:Binding sub Objects to DataField and DataSource将子对象绑定到 DataField 和 DataSource
【发布时间】:2011-12-05 01:50:41
【问题描述】:
class A 
{ 
  int ID; 
  B ClassB; 
}

class B 
{ 
  string Title; 
}

以上述模拟类为例 - 我有一个动态创建的 GridView。为此,我绑定(添加到 Columns 集合)X 个 BoundFields,然后将集合分配给 DataSource,但是,我的子对象没有绑定。

BoundFields 的 DataField 属性设置为“ClassB.Title”,DataSource 是 A 类型对象的集合,但它不断抛出异常“找不到名为“ClassB.Title”的字段或属性在选定的数据源上。"

有什么想法吗?

干杯

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    这是因为 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>
    

    注意数据项的类型转换为您的特定类 (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);
       }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-29
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多