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.