我有一个ListView,它与一个'A'列表绑定,如下所示:
Class A
Property Id as Integer
Property TestStringA as String
Property B as B
End Class
Class B
Property Id as Integer
Property TestStringB as String
End Class
在ListView中,我可以参考“链接属性”值(这是正确的术语吗?):
<asp:ListView runat="server" ID="lwTest" ItemType="A">
<LayoutTemplate>
<tr runat="server" id="itemPlaceHolder"></tr>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><%# Item.TestStringA %></td>
<td><%# Item.B.TestStringB %></td> (this is what I mean)
</tr>
</ItemTemplate>
</asp:ListView>
这在使用Eval方法时也有效(如果无法使用'ItemType'):
<%# Eval(B.TestStringB) %>
我想循环ListView的项目并使用容器中的值,而不将它们保存在隐藏字段中(这不是'DataKeyNames'的目的吗?)。问题是,我不能通过它在DataKeyNames中的link-attribute / property(在示例中为B.Id)引用另一个对象的属性。当我这样做时,我收到一个错误,告诉我没有名为'B.Id'的属性):
<asp:ListView runat="server" ID="lwTest" ItemType="A" DataKeyNames"Id, B.Id">
<LayoutTemplate>
<tr runat="server" id="itemPlaceHolder"></tr>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><%# Item.TestStringA %></td>
<td><%# Item.B.TestStringB %></td> (this is what I mean)
</tr>
</ItemTemplate>
</asp:ListView>
有谁知道是否可以这样做?我知道我可以添加readonly属性直接将值返回到绑定对象(但如果可能的话我想避免这种情况):
Class A
Property Id as Integer
Property TestStringA as String
Property B as B
ReadOnly Property BId as Integer
Get
Return B.Id
End Get
End Property
End Class
Class B
Property Id as Integer
Property TestStringB as String
End Class
提前谢谢!
答案 0 :(得分:0)
首先,您只能使用类的直接属性作为DataKeyNames。使用Eval指令可以更深入(但我相信只有一个级别)。
您可以做的是通过代码隐藏更改列表视图中显示的内容。
为此,请添加ItemDataBound事件。 正在创建的项目的数据可以在e.Item.DataItem中找到,end将是A类型(在使用之前将其强制转换)。
你应该能够通过e.Item直接访问你的控件(不知道在这个上使用哪些属性),一旦你找到了正确的单元格,你可以设置你想要的任何文本并且由于您拥有A本身的绑定实例,因此您可以无限制地调用所需的任何属性或子属性。
为ListView中的每个条目调用此函数,因此它们应该只为您提供当前条目的数据。
希望这可以帮助您解决问题。