【问题标题】:How to databind a property within a property如何在属性中对属性进行数据绑定
【发布时间】:2008-10-08 10:42:19
【问题描述】:

我确实有一个像下面这样的设置

Public ClassA

property _classB as ClassB

End Class

Public ClassB

property _someProperty as someProperty 

End Class

我想要做的是将对象 A 数据绑定到一个网格视图,其中一列数据绑定到 ClassB._someProperty。当我尝试将其作为 Classb._someProperty 进行数据绑定时,我收到“在选定数据源上找不到字段或属性”错误

我尝试使用 objectContainerDataSource 并直接绑定到 gridview,但没有成功。

过去有人遇到过这种情况吗?

【问题讨论】:

    标签: asp.net vb.net data-binding


    【解决方案1】:

    普通数据绑定通常不允许表达式。在后台,数据网格使用反射(而不是像 DataBinder.Eval 在 ASP.NET 页面上那样执行代码)来查找您指定绑定到列的属性。要执行您想要的操作,需要将绑定评估为表达式,确定您正在寻找父 -> 子关系,然后反映到该级别。 AFAIK 网格上的内置数据绑定太笨了,不知道该怎么做。

    我最近遇到了同样的问题,我的解决方案是进行 LINQ 投影并将其绑定到网格。类似于以下内容(在 C# 中,因为我对 VB 中的 LINQ 语法不满意):

    IList<ClassA> listOfClassAObjects = GetMyListOfClassAObjectsFromSomewhere();
    var projection = from ClassA a in listOfClassAObjects
                     select new { SomeProperty = a.SomeProperty, 
                                  SomeOtherProperty = a.SomeOtherProperty,
                                  SomePropertyFromB = a.ClassB.SomeProperty };
    datagrid.DataSource = projection;
    datagrid.DataBind();
    

    您将获得包含该投影的匿名类型列表,并且可以将相应的列绑定到 SomePropertyFromB

    为了额外的封装(如果你经常这样做)将投影放入扩展方法中,这样你就可以做类似的事情

    var data = GetMyListOfClassAObjectsFromSomewhere().ProjectionForDataGrid();
    datagrid.DataSource = data;
    datagrid.DataBind();
    

    【讨论】:

    • 这使用 LINQ,我相信它仅在 .net 2.0 之后可用。由于我仅限于 .net 2.0,还有其他方法吗?
    • 您需要 C# 3.0 编译器来编译它,但是您可以非常愉快地在 2.0 框架上运行生成的代码。 system.core 程序集中的 LINQ 库(System.Linq)确实是 .NET Framework 3.5 的一部分,但对于上述代码,您不需要它。
    【解决方案2】:

    我发现这样做的方法是使用模板字段和 eval(见下文)

    将数据字段设置为属性classB,然后:

    <asp:TemplateField HeaderText="_someProperty">
    <ItemTemplate>       
                               <%#Eval("classB._someProperty")%>
    
    </ItemTemplate>
    </asp:TemplateField>
    

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 2010-12-11
      • 2020-03-12
      • 2011-02-04
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多