我有一个像下面这样的设置
Public ClassA
property _classB as ClassB
End Class
Public ClassB
property _someProperty as someProperty
End Class
我想要做的是将对象A数据绑定到gridview,其中一列被数据绑定到ClassB._someProperty。当我尝试将其数据绑定为Classb._someProperty时,我得到“在选定的数据源上找不到字段或属性”错误
我曾尝试使用objectContainerDataSource并直接绑定到gridview但没有成功。
过去有没有人碰到这个?
答案 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>