0

我现在有一个像下面这样的设置

Public ClassA

property _classB as ClassB

End Class

Public ClassB

property _someProperty as someProperty 

End Class

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

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

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

4

2 回答 2

2

普通数据绑定通常不允许表达式。在后台,数据网格使用反射(而不是像 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.

For extra encapsulation (if you do this a lot) put the projection into an extension method so you can do something like

var data = GetMyListOfClassAObjectsFromSomewhere().ProjectionForDataGrid();
datagrid.DataSource = data;
datagrid.DataBind();
于 2008-10-08T10:51:34.673 回答
0

I found the way to do this is to use a template field and eval (see below)

Set the datafield as property classB and then:

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

</ItemTemplate>
</asp:TemplateField>
于 2008-10-08T14:02:07.330 回答