ASP.NET和DataKeyNames中的ListView

时间:2013-12-16 11:32:00

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

我有一个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

提前谢谢!

1 个答案:

答案 0 :(得分:0)

首先,您只能使用类的直接属性作为DataKeyNames。使用Eval指令可以更深入(但我相信只有一个级别)。

您可以做的是通过代码隐藏更改列表视图中显示的内容。

为此,请添加ItemDataBound事件。 正在创建的项目的数据可以在e.Item.DataItem中找到,end将是A类型(在使用之前将其强制转换)。

你应该能够通过e.Item直接访问你的控件(不知道在这个上使用哪些属性),一旦你找到了正确的单元格,你可以设置你想要的任何文本并且由于您拥有A本身的绑定实例,因此您可以无限制地调用所需的任何属性或子属性。

为ListView中的每个条目调用此函数,因此它们应该只为您提供当前条目的数据。

希望这可以帮助您解决问题。