listview 使用 topItem 属性滚动

问题描述 投票:0回答:2

我再次需要你的帮助。

我有一个按标题第一个字母分组的电影列表 我正在编写一个例程,当按下两个键(PageDown 和 PageUp)时,会将其放置在下一个字母或前一个字母的第一个标题上。

Private Sub frmMovieDatabase_KeyDown(sender As Object, e As KeyEventArgs) Handles lvFilmDetail.KeyDown
    If Not lvFilmDetail.ShowGroups Then
        Exit Sub
    End If

    Dim ctr_max_groups As Integer = lvFilmDetail.Groups.Count - 1
    Dim ctr_curr_group As Integer = 0

    If e.KeyCode = Keys.PageDown Or
        e.KeyCode = Keys.PageUp Then

        Select Case e.KeyCode
            Case Keys.PageDown
                ctr_curr_group = lvFilmDetail.Groups.IndexOf(currentGroup) + 1
                If ctr_curr_group > ctr_max_groups Then
                    ctr_curr_group = 0
                End If
                currentGroup = lvFilmDetail.Groups.Item(ctr_curr_group)

            Case Keys.PageUp
                ctr_curr_group = lvFilmDetail.Groups.IndexOf(currentGroup) - 1
                If ctr_curr_group < 0 Then
                    ctr_curr_group = ctr_max_groups
                End If

                currentGroup = lvFilmDetail.Groups.Item(ctr_curr_group)
        End Select

        MsgBox(currentGroup.Items(0).Text)
        lvFilmDetail.TopItem = currentGroup.Items(0)
        MsgBox(lvFilmDetail.TopItem.Text)

        e.SuppressKeyPress = True

    End If


End Sub

第一个消息框正确显示每组的第一条记录。将项目分配给 topItem 属性后指示的 msgbox 始终返回列表视图的第一条记录,但无法进行分页工作

有人可以帮助我吗?

谢谢

马塞洛

vb.net listview
2个回答
0
投票

据猜测,我想说,使用组时,

TopItem
属性会被破坏。 此代码可能是可以接受的,它至少确保下一组的第一项可见:

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode <> Keys.PageUp AndAlso e.KeyCode <> Keys.PageDown Then Return

    Dim groups = ListView1.Groups
    Dim groupCount = groups.Count
    Dim group = ListView1.FocusedItem.Group
    Dim groupIndex = groups.IndexOf(group)

    Select Case e.KeyCode
        Case Keys.PageUp
            groupIndex -= 1

            If groupIndex < 0 Then
                groupIndex = groupCount - 1
            End If
        Case Keys.PageDown
            groupIndex += 1

            If groupIndex = groupCount Then
                groupIndex = 0
            End If
    End Select

    group = groups(groupIndex)

    Dim item = group.Items(0)

    ListView1.FocusedItem = item
    ListView1.EnsureVisible(item.Index)

    e.SuppressKeyPress = True
End Sub

0
投票

我解决了同样的问题,其中使用 Listview1.TopItem = Listview1.Items(currentvertpos) 的方法是将行 currentvertpos 放在可见列表的顶部,直到您使用 .TopItem 滚动到列表底部开始出现的位置靠近可见列表的底部。通过检查一些 SCROLLINFO 值,我推断列表视图逻辑可能是,当 .TopItem 事件向下滚动列表时,它会根据可见行检查列表总行数以及为滚动按钮设置的行数 (cbSize) 和通过在可见列表的底部显示请求的行来“谨慎行事”,而不是超出范围。这里只是猜测,但数字是有道理的。 我尝试设置 Listview1.ShowGroups = False 但没有效果。 相反添加了另一行如下

Listview1.TopItem = Listview1.Items(lastline) 
Listview1.TopItem = Listview1.Items(currentvertpos)

第一行代码强制定位到列表中的最后一行,然后这似乎强制列表框执行下一个 .TopItem 请求,同时在列表中向上而不是向下前进。现在,无论我位于列表的哪个部分,重写列表后,我都会出现与顶行完全相同的行。

© www.soinside.com 2019 - 2024. All rights reserved.