提问人:Ann 提问时间:4/15/2023 最后编辑:jmcilhinneyAnn 更新时间:4/16/2023 访问量:282
遍历 ListView(Vb.net) 中的每一列
Loop through each column in ListView(Vb.net)
问:
如何遍历每一列以在列表视图中获取其值/数据? 我试过了:
For each item as ListViewItem in lsvCurrent.Items
Next
但是我收到语法错误“ListViewDataItem 类型的值无法转换为 ListViewItem。
希望有人能指导我如何正确地遍历列表视图中的每一行和每一列 VB.net
谢谢!
答:
与评论相反,是的,listview 项是这里的正确选择。
所以,说这个代码:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
For Each lvItem As ListViewItem In LVHotels.Items
' get row index
Dim MyRowIndex As Integer = lvItem.DisplayIndex
' get database primary key assuming you using datakeys
Dim DataBasePK As Integer = LVHotels.DataKeys(MyRowIndex).Item("ID")
' Get value of a label on this row
Dim lblHotelName As Label = lvItem.FindControl("HotelName")
Debug.Print($"Row {MyRowIndex}, Hotel = {lblHotelName.Text} Database PK = {DataBasePK}")
Next
End Sub
因此,在上面,我们看到/获取行索引。我们得到隐藏的数据库 PK ID(你非常想使用)。若要使用 DataKeys,请在 ListView Define(标记)中使用它。
<asp:ListView ID="LVHotels" runat="server" DataKeyNames="ID" >
<ItemTemplate>
etc. etc. etc.
因此,当我运行上面的代码时,我得到/看到这个:
输出:
Row 0, Hotel = Batman's Cave Database PK = 16
Row 1, Hotel = Inns of Banff Database PK = 5
Row 2, Hotel = Mary's Motel Database PK = 7
Row 3, Hotel = Mountain View Hotel Database PK = 1
Row 4, Hotel = Ramada Lodge Database PK = 2
Row 5, Hotel = Sandman Inn Database PK = 3
Row 6, Hotel = Super 8 Database PK = 4
Row 7, Hotel = Swiss Village Database PK = 6
所以,是的,事实上 ListViewItem 是这里使用的正确对象类型。
如上所示,您可以获取行索引,然后获取数据库 PK(此值对用户隐藏 - 通过使用数据键),然后当然要从每一行中获取值,您可以如上所述使用 .findcontrol。
在上面,酒店名称是标记中的标签,是这样的:
<td>
<asp:Label ID="HotelName" runat="server"
Text='<%# Eval("HotelName") %>' />
</td>
不能使用 ListViewDataitem,因为它仅在数据绑定过程中存在 - 一旦 listview 被数据绑定,listviewData 项就会超出范围。
因此,ListViewDataItem 非常好,可以在“期间”使用 Row 数据绑定事件。它使您可以充分利用整个数据行 - 不限于列表视图显示中的 JUST 列。
但是,如前所述,数据绑定过程完成的那一刻,数据项和 listviewdataItem 为 null 且超出范围 - 并且不能在数据绑定过程完成后“使用”。
DataItem = only avaiable during binding - data row, not contorls
ListViewItem = always avaialble - is the listview row - not data row
因此,数据库“行”信息不会保留在 Gridview 或 listview(或者实际上任何数据绑定控件,如 repeater、listview、gridview 等)中。
编辑:上面显示了如何获取所有行,列呢?
因此,上面的循环显示了如何遍历每一行。
每行的每一列呢?
实际上,每一行都没有一个列集合。
这意味着要获取每一行的列,通常必须对每个控件使用查找控件。
所以,假设你有几列,如下所示:
<ItemTemplate>
<tr id="onerow" runat="server">
<td><asp:Label ID="FirstNameLabel" runat="server" Text='<%# Eval("FirstName") %>' /></td>
<td><asp:Label ID="LastNameLabel" runat="server" Text='<%# Eval("LastName") %>' /></td>
<td><asp:Label ID="HotelName" runat="server" Text='<%# Eval("HotelName") %>' /></td>
好吧,那么你必须使用那个 ListViewRow 。查找控件。
因此,在示例循环代码中,要获取酒店名称(标签),然后按照上面发布的代码,然后:
Dim lblHotelName As Label = lvItem.FindControl("HotelName")
-- thus lblHotelName.Text <--- this gets hotel name column
因此,对于每个列值,都需要一些额外的代码。
从理论上讲,您可以循环使用该列表视图行中的每个(所有)控件。但是,您必须测试/检查每种控件类型,这将是相当多的代码。因此,请使用 .findcontrol 从列表视图中获取列。
评论