2010-11-29 6 views
1

Je migre une application de VB6 à VB.Net et j'ai trouvé un changement dans le comportement de la ListBox et je ne suis pas sûr de la façon de le rendre égal à VB6.Recherche éléments ListBox dans VB.Net

Le problème est le suivant:

Dans l'application VB6, lorsque le ListBox est concentré et je tape dedans, la liste sélectionne l'élément qui correspond à ce que je tape. par exemple. Si la liste contient une liste de pays et que je tape "ita", "Italy" sera sélectionné dans la liste. Le problème est que avec la version .Net du contrôle si je tape "ita" il va sélectionner le premier élément qui commence par i, puis le premier élément qui commence par "t" et enfin le premier élément qui commence par "un ".

Donc, une idée sur la façon d'obtenir le comportement original? (Je pense à une propriété que je ne vois pas pour une raison ou une autre)

Je ne veux vraiment pas écrire un gestionnaire d'événement pour cela (lequel btw, ne serait pas trivial).

Merci beaucoup!

Répondre

1

Comme vous le savez probablement, cette fonctionnalité est appelée 'type ahead', et elle n'est pas intégrée dans la WinBox ListBox (donc vous ne manquez pas une propriété).

Vous pouvez obtenir la fonctionnalité de saisie anticipée sur le contrôle ListView si vous définissez sa propriété View sur List.

+0

Ok, merci beaucoup, en fait je ne savais pas que la fonction a été appelé «type avant :) – willvv

-1
Public Function CheckIfExistInCombo(ByVal objCombo As Object, ByVal TextToFind As String) As Boolean 
     Dim NumOfItems As Object 'The Number Of Items In ComboBox 
     Dim IndexNum As Integer 'Index 
     NumOfItems = objCombo.ListCount 
     For IndexNum = 0 To NumOfItems - 1 
      If objCombo.List(IndexNum) = TextToFind Then 
       CheckIfExistInCombo = True 
       Exit Function 
      End If 
     Next IndexNum 
     CheckIfExistInCombo = False 
    End Function 
+1

Qu'est-ce que cela a à voir avec la question initiale? – willvv

4

J'ai partagé la frustration de willw. C'est ce que j'ai trouvé. Ajoutez une classe appelée ListBoxTypeAhead à votre projet et incluez ce code. Ensuite, utilisez cette classe comme un contrôle sur votre formulaire. Il piège l'entrée du clavier et déplace l'élément sélectionné comme le faisait l'ancienne boîte de liste VB6. Vous pouvez sortir le minuteur si vous le souhaitez. Il imite le comportement de la saisie au clavier dans l'explorateur Windows.

Public Class ListBoxTypeAhead 

    Inherits ListBox 

    Dim Buffer As String 
    Dim WithEvents Timer1 As New Timer 

    Private Sub ListBoxTypeAhead_KeyDown(sender As Object, _ 
    e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 

    Select Case e.KeyCode 
     Case Keys.A To Keys.Z, Keys.NumPad0 To Keys.NumPad9 
     e.SuppressKeyPress = True 
     Buffer &= Chr(e.KeyValue) 
     Me.SelectedIndex = Me.FindString(Buffer) 
     Timer1.Start() 
     Case Else 
     Timer1.Stop() 
     Buffer = "" 
    End Select 

    End Sub 

    Private Sub ListBoxTypeAhead_LostFocus(ByVal sender As Object, _ 
    ByVal e As System.EventArgs) Handles Me.LostFocus 

    Timer1.Stop() 
    Buffer = "" 

    End Sub 

    Public Sub New() 

    Timer1.Interval = 2000 

    End Sub 

    Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick 

    Timer1.Stop() 
    Buffer = "" 

    End Sub 

End Class 
Questions connexes