我再次需要你的帮助。
我有一个按标题第一个字母分组的电影列表 我正在编写一个例程,当按下两个键(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 始终返回列表视图的第一条记录,但无法进行分页工作
有人可以帮助我吗?
谢谢
马塞洛
据猜测,我想说,使用组时,
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
我解决了同样的问题,其中使用 Listview1.TopItem = Listview1.Items(currentvertpos) 的方法是将行 currentvertpos 放在可见列表的顶部,直到您使用 .TopItem 滚动到列表底部开始出现的位置靠近可见列表的底部。通过检查一些 SCROLLINFO 值,我推断列表视图逻辑可能是,当 .TopItem 事件向下滚动列表时,它会根据可见行检查列表总行数以及为滚动按钮设置的行数 (cbSize) 和通过在可见列表的底部显示请求的行来“谨慎行事”,而不是超出范围。这里只是猜测,但数字是有道理的。 我尝试设置 Listview1.ShowGroups = False 但没有效果。 相反添加了另一行如下
Listview1.TopItem = Listview1.Items(lastline)
Listview1.TopItem = Listview1.Items(currentvertpos)
第一行代码强制定位到列表中的最后一行,然后这似乎强制列表框执行下一个 .TopItem 请求,同时在列表中向上而不是向下前进。现在,无论我位于列表的哪个部分,重写列表后,我都会出现与顶行完全相同的行。