Solved

Listview: Position selected item at top of list

Posted on 2003-11-12
6
709 Views
Last Modified: 2013-12-25
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
Comment
Question by:rbroome
  • 3
  • 2
6 Comments
 
LVL 11

Expert Comment

by:bingie
ID: 9736257
Can you post your code so far?
0
 

Author Comment

by:rbroome
ID: 9736305
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
 
LVL 39

Accepted Solution

by:
appari earned 500 total points
ID: 9736366
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
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 

Author Comment

by:rbroome
ID: 9736425
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
 
LVL 39

Expert Comment

by:appari
ID: 9736464

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
 

Author Comment

by:rbroome
ID: 9736536
Yep, thanks!
0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Background What I'm presenting in this article is the result of 2 conditions in my work area: We have a SQL Server production environment but no development or test environment; andWe have an MS Access front end using tables in SQL Server but we a…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

758 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now