如何在属性中数据绑定属性

时间:2008-10-08 10:42:19

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

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

Public ClassA

property _classB as ClassB

End Class

Public ClassB

property _someProperty as someProperty 

End Class

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

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

过去有没有人碰到这个?

2 个答案:

答案 0 :(得分:2)

普通数据绑定通常不允许表达式。在引擎盖下,datagrid使用反射(而不是像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();

答案 1 :(得分:0)

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

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

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

</ItemTemplate>
</asp:TemplateField>