【问题标题】:How to move to next Item of a ListView using a Button如何使用按钮移动到 ListView 的下一个项目
【发布时间】:2021-10-08 09:25:55
【问题描述】:

我想使用按钮将选择移动到 ListView 的下一个项目。
我需要取消选择当前选择的项目并选择它下面的项目。
我尝试了这段代码,但它没有按预期工作:

ListView1.Items(ListView1.SelectedItems(0).Index + 1).Selected = True
ListView1.Items(ListView1.SelectedItems(0).Index + 1).EnsureVisible()
ListView1.Focus()
ListView1.Select()

我该怎么做?

【问题讨论】:

  • 也许你可以用比“转到”下一项更模糊的术语来解释事情。你的意思是把焦点从一项移到它下面的一项吗?取消选择一项并选择它下面的一项?还有什么?我猜你是在谈论选择,基于你的代码,但我们不应该猜测。
  • @jmcilhinney 亲爱的 jmcilhinney, 取消选择一项并选择它下面的一项,这正是我想要的。我更新了我的问题。

标签: .net vb.net winforms listview


【解决方案1】:

看起来很简单,但你试过了吗:

    ListView1.SelectedIndex = ListView1.SelectedIndex + 1 

另外,不要忘记所选项目是列表中最后一个的迭代,这样您就可以移动到第一个。

【讨论】:

    【解决方案2】:

    要选择 ListView 的上一个或下一个 Item,可以考虑 SelectedIndices 集合的第一个元素返回的索引。
    如果这个集合是空的,你可以假设这个索引是0
    使用SelectedItems.Clear() 清除当前选择,然后将该索引增加或减少1,验证新索引不会超出Items 集合的范围。

    EnsureVisible() 方法会在当前不可见的情况下(它在 ListView 客户区域之外)显示所选项目。

    由于您使用 Buttons 来更改选定的 Item 并将 ListView.HideSelection 属性设置为 False 可能无法获得所需的视觉效果,因此您可能还需要关注 ListView,因为单击按钮会从其他控件中窃取焦点(除非按钮本身不可选择)。

    假设您有一个名为 Listview1 的 ListView 和两个名为 btnPreviousbtnNext 的 Button,用于将选择移动到上一个和下一个 Item:

    Private Sub btnPrevious_Click(sender As Object, e As EventArgs) Handles btnPrevious.Click
        Dim itemSelected As Integer = GetListViewSelectedItemIndex(ListView1)
        itemSelected += If(itemSelected > 0, -1, 0)
        SetListViewSelectedItem(ListView1, itemSelected)
    End Sub
    
    Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click
        Dim itemSelected As Integer = GetListViewSelectedItemIndex(ListView1)
        itemSelected += If(itemSelected < ListView1.Items.Count - 1, 1, 0)
        SetListViewSelectedItem(ListView1, itemSelected)
    End Sub
    
    Private Function GetListViewSelectedItemIndex(lv As ListView) As Integer
        Return If(lv.SelectedItems.Count > 0, lv.SelectedIndices(0), 0)
    End Function
    
    Private Sub SetListViewSelectedItem(lv As ListView, index As Integer)
        If lv.Items.Count = 0 Then Return
        lv.SelectedItems.Clear()
        If Not lv.Focused Then lv.Focus()
        lv.EnsureVisible(index)
        lv.Items(index).Selected = True
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多