L'auto complétion avec .Net 2.0

Dans ce tutoriel, nous allons aborder l'autocomplétion et voir comment l'utiliser avec les contrôles Winform .Net 2.0

Article lu   fois.

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

1. Introduction

Certains contrôles de .Net 2.0 sont arrivés avec une nouvelle fonctionnalité bien sympathique : l'auto complétion. Si vous désirez un petit aperçu de cette nouveauté, ouvrez la commande Exécuter du menu Démarrer et tapez un chemin de fichier ou une URL par exemple.

Pour des raisons de simplicité, je ne décrirai que son application au contrôle TextBox. Vous verrez que le fonctionnement est identique quel que soit le contrôle utilisé.

2. Les styles d'autocomplétion

Le style d'auto complétion est défini par la propriété AutoCompleteMode du contrôle. Le Framework vous propose 4 formes d'auto complétion :

  • Suggest
  • Append
  • SuggestAppend
  • None

2-1. "None"

« None » désactive l'auto complétion, c'est d'ailleurs sa valeur par défaut. Elle n'a donc pas un grand intérêt ici.

2-2. "Append"

En mode « Append », le système complète le texte du contrôle avec la première suggestion cohérente qu'il trouve.

En voici un aperçu :

append

2-3. "Suggest"

Le mode « Suggest » est celui de la commande Exécuter du menu démarrer. Il fait apparaitre une liste des possibilités qui coïncident avec votre saisie.

En voici un aperçu :

suggest

2-4. "SuggestAppend"

Ce mode est une combinaison des modes « Suggest » et « Append ». Vous pouvez facilement imaginer le résultat :

suggestappend

Voila un aperçu de l'auto complétion. Maintenant, vous vous posez sans doute la question de savoir comment il sait que suggérer.

3. Les sources d'auto complétion

Il existe 8 sources différentes d'auto complétion. La dernière de ces sources offre des possibilités quasi-infinies. Ces 8 sources sont :

  • None
  • FileSystem
  • FileSystemDirectories
  • HistoryList
  • RecentlyUsedList
  • AllUrl
  • AllSystemRessources
  • CustomSource

3-1. "None"

« None », comme pour le mode, désactive la fonction d'auto complétion. Vous vous retrouvez donc avec un contrôle classique.

3-2. "FileSystem"

« FileSystem » vous permet de compléter en se basant sur l'arborescence de fichier du système, aussi bien en local sur vos disques durs que sur le réseau. Il inclut les fichiers et les dossiers.

filesystem

3-3. "FileSystemDirectories"

Ce mode d'auto complétion est le même que « FileSystem », sauf qu'il n'affiche que les dossiers.

filesystemdirectories

3-4. "HistoryList"

Cette source d'auto complétion vous permet de retrouver les éléments récemment ouverts par le système d'exploitation. Elle reprend les éléments dernièrement ouverts que l'on retrouve dans le menu démarrer ainsi que les dernières URL saisies.

historylist

3-5. "RecentlyUsedList"

Cette source d'auto complétion est l'équivalent de toutes les commandes que vous pouvez retrouver dans la liste de la fenêtre Exécuter.

recentlyusedlist

3-6. "AllUrl"

Ce mode d'auto complétion vous permet de proposer les URL à la façon d'Internet Explorer.

allurl

3-7. "AllSystemRessources"

"AllSystemRessources" est la combinaison des 5 modes que nous venons de voir précédemment.

3-8. "CustomSource"

« CustomSource » vous permet de définir vous-même votre source pour l'auto complétion. Enfin pour être un peu plus exactement, de la coder. Nous verrons comment procéder dans le chapitre suivant.

4. La source personnalisée ou CustomSource

Définir la source personnalisée est une chose très simple.

En écrivant ce tutoriel, j'ai testé une première méthode qui s'est révélée atroce niveau performances. Celle décrite ici est nettement meilleure et fonctionne très bien.

L'idée, pour définir est une source personnalisée d'auto complétion, est de créer une source de type « AutoCompleteStringCollection », de la remplir et de l'attribuer au contrôle.

L'exemple suivant utilise une table Contact de la base AdventureNetworks pour récupérer une liste des noms et définir la propriété AutoCompleteCustomSource d'un contrôle TextBox nommé txtCustomComplete.

 
Sélectionnez
Imports System.Data.SqlClient
Imports System.Threading

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf FillAutoComplete))
    End Sub

    Private Sub FillAutoComplete(ByVal state As Object)

        Dim res As AutoCompleteStringCollection = New AutoCompleteStringCollection()

        Using scon As New SqlConnection(My.Settings.TestCS)
            Using scom As New SqlCommand("", scon)

                scom.CommandText = String.Format("SELECT DISTINCT LastName FROM Person.Contact " & _
				"WHERE (LastName IS NOT NULL) ORDER BY LastName", Me.txtCustomComplete.Text.ToLower())

                scon.Open()

                Dim reader As SqlDataReader = scom.ExecuteReader

                While reader.Read()
                    res.Add(reader.GetString(0))
                End While

                reader.Close()
                scon.Close()

            End Using
        End Using

        If res.Count <> 0 Then
            SetSource(res)
        End If
    End Sub

    Private Delegate Sub SetSourceDelegate(ByVal source As AutoCompleteStringCollection)
    Private Sub SetSource(ByVal source As AutoCompleteStringCollection)
        If Me.InvokeRequired Then
            Me.Invoke(New SetSourceDelegate(AddressOf SetSource), source)
        Else
            Me.txtCustomComplete.AutoCompleteCustomSource = source
        End If
    End Sub

End Class

Comme vous pouvez le constater, rien de bien compliqué.

Je récupère mes données depuis une base, mais j'aurais très bien pu choisir n'importe quel type de source de données comme un WebService. Dans le cas d'un WebService, le temps de réponse pouvant être relativement variable, j'ai préféré charger mes données dans un autre thread afin de ne pas bloquer l'application. Certes, dans ce cas précis, ce n'est pas très gênant. De plus, comme l'auto complétion n'est, dans la majeure partie des cas, pas une fonctionnalité essentielle, on peut admettre qu'elle ne soit disponible qu'un petit moment après le chargement de la fenêtre.

5. Conclusion

Cette fonctionnalité n'est pas celle du siècle, mais elle apportera un petit confort supplémentaire pour les utilisateurs de vos applications sans pour autant passer des heures à la mettre en place.

5-1. Remerciement

Merci Cécile (khany) pour la correction.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2007 Olivier Delmotte. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.