[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 739
  • Last Modified:

Listview: Position selected item at top of list

I have a textbox and a listview. When you start typing in the textbox, it searches through the listview and highlights the first item that matches.

I use .ensurevisible to make sure the item is on the screen.

This all works fine, except that the highlighted item appears at the bottom of the listview. I'd like it to automatically scroll the listview so that the matching item is the first item visible in the listview.

Any idea how to achieve this? I have tried lots of things, but nothing seems to work, so I"m happy to give maximum points to whoever can give me a solution!
0
rbroome
Asked:
rbroome
  • 3
  • 2
1 Solution
 
bingieCommented:
Can you post your code so far?
0
 
rbroomeAuthor Commented:
Private Sub txtPartNoOther_KeyUp(KeyCode As Integer, Shift As Integer)
   
    Dim X As Long
   
    If Len(txtPartNoOther) <= 1 Then
        lvwOthers.ListItems.Clear
        Exit Sub
    Else
       'Don't fill the list until at least 2 characters have been entered
        If Len(txtPartNoOther) = 2 _
            And KeyCode <> 8 Then 'backspace
            If DBOK Then
                Call LoadXRefData(txtPartNoOther) 'this fills the listview
            Else
                txtPartNoOther = ""
                Exit Sub
            End If
        End If
    End If
   
    X = InListView(Me.lvwOthers, txtPartNoOther.Text)
    'this function does a binary search of the listview and returns the index of the matching item
    If X > -1 Then
        Set lvwOthers.SelectedItem = lvwOthers.ListItems(X)
        lvwOthers.ListItems(X).EnsureVisible
    End If
   
End Sub
0
 
appariCommented:
try this

Private Sub txtPartNoOther_KeyUp(KeyCode As Integer, Shift As Integer)
   
    Dim X As Long
   
    If Len(txtPartNoOther) <= 1 Then
        lvwOthers.ListItems.Clear
        Exit Sub
    Else
       'Don't fill the list until at least 2 characters have been entered
        If Len(txtPartNoOther) = 2 _
            And KeyCode <> 8 Then 'backspace
            If DBOK Then
                Call LoadXRefData(txtPartNoOther) 'this fills the listview
            Else
                txtPartNoOther = ""
                Exit Sub
            End If
        End If
    End If
   
    X = InListView(Me.lvwOthers, txtPartNoOther.Text)
    'this function does a binary search of the listview and returns the index of the matching item
    If X > -1 Then
        Set lvwOthers.SelectedItem = lvwOthers.ListItems(X)
       
        lvwOthers.ListItems(X).EnsureVisible
       
        Dim itmFound As ListItem
       
       Set itmFound = lvwOthers.ListItems(X)
       itmFound.EnsureVisible
       itmFound.Selected = True
        Dim i As Integer
        Dim blnSelected As Boolean
        blnSelected = False
        For i = 1 To lvwOthers.ListItems.Count
           If lvwOthers.ListItems.Item(i).Selected Then blnSelected = True
           If blnSelected Then
            lvwOthers.ListItems.Item(i).EnsureVisible
           End If
           
        Next i
        itmFound.EnsureVisible
       
       
     
       
    End If
   
End Sub


0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
rbroomeAuthor Commented:
appari,

Thanks for that. It worked, but was extremely slow (with over 1000 items in the Listview). But you pointed me in the right direction - I tweaked your code to the following:


       Set itmFound = lvwOthers.ListItems(X)
       itmFound.EnsureVisible
       itmFound.Selected = True
        Dim i As Integer
        Dim blnSelected As Boolean
        blnSelected = False
'        For i = 1 To lvwOthers.ListItems.Count
'          If lvwOthers.ListItems.Item(i).Selected Then blnSelected = True
'          If blnSelected Then
'            lvwOthers.ListItems.Item(i).EnsureVisible
'           End If
'          
'        Next i
        lvwOthers.ListItems(lvwOthers.ListItems.Count - 1).EnsureVisible
        itmFound.EnsureVisible


Thanks, and here are the points!
0
 
appariCommented:

yeah i tested it on small set of data so it was quick:), after posting i thought of the alternative, same as yours, first make last item visible then the actual item.
0
 
rbroomeAuthor Commented:
Yep, thanks!
0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now