遍历 ListView(Vb.net) 中的每一列

Loop through each column in ListView(Vb.net)

提问人:Ann 提问时间:4/15/2023 最后编辑:jmcilhinneyAnn 更新时间:4/16/2023 访问量:282

问:

如何遍历每一列以在列表视图中获取其值/数据? 我试过了:

      For each item as ListViewItem in lsvCurrent.Items
      Next

但是我收到语法错误“ListViewDataItem 类型的值无法转换为 ListViewItem。

希望有人能指导我如何正确地遍历列表视图中的每一行和每一列 VB.net

谢谢!

asp.net vb.net ListView Web 窗体

评论

1赞 Steve 4/15/2023
ListViewDataItem 用于表示 WEB 控件 ListView 中的 Item。(ASP.NET)ListViewItem 适用于桌面应用。 (WinForms)
0赞 Ann 4/15/2023
明白了。但是如何使用 listviewdataitem 遍历列表视图中的每一行和每一列呢?
1赞 Steve 4/15/2023
不会遍历 ListViewDataItem,而是遍历分配给 ListView 的底层 DataSource
0赞 jmcilhinney 4/15/2023
我为您的问题添加了更多相关标签。请具体说明所有相关信息。有多个 ListView 控件,因此您需要明确使用哪个控件。当你的控件是不同的控件时,你正在尝试将代码用于一个控件。

答:

1赞 Albert D. Kallal 4/15/2023 #1

与评论相反,是的,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 从列表视图中获取列。