L'auto complétion avec .Net 2.0

Olivier DELMOTTE

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

- Titre : L'auto complétion avec .Net 2.0

- Auteur : Olivier DELMOTTE

- Parution : 25 juin 2007

- Mise à jour : 25 juin 2007

- Licence : 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.

Sommaire

- 1. Introduction

- 2. Les styles d'autocomplétion

- 2-1. "None"

- 2-2. "Append"

- 2-3. "Suggest"

- 2-4. "SuggestAppend"

- 3. Les sources d'auto complétion

- 3-1. "None"

- 3-2. "FileSystem"

- 3-3. "FileSystemDirectories"

- 3-4. "HistoryList"

- 3-5. "RecentlyUsedList"

- 3-6. "AllUrl"

- 3-7. "AllSystemRessources"

- 3-8. "CustomSource"

- 4. La source personnalisée ou CustomSource

- 5. Conclusion

- 5-1. Remerciement

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 :

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 :

2-4 - "SuggestAppend"

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

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.

3-3 - "FileSystemDirectories"

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

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.

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.

3-6 - "AllUrl"

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

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.

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.