Vous êtes sur la page 1sur 449

Copyright

2006 Micro Application 20-22, rue des Petits-Htels 75010 Paris 1re dition - Septembre 2006

Auteurs Avertissement aux utilisateurs

Patrice LAMARCHE, Antoine GRIFFARD, Mauricio DIAZ ORLICH Toute reprsentation ou reproduction, intgrale ou partielle, faite sans le consentement de MICRO APPLICATION est illicite (article L122-4 du code de la proprit intellectuelle). Cette reprsentation ou reproduction illicite, par quelque procd que ce soit, constituerait une contrefaon sanctionne par les articles L335-2 et suivants du code de la proprit intellectuelle. Le code de la proprit intellectuelle nautorise aux termes de larticle L122-5 que les reproductions strictement destines lusage priv et non destines lutilisation collective dune part, et dautre part, que les analyses et courtes citations dans un but dexemple et dillustration. Les informations contenues dans cet ouvrage sont donnes titre indicatif et nont aucun caractre exhaustif voire certain. A titre dexemple non limitatif, cet ouvrage peut vous proposer une ou plusieurs adresses de sites Web qui ne seront plus dactualit ou dont le contenu aura chang au moment o vous en prendrez connaissance. Aussi, ces informations ne sauraient engager la responsabilit de lEditeur. La socit MICRO APPLICATION ne pourra tre tenue responsable de toute omission, erreur ou lacune qui aurait pu se glisser dans ce produit ainsi que des consquences, quelles quelles soient, qui rsulteraient des informations et indications fournies ainsi que de leur utilisation. Tous les produits cits dans cet ouvrage sont protgs, et les marques dposes par leurs titulaires de droits respectifs. Cet ouvrage nest ni dit, ni produit par le(s) propritaire(s) de(s) programme(s) sur le(s)quel(s) il porte et les marques ne sont utilises qu seule fin de dsignation des produits en tant que noms de ces derniers. ISBN : 2-7429-6826-1 Couverture ralise par Room22. MICRO APPLICATION 20-22, rue des Petits-Htels 75010 PARIS Tl. : 01 53 34 20 20 Fax : 01 53 34 20 00 http://www.microapp.com Support technique galement disponible sur www.microapp.com

Retrouvez des informations sur cet ouvrage ! Rendez-vous sur le site Internet de Micro Application www.microapp.com. Dans le module de recherche, sur la page daccueil du site, entrez la rfrence 4 chiffres indique sur le prsent livre. Vous accdez directement sa fiche produit.

7826

Avant-propos
Le collection Guide du codeur sadresse aux personnes inities la programmation qui souhaitent dcouvrir une technologie particulire. Sans ngliger les aspects thoriques, nous donnons toujours priorit la pratique an que vous puissiez rapidement tre autonome. Avant dentrer dans le vif du sujet, notez ces quelques informations gnrales propos de la collection.

Conventions typographiques
An de faciliter la comprhension de techniques dcrites, nous avons adopt les conventions typographiques suivantes :
j j j j

gras : menu, commande, bote de dialogue, bouton, onglet. italique : zone de texte, liste droulante, case cocher, bouton radio.

Police bton : instruction, listing, texte saisir.

: dans les programmes, indique un retour la ligne d aux contraintes de la mise en page.

Propose conseils et trucs pratiques.

Met laccent sur un point important, souvent dordre technique quil ne faut ngliger aucun prix.

Donne en quelques lignes la dnition dun terme technique ou dune abrviation.

Il sagit dinformations supplmentaires relatives au sujet trait.

Sommaire 1 Gestion simple dune vidothque . . . . . . . . . . 17


1.1. 1.2. 1.3. Conguration . . . . . . . . . . . . . . Classes et espaces de noms utiliss . . Accs aux donnes . . . . . . . . . . . Cration de la base de donnes . . . . . Conguration des tables . . . . . . . . . Conguration de la source de donnes . Interface utilisateur . . . . . . . . . . Mise en place des composants . . . . . Liaison des composants aux donnes . . Ralisation . . . . . . . . . . . . . . . . Liaison de contrles par le code . . . . Amliorer lergonomie de lapplication Filtrer la collection . . . . . . . . . . . . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 18 18 18 20 21 22 22 23 24 25 26 27 28

1.4.

1.5.

1.6.

Gestion dun album de photos . . . . . . . . . . . . 29


2.1. 2.2. Classes et espaces de noms utiliss Interface utilisateur . . . . . . . . Prparer le formulaire principal . . . Barres de menus et dtat . . . . . . Diviser un formulaire en deux . . . Panneau de gauche . . . . . . . . . . Panneau de droite . . . . . . . . . . Ralisation . . . . . . . . . . . . . . Menu Fichier . . . . . . . . . . . . . Afficher limage slectionne . . . . Barre doutils . . . . . . . . . . . . . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 30 31 32 33 34 35 36 36 38 39 41

2.3.

2.4.

Envoi de messages chiffrs . . . . . . . . . . . . . 43


3.1. 3.2. Classes et espaces de noms utiliss Interface utilisateur . . . . . . . . Formulaire principal . . . . . . . . . Formulaire de dchiffrement . . . . Ralisation . . . . . . . . . . . . . . Classe auxiliaire pour la cryptologie Envoyer des messages chiffrs . . . Dchiffrer les messages . . . . . . . Touches nales . . . . . . . . . . . . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 44 44 47 48 49 52 54 55 56

3.3.

3.4.

Sommaire

Gestion dun concours . . . . . . . . . . . . . . . . 57


4.1. Classes et espaces de noms utiliss . . . . La classe Personne . . . . . . . . . . . . . . La classe Participant . . . . . . . . . . . . . Interface utilisateur . . . . . . . . . . . . Dnition de la source de donnes . . . . . Cration du formulaire . . . . . . . . . . . . Ralisation . . . . . . . . . . . . . . . . . . Chargement et enregistrement des donnes Classement des rsultats . . . . . . . . . . . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 58 61 62 62 64 69 69 71 74

4.2.

4.3.

4.4.

Outil de traitement de texte RTF . . . . . . . . . . 75


5.1. 5.2. Classes et espaces de noms utiliss . Interface utilisateur . . . . . . . . . Formulaire principal . . . . . . . . . . Formulaires enfants . . . . . . . . . . Dnition du formulaire de dmarrage Ralisation . . . . . . . . . . . . . . . Complter la classe DocumentRtf . . Crer de nouveaux documents . . . . Ouvrir un document existant . . . . . Enregistrer un document . . . . . . . . Menu Edition . . . . . . . . . . . . . . Aligner le texte . . . . . . . . . . . . . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 76 76 78 80 80 81 82 82 84 87 88 90

5.3.

5.4.

Site web personnel . . . . . . . . . . . . . . . . . . 91


6.1. 6.2. 6.3. Cration de linterface Cration de menus . . Gestion des liens . . . Srialisation XML . . . Affichage des liens . . . Ajout des liens . . . . . Page Contact . . . . . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 . 94 . 96 . 97 . 99 . 101 . 101 . 103

6.4. 6.5.

Site web familial . . . . . . . . . . . . . . . . . . . 105


7.1. Classes et espaces de noms utiliss . . . . . . . . . . . . . . . 106

Sommaire
7.2. 7.3. 7.4. Accs aux donnes . . . Interface utilisateur . . Ralisation . . . . . . . . Associer un thme au site Source de donnes . . . . Album de photos . . . . . Gestionnaire gnrique . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 107 109 109 110 112 114 116

7.5.

Site web dune association . . . . . . . . . . . . . 117


8.1. 8.2. Cration de la hirarchie des pages Gestion des informations . . . . . . Cration de la base de donnes . . . . Insrer les informations . . . . . . . . Insrer des actualits et des dossiers . Afficher les actualits et les dossiers . Gestion de la scurit . . . . . . . . . Cration de la base de donnes . . . . Conguration de lapplication . . . . Cration des rles . . . . . . . . . . . Cration des rgles daccs . . . . . . Cration dun utilisateur . . . . . . . . Implmentation du site web . . . . . . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 119 120 122 123 125 128 128 130 131 131 132 133 134

8.3.

8.4.

Moniteur de performances . . . . . . . . . . . . . 135


9.1. 9.2. Classes et espaces de noms utiliss . . . . . . . . . . . . Espace de noms My . . . . . . . . . . . . . . . . . . . . Informations sur le systme dexploitation . . . . . . . . . Information sur lutilisation de la mmoire . . . . . . . . Rcuprer des informations grce lespace de noms System.Management . . . . . . . . . . . . . . . . . . . . Extension de lespace de noms My . . . . . . . . . . . . . Afficher des informations sur le processeur . . . . . . . Crer une vue synthtique . . . . . . . . . . . . . . . . . Dplacement dune fentre sans bordure . . . . . . . . . . Enregistrer des paramtres dapplication . . . . . . . . . . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 136 137 138 141 143 144 145 147 148 149

9.3.

9.4. 9.5.

9.6.

Sommaire

10

Client MSN Messenger avec onglets . . . . . . . 151


10.1. Classes et espaces de noms utiliss . . . . . . . . 10.2. Conguration . . . . . . . . . . . . . . . . . . . . 10.3. Interface utilisateur . . . . . . . . . . . . . . . . Formulaire principal . . . . . . . . . . . . . . . . . Contrle Dialogue . . . . . . . . . . . . . . . . . . 10.4. Ralisation . . . . . . . . . . . . . . . . . . . . . . Connexion au service de messagerie . . . . . . . . Gestion des vnements du service de messagerie Contrle Dialogue . . . . . . . . . . . . . . . . . . Gestion des vnements de la fentre principale . 10.5. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 152 154 155 156 157 157 158 163 164 167

11

Explorateur de disques . . . . . . . . . . . . . . . 169


11.1. 11.2. 11.3. 11.4. 11.5. 11.6. Classes et espaces de noms utiliss . . . . Lister les lecteurs de lordinateur . . . . Lister les dossiers . . . . . . . . . . . . . . Afficher des informations sur les dossiers Composant BackgroundWorker . . . . . Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 170 175 176 178 181

12

Navigateur Internet . . . . . . . . . . . . . . . . . 183


Classes et espaces de noms utiliss Conguration . . . . . . . . . . . . Interface utilisateur . . . . . . . . Ralisation . . . . . . . . . . . . . . Gestion dynamique des onglets . . . Recherche . . . . . . . . . . . . . . . Gestion des raccourcis clavier . . . Contrle parental . . . . . . . . . . . 12.5. Check list . . . . . . . . . . . . . . 12.1. 12.2. 12.3. 12.4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 184 185 186 187 191 192 192 198

13

Aggrgateur RSS . . . . . . . . . . . . . . . . . . 199


13.1. Ralisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 Charger un ux RSS manuellement . . . . . . . . . . . . . . . 207 13.2. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

Sommaire

14

Cration dun gadget Live.com. . . . . . . . . . . 211


Conguration du systme . . . . . . . . . . . Composition dun gadget . . . . . . . . . . . Crer un gadget de manire rapide et simple Intgration dune iframe . . . . . . . . . . . . Cration de la page ASP .NET . . . . . . . . Gestion des contacts . . . . . . . . . . . . . . . 14.6. Interface de gestion des contacts . . . . . . . 14.7. Affichage des contacts . . . . . . . . . . . . . 14.8. Check-list . . . . . . . . . . . . . . . . . . . . 14.1. 14.2. 14.3. 14.4. 14.5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 215 216 217 218 218 220 221 222

15

Slecteur de papier peint. . . . . . . . . . . . . . 223


15.1. Classes et espaces de noms utiliss . . . . . . 15.2. Accs aux donnes . . . . . . . . . . . . . . . 15.3. Interface utilisateur . . . . . . . . . . . . . . Afficher une icne dans la zone de notication 15.4. Ralisation . . . . . . . . . . . . . . . . . . . . Dnition du papier peint courant . . . . . . . Affichage de la miniature . . . . . . . . . . . . Gestion du glisser-lcher . . . . . . . . . . . . Dmarrage automatique . . . . . . . . . . . . . Chargement et sauvegarde de la liste . . . . . . 15.5. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 224 225 227 230 230 231 232 234 235 236

16

WebParts . . . . . . . . . . . . . . . . . . . . . . . 237
16.1. Classes et espaces de noms utiliss . . . . . . . . . . . . . 16.2. Conguration . . . . . . . . . . . . . . . . . . . . . . . . . 16.3. Construction de lapplication . . . . . . . . . . . . . . . . Ajout du WebPartManager . . . . . . . . . . . . . . . . . . Ajout des contrles WebPartZone . . . . . . . . . . . . . . Modes daffichage . . . . . . . . . . . . . . . . . . . . . . . Transformer un contrle utilisateur en WebPart . . . . . . . 16.4. Ajout dune proprit "personnalisable" un WebPart Ajout de WebParts partir dun catalogue . . . . . . . . . . Manipulation dun contrle WebPart . . . . . . . . . . . . . dition dun contrle WebPart . . . . . . . . . . . . . . . . 16.5. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 238 241 241 241 242 244 247 248 249 250 252

Sommaire

17

Stockage dinformations dans un prol . . . . . 253


17.1. Classes et espaces de noms utiliss . . . . . . . . . 17.2. Conguration . . . . . . . . . . . . . . . . . . . . . Dclaration dune proprit de prol . . . . . . . . . Dclaration dun fournisseur de prols personnalis 17.3. Persistance des donnes . . . . . . . . . . . . . . . Fournisseur de prols . . . . . . . . . . . . . . . . . Utilisateurs anonymes . . . . . . . . . . . . . . . . . Migration des informations de prol anonyme . . . 17.4. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 255 256 257 259 261 261 263 264

18

Site web avec slecteur de thmes . . . . . . . . 265


18.1. Mise en forme des contrles serveurs . . . . . . . . . Proprits de style . . . . . . . . . . . . . . . . . . . . . Mise en forme automatique . . . . . . . . . . . . . . . . 18.2. Thmes . . . . . . . . . . . . . . . . . . . . . . . . . . . Fichiers dapparence . . . . . . . . . . . . . . . . . . . . Feuilles de style en cascade . . . . . . . . . . . . . . . . Diffrences entre les thmes et les feuilles de style . . . Association dimages aux proprits . . . . . . . . . . . Proprits dnies laide de thmes . . . . . . . . . . 18.3. Appliquer un thme . . . . . . . . . . . . . . . . . . . Priorit des paramtres de thme . . . . . . . . . . . . . Dclarer un thme . . . . . . . . . . . . . . . . . . . . . Affecter un thme par programmation . . . . . . . . . . Thmes globaux . . . . . . . . . . . . . . . . . . . . . . 18.4. Stocker un thme par utilisateur . . . . . . . . . . . . Listage des thmes . . . . . . . . . . . . . . . . . . . . . Stockage des thmes et affectation du thme slectionn Initialisation du thme lappel dune page . . . . . . . 18.5. Rsultat nal . . . . . . . . . . . . . . . . . . . . . . . 18.6. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 266 271 272 272 275 275 275 276 276 276 276 277 277 277 278 278 279 280 280

19

Reprsentation de donnes hirarchiques laide dun contrle TreeView . . . . . . . . . . 283


19.1. Contrle TreeView . . . . . . . . . . . . . . Notions relatives aux nuds . . . . . . . . . Classe TreeNode . . . . . . . . . . . . . . . . 19.2. Ajouter des nuds un contrle TreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 284 285 286

Sommaire
19.3. Modier des styles associs aux diffrents types de nuds 19.4. Affecter des images aux nuds . . . . . . . . . . . . . . . . 19.5. Lier des donnes un contrle TreeView . . . . . . . . . . Balises DataBindings et TreeNodeBinding . . . . . . . . . . 19.6. Remplir dynamiquement des nuds . . . . . . . . . . . . . Source de donnes hirarchiques . . . . . . . . . . . . . . . . 19.7. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 289 291 291 292 295 298

20

Site multilingue avec stockage des ressources en base de donnes . . . . . . . . . . . . . . . . . 299


20.1. Classes et espaces de noms utiliss . . . . . . . . . . . . Noms de culture . . . . . . . . . . . . . . . . . . . . . . . 20.2. Conguration . . . . . . . . . . . . . . . . . . . . . . . . 20.3. Ressources globales et ressources locales . . . . . . . . Ressources globales . . . . . . . . . . . . . . . . . . . . . Ressources localises . . . . . . . . . . . . . . . . . . . . Autres types de ressources . . . . . . . . . . . . . . . . . 20.4. Expressions de ressource . . . . . . . . . . . . . . . . . . Expression Builders . . . . . . . . . . . . . . . . . . . . . Expressions implicites . . . . . . . . . . . . . . . . . . . . Expressions explicites . . . . . . . . . . . . . . . . . . . . Assistant daffectation des ressources . . . . . . . . . . . 20.5. Fonctionnalits intressantes relatives la localisation Accs par programmation aux ressources . . . . . . . . . Localisation de plans de site . . . . . . . . . . . . . . . . Gnration automatique de ressources locales . . . . . . . Auto-dtection de la culture du navigateur . . . . . . . . . Initialisation de la culture dune page . . . . . . . . . . . 20.6. Implmentation dun fournisseur de ressources . . . . Accs aux donnes . . . . . . . . . . . . . . . . . . . . . . ResourceProviderFactory . . . . . . . . . . . . . . . . . . SQLResourceHelper . . . . . . . . . . . . . . . . . . . . . SQLDesignTimeResourceProviderFactory . . . . . . . . . 20.7. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 301 301 302 304 304 304 305 305 306 306 306 308 308 308 310 311 312 313 313 316 316 317 318

21

Atlas . . . . . . . . . . . . . . . . . . . . . . . . . . 319
21.1. Prsentation dAtlas . . . . . Ajax et XMLHttpRequest . . . Bibliothque de scripts clients Contrles Atlas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 320 320 321

Sommaire
21.2. Installation . . . . . . . . . . . . . . . . . . . . . . 21.3. Cration dun site web Atlas . . . . . . . . . . . Conguration du Web.cong . . . . . . . . . . . . Ajout des contrles Atlas la bote outils . . . . 21.4. Syntaxe du code Atlas . . . . . . . . . . . . . . . Mode impratif . . . . . . . . . . . . . . . . . . . . Mode dclaratif . . . . . . . . . . . . . . . . . . . Mode serveur . . . . . . . . . . . . . . . . . . . . . 21.5. Utilisation du contrle UpdatePanel . . . . . . . Horloge . . . . . . . . . . . . . . . . . . . . . . . . 21.6. Utilisation du contrle AutoCompleteExtender Cration du service web . . . . . . . . . . . . . . . 21.7. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 324 325 326 328 328 328 329 329 330 333 334 336

22

Ralisation dun questionnaire laide dun contrle Wizard . . . . . . . . . . . . . . . . 337


22.1. Classes et espaces de noms utiliss . . . . . . . . . . . . 22.2. Contrle Wizard . . . . . . . . . . . . . . . . . . . . . . Wizard Steps . . . . . . . . . . . . . . . . . . . . . . . . . 22.3. Ralisation du questionnaire . . . . . . . . . . . . . . . Ajout des tapes . . . . . . . . . . . . . . . . . . . . . . . Mise en forme du Wizard . . . . . . . . . . . . . . . . . . Personnalisation du Wizard . . . . . . . . . . . . . . . . . 22.4. Navigation au sein du contrle Wizard . . . . . . . . . Navigation linaire . . . . . . . . . . . . . . . . . . . . . . Navigation personnalise . . . . . . . . . . . . . . . . . . Rcapitulatif des rsultats . . . . . . . . . . . . . . . . . . 22.5. Amlioration de lexprience utilisateur . . . . . . . . . Contrles de validation . . . . . . . . . . . . . . . . . . . Proprits des contrles serveurs relatives lexprience utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.6. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 338 339 340 340 342 344 345 345 345 346 346 347

. . . 348 . . . 349

23

Cration dun contrle serveur personnalis . . 351


23.1. Cration de la librairie de contrles Conguration de la librairie . . . . . . 23.2. Cration du contrle composite . . . Hritage de la classe . . . . . . . . . . Ajout des contrles enfants . . . . . . Ajout des proprits . . . . . . . . . . Attributs de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 353 357 358 358 359 359

Sommaire
Attributs de proprit . . . . . . Ajout dun diteur de proprits Gestion du rendu du contrle . . Gestion des vnements . . . . . Ajout dune image par dfaut . . Ajout dans un projet . . . . . . . 23.3. Cration du designer . . . . . . 23.4. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 362 363 363 364 364 365 367

24

Fichiers compresss et modles de projets Visual Studio . . . . . . . . . . . . . . . . . . . . . 369


24.1. Classes et espaces de noms utiliss . . . . . . . . . . 24.2. Utilitaire de compression de chiers . . . . . . . . . Cration du formulaire . . . . . . . . . . . . . . . . . . Compression dun chier . . . . . . . . . . . . . . . . Dcompression dun chier . . . . . . . . . . . . . . . 24.3. Utilisation de chiers compresss par Visual Studio ProjectTemplates et ItemTemplates . . . . . . . . . . . Templates Visual Studio . . . . . . . . . . . . . . . . . Fichiers dinstallation .vsi . . . . . . . . . . . . . . . . Starter Kits . . . . . . . . . . . . . . . . . . . . . . . . 24.4. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 370 370 372 373 373 373 374 381 385 386

25

Cration dun client FTP . . . . . . . . . . . . . . 389


25.1. Protocole FTP . . . . . . . . . . . . . . . . . 25.2. Serveur FTP . . . . . . . . . . . . . . . . . . Installation dun serveur FTP . . . . . . . . . Cration dun utilisateur . . . . . . . . . . . . 25.3. Client FTP . . . . . . . . . . . . . . . . . . . Connexion rapide . . . . . . . . . . . . . . . Enregistrer une connexion . . . . . . . . . . . Fentre daffichage du journal des messages . Classe FTPClient . . . . . . . . . . . . . . . . Constructeur . . . . . . . . . . . . . . . . . . Mthode GetRequest . . . . . . . . . . . . . . Mthode Download . . . . . . . . . . . . . . Mthode Upload . . . . . . . . . . . . . . . . Mthode GetResponse . . . . . . . . . . . . . 25.4. Check-list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 390 390 395 399 400 401 402 403 404 404 404 406 406 407

Sommaire

26

Annexes . . . . . . . . . . . . . . . . . . . . . . . . 409
26.1. Glossaire . . . . . . . . . . . . . . . 26.2. Rfrences web . . . . . . . . . . . Coach VB2005 . . . . . . . . . . . . Blogs . . . . . . . . . . . . . . . . . Communauts . . . . . . . . . . . . Communauts des experts Microsoft Liens Microsoft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 418 418 418 419 423 424

27

Index . . . . . . . . . . . . . . . . . . . . . . . . . . 425

Introduction

Prsentation
Cet ouvrage est le fruit de lexprience de trois auteurs : Antoine Griffard et Patrice Lamarche (MVP) sont membres de lquipe Wygwam, compose dexperts .NET reconnus par leurs pairs et par Microsoft, qui les dsigne comme Most Valuable Professionals et Regional Director. Mauricio Daz est formateur SUPINFO, o il donne des cours pour le Laboratoire .NET. Cet ouvrage vise vous apprendre programmer grce la gamme doutils gratuits Visual Studio Express de Microsoft, qui comprend entre autres :
j

Visual Basic 2005 Express Edition, pour le dveloppement dapplications Windows en Visual Basic ; Visual Web Developer Express Edition, pour le dveloppement dapplications web ; SQL Server 2005 Express Edition, pour la gestion de bases de donnes.

Ces outils permettent aux tudiants, aux utilisateurs avancs, aux programmeurs dbutants ou passionns, de dcouvrir la programmation et dapprofondir leurs connaissances grce des environnements de dveloppement proches de ceux utiliss par les dveloppeurs professionnels. Il ne sagit pas de vous noyer sous de nombreuses informations thoriques propos du dveloppement dapplications, de la programmation oriente objet. Vous serez guid pas pas pour raliser quelques exemples dapplications, prtextes la dcouverte dun domaine que lon pense souvent rserver des gnies de linformatique. Cela pouvait tre vrai auparavant, mais cest loin dtre le cas prsent, notamment grce Visual Basic. Ce langage simple et puissant permet de raliser rapidement des applications aussi varies que des sites web personnels, des gestionnaires de performances ou encore des traitements de texte. Alors, nattendez plus, apprenez par la pratique construire des applications avec Visual Basic 2005 Express Edition. Pour tlcharger les bootstrappers seulement (ceux-ci vont ensuite, une fois excuts, lancer le tlchargement complet pour une installation dans la foule) :
j

Visual Basic 2005 Express : http://download.microsoft.com/download/8/7/9/ 87938b02-80fa-430a-9e69-9a56a41d2096/vbsetup.exe. Visual Web Developer 2005 Express : http://download.microsoft.com/ download/5/a/7/5a7c77cb-3ebe-4cc3-900a-e958488e686e/vwdsetup.exe. SQL Server 2005 Express : http://download.microsoft.com/download/5/6/1/ 561c80b2-e77f-4b0c-8c40-0a6512e136f5/SQLEXPR_FRN.EXE.
Le guide du codeur 15

Introduction

Pour tlcharger les images ISO (et graver un CD par exemple) :


j

Visual Basic 2005 Express : http://download.microsoft.com/download/7/5/b/ 75b12965-b2de-4a42-b5e1-bda6b2cf7c01/vb.iso. Visual Web Developer 2005 Express : http://download.microsoft.com/ download/4/9/f/49f9dd2a-d537-4d40-a127-add7f7327a47/vwd.iso.

Le guide du codeur 16

Ch apit re

1 Gestion simple dune vidothque


Conguration .............................................. Classes et espaces de noms utiliss ............... Accs aux donnes ...................................... Interface utilisateur ..................................... Ralisation .................................................. Check-list .................................................... 18 18 18 22 24 28

Gestion simple dune vidothque

Si vous avez une collection de CD, de DVD, de timbres postaux, etc., vous savez combien il est difficile de trouver un bon logiciel pour la grer. Vous allez donc, au cours de ce chapitre, dvelopper votre propre application qui vous permettra, dune manire simple, de grer votre collection de DVD. Raliser une application, base sur une base de donnes, avec la plateforme .NET, est une tche facile. Vous vous en rendrez compte travers cet exemple, que vous pourrez adapter pour quil rponde mieux vos besoins.

1.1 Conguration
En plus de Visual Basic 2005 Express, que vous utiliserez pour crire votre programme, vous aurez besoin de SQL Server 2005 Express, qui sera votre systme de gestion de bases de donnes (SGBD). Ces deux produits sont mis disposition gratuitement sur Internet par Microsoft. Rfrez-vous aux annexes de ce livre pour les adresses.
Renvoi

1.2 Classes et espaces de noms utiliss


Vous ferez appel principalement des classes dans les espaces de noms System.Windows.Forms et System.Data. Cependant, vous ne vous en rendrez peut-tre pas compte car la plupart des manipulations se feront via le Concepteur de vues de Visual Basic 2005 Express.

1.3 Accs aux donnes


Une fois que vous aurez cr un projet de type Application Windows, vous pourrez commencer travailler sur votre application en commenant par la cration de la base de donnes sur laquelle elle se basera.

Cration de la base de donnes


Pour crer votre base de donnes, cliquez du bouton droit sur le nom de votre projet et slectionnez la commande Nouvel lment du sous-menu Ajouter. Saisissez MesDVDs comme nom de votre base.

18 Le guide du codeur

Accs aux donnes

m Figure 1-1 : Cration dune nouvelle base de donnes

LAssistant Conguration de source de donnes se lance lorsque vous cliquez sur OK. Vous pouvez le fermer en cliquant sur Terminer, car, votre nouvelle base ne contenant pas dlments, il ny a rien congurer pour le moment. Remarquez les chiers MesDVDs.mdf et app.config, qui sont apparus dans lExplorateur de solutions.

Travailler avec des bases de donnes dans Visual Basic 2005 Express Le chier visible dans lExplorateur de solutions, et qui se trouve dans le rpertoire de votre projet, correspond la version de votre base de donnes qui sera modie par lenvironnement de dveloppement. Il fait office de base vierge et il est copi dans le rpertoire de dploiement de votre application chaque fois que la solution est gnre. Le chier original ne contient souvent que la structure de la base. Cest dans la copie sur laquelle vous travaillerez lorsque vous dboguerez votre application ou lorsque vous la dploierez que vous allez stocker vos donnes.

Le premier chier correspond votre base de donnes SQL Server 2005. Le deuxime est un chier XML qui a t cr pour stocker, entre autres, la chane de connexion la base.

Le guide du codeur 19

Gestion simple dune vidothque

<connectionStrings> <add name="MesDVDs.My.MySettings.MesDVDsConnectionString" connectionString="Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\MesDVDs.mdf; Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" /> </connectionStrings>
m Chane de connexion la base de donnes

Dans la chane de connexion sont spcis des paramtres tels que les identiants et lemplacement de la base. Par dfaut, celle-ci se situe dans le mme dossier que lapplication.

Conguration des tables


Vous allez maintenant ajouter une table votre base de donnes pour y stocker des informations. Double-cliquez sur le chier .mdf que vous venez de crer : lExplorateur de bases de donnes apparat.

b Figure 1-2 : Ajouter des tables votre base de donnes

Cliquez du bouton droit sur le dossier Tables pour en ajouter une nouvelle. Crez les champs de votre base conformment limage suivante :

b Figure 1-3 : Champs de la base MesDVDs

Pour dnir la cl primaire de votre table, cliquez du bouton droit sur le champ ID et slectionnez la commande Dnir la cl primaire. Vous allez aussi modier les proprits de ce champ an que sa valeur soit auto-incrmente chaque insertion.
20 Le guide du codeur

Accs aux donnes

b Figure 1-4 : Auto-incrmenter la cl primaire

Pour nir, appelez votre table DVD en modiant la proprit (Nom) dans le volet des proprits.

Conguration de la source de donnes


Maintenant que votre table est congure, elle peut tre utilise comme source de donnes par lenvironnement de dveloppement. Affichez le volet Sources de donnes laide de la commande Afficher les sources de donnes du menu Donnes. Vous y trouverez une source appele
MesDVDsDataSet qui a t cre automatiquement en mme temps que votre

base de donnes. Cependant, elle nest pas encore lie la table qui se trouve maintenant dans celle-ci. Pour la lier, cliquez sur le bouton Congurer le DataSet laide de lAssistant et slectionnez la table DVD dans larborescence.

b Figure 1-5 : Cration dun DataSet typ

b Figure 1-6 : Les lments de la table DVD

Maintenant que votre source de donnes est congure, vous pouvez concevoir linterface graphique de votre application.
Le guide du codeur 21

Gestion simple dune vidothque

1.4 Interface utilisateur


Votre application sera constitue dune fentre qui affichera une liste de DVD dans sa partie suprieure et les dtails du lm slectionn dans la partie infrieure.

m Figure 1-7 : Interface graphique de lapplication termine

Mise en place des composants


Votre fentre propose, dans sa partie suprieure, une liste de lms qui se trouvent actuellement dans la base de donnes. Cette liste permettra de slectionner un lm pour afficher ses dtails dans la partie infrieure. De plus, les lments de la liste pourront tre ltrs par des mots-cls saisis dans le champ de texte qui se trouve au-dessus de celle-ci. Commencez par ajouter un contrle Label auquel vous changerez la proprit Text an quil affiche Filtrer : et ajoutez un contrle TextBox ct de celui-ci. Modiez la proprit (Name) du champ de texte en lui attribuant la valeur Filtre. Placez-les vers le haut du formulaire, mais laissez de la place pour insrer une barre doutils par la suite.

22 Le guide du codeur

Interface utilisateur

En dessous des contrles que vous venez dajouter, dposez un contrle de type DataGridView. Ignorez les options de conguration de la balise active pour le moment. Vous allez y revenir une fois que tous les contrles seront en place. Glissez maintenant un contrle GroupBox en dessous du DataGridView et placez une PictureBox et deux contrles de type Button lintrieur. Saisissez Dtails dans la proprit Text du contrle GroupBox pour modier son titre. Lun des boutons servira ouvrir une image et lautre la supprimer. Changez les proprits (Name) et Text de ceux-ci en leur donnant les valeurs Ouvrir et Supprimer. Vous pouvez aussi attribuer une image aux boutons, si vous le dsirez, en modiant leur proprit Image. Enn, saisissez la valeur Zoom dans la proprit SizeMode du contrle PictureBox an que les images soient redimensionnes sans tre dformes lorsquelles sont trop grandes pour leur conteneur.

Liaison des composants aux donnes


Avant de lier votre base de donnes certains composants que vous venez dinsrer, vous allez utiliser Visual Basic 2005 Express pour insrer des contrles. En ce sens, recourez la liste qui se trouve dans le volet Sources de donnes. Glissez le contrle Titre qui se trouve dans le volet Sources de donnes dans votre formulaire : deux contrles, Label et TextBox, sont automatiquement crs et, plus important encore, ce dernier est automatiquement li votre base de donnes. Cela veut dire que, pour un enregistrement donn, votre application sera capable dafficher dans ce champ la valeur de la colonne Titre de votre table DVD. Lorsque vous lui demanderez de faire une mise jour, elle saura aussi quelle est la colonne modier. Des contrles sont apparus dans la section de contrles non visibles de votre application :
j

MesDVDsDataSet stockera temporairement les donnes que vous rcuprerez partir de la base de donnes pendant que vous travaillez dessus. DVDBindingSource servira de source de donnes aux contrles lis la base, comme le contrle DataGridView que vous avez insr prcdemment et TextBox qui a t insr lorsque vous avez gliss le champ Titre dans le formulaire. DVDTableAdapter est lobjet que vous allez utiliser pour communiquer avec la base de donnes. DVDBindingNavigator correspond la barre doutils qui est apparue en haut de votre formulaire.

Le guide du codeur 23

Gestion simple dune vidothque

Vous allez maintenant ajouter les autres composants correspondant aux colonnes de votre table, commencer par lAnne. Toutefois, pour vous assurer que la valeur saisie pour lanne sera numrique, vous allez cliquer sur le bouton ch qui apparat ct du contrle pour slectionner le type NumericUpDown. Lorsque vous glissez le contrle sur le formulaire, un Label est ajout, comme pour le titre, mais la place du contrle TextBox, vous aurez un contrle NumericUpDown, qui ne peut contenir que des nombres. Ajoutez aussi les champs Description, Acteurs et Ralisateur. Pour nir, liez le contrle DataGridView votre source de donnes laide de sa balise active.

b Figure 1-8 : Lier le contrle DataGridView la source de donnes DVDBindingSource

Cliquez aussi sur le lien Modifier les colonnes pour supprimer toutes les colonnes, sauf Titre et Description. Il ne reste plus quun contrle lier votre base de donnes : PictureBox. Toutefois, vous devrez faire cette liaison en crivant le code ncessaire la main dans la section suivante.

1.5 Ralisation
La plupart de vos contrles ont t lis la source de donnes par lenvironnement de dveloppement de sorte que votre application est presque nie. Toutefois, il reste encore un contrle lier et quelques gestionnaires dvnements crire pour rendre lutilisation du programme plus agrable.

24 Le guide du codeur

Ralisation

Liaison de contrles par le code


An de lier les contrles restants la source de donnes DVDBindingSource, double-cliquez sur le formulaire pour accder au gestionnaire dvnements Load. En dessous de la ligne qui sert charger le MesDVDsDataSet avec les donnes de la base, liez la proprit ImageLocation du contrle PictureBox que vous avez insr dans votre formulaire la valeur de la colonne FichierImage.
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Me.DVDTableAdapter.Fill(Me.MesDVDsDataSet.DVD) Me.PictureBox1.DataBindings.Add( _ New Binding("ImageLocation", Me.DVDBindingSource, _ "FichierImage", True)) End Sub
m Liaison du contrle PictureBox la source de donnes

Maintenant que votre contrle est li la source de donnes, vous pouvez sauvegarder le chemin de limage affich dans le contrle PictureBox dans la base de donnes. Vous ne pouvez pas, pour linstant, associer une image ce contrle. Vous allez donc implmenter les gestionnaires dvnements Click des deux boutons que vous avez placs dans le formulaire pour associer, ou dissocier, une image et lenregistrement courant.
Private Sub Ouvrir_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Ouvrir.Click Dim OpenFileDialog As New OpenFileDialog If OpenFileDialog.ShowDialog = DialogResult.OK Then PictureBox1.ImageLocation = OpenFileDialog.FileName End If End Sub Private Sub Supprimer_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Supprimer.Click PictureBox1.ImageLocation = String.Empty End Sub
m Associer et dissocier une image et lenregistrement courant

La premire mthode est appele lorsque lon clique sur le bouton Ouvrir, et elle utilise un contrle OpenFileDialog pour chercher limage afficher dans le contrle PictureBox. Le chemin de limage est automatiquement associ lenregistrement courant, car la proprit ImageLocation est lie la colonne FichierImage. La deuxime mthode sert simplement effacer la valeur de la proprit ImageLocation, ce qui a pour effet deffacer limage du contrle et de la base.

Le guide du codeur 25

Gestion simple dune vidothque

Lemplacement des images tant donn que dans la base de donnes ne sont stocks que les chemins vers les images, si vous supprimez ces dernires, elles ne pourront plus tre affiches par lapplication. Pensez, par exemple, placer toutes vos images dans un dossier rserv votre collection pour viter ce problme.

Vous pouvez prsent ajouter des enregistrements dans la base de donnes laide de la barre doutils DVDBindingNavigator et de vos contrles lis. Cependant, linterface graphique vous autorise encore faire des manipulations qui peuvent gnrer des erreurs. Pour viter cela, vous aller crer quelques gestionnaires dvnements de plus dans la section suivante.

Amliorer lergonomie de lapplication


Pour empcher les utilisateurs de saisir des donnes quand aucun enregistrement nest slectionn, dsactivez tous les contrles lis la base de donnes. Heureusement, tous ces contrles se trouvent dans un contrle GroupBox, ce qui veut dire quil suffit de modier la proprit Enabled de ce dernier pour activer ou dsactiver tous les contrles quil contient. crivez donc le gestionnaire dvnements ListChanged du contrle DVDBindingSource, votre source de donnes. Ce type dvnement sera dclench au dmarrage de lapplication et chaque fois quun enregistrement de la base sera ajout ou supprim.
Private Sub DVDBindingSource_ListChanged( _ ByVal sender As System.Object, _ ByVal e As System.ComponentModel.ListChangedEventArgs) _ Handles DVDBindingSource.ListChanged If DVDBindingSource.Count = 0 Then GroupBox1.Enabled = False Else GroupBox1.Enabled = True If TitreTextBox.Text.Length = 0 Then TitreTextBox.Focus() End If End If End Sub
m Dsactiver les contrles quand aucun enregistrement nest slectionn

On vrie le nombre denregistrements dans la source de donnes et on dsactive le contrle GroupBox, et donc tous les contrles qui se trouvent lintrieur, si ce nombre est nul. Dans le cas contraire, les contrles doivent tre

26 Le guide du codeur

Ralisation

activs. Une fois les contrles activs, le curseur est plac dans le champ de texte correspondant au titre, sil est vide, pour permettre lutilisateur de saisir une valeur.

Tester lapplication Si vous testez votre application maintenant, vous pouvez utiliser la barre doutils et les champs lis pour ajouter des enregistrements dans la base. Toutefois, si vous lancez votre application partir de Visual Basic 2005 Express, la base de donnes de lapplication dans laquelle vous avez fait des modications sera crase par la base de donnes vierge de la solution. Vous devez chercher lexcutable de votre projet et le lancer directement si vous souhaitez tester la persistance des donnes.

Il y a un autre dtail gnant dans le fonctionnement de votre application : si vous ne cliquez pas sur le bouton Sauvegarder de la barre doutils avant de la quitter, vous perdez les donnes qui nont pas t enregistres. Vous allez donc grer lvnement FormClosing de votre formulaire pour enregistrer tous les changements avant de quitter lapplication.
Private Sub Form1_FormClosing(ByVal sender As Object, _ ByVal e As FormClosingEventArgs) _ Handles MyBase.FormClosing Me.DVDBindingSource.EndEdit() If Me.MesDVDsDataSet.DVD.GetChanges() IsNot Nothing Then Me.DVDTableAdapter.Update(Me.MesDVDsDataSet.DVD) End If End Sub
m Enregistrer les donnes avant de quitter lapplication

Ce code termine ldition de lenregistrement courant et vrie si la table a t modie grce la mthode GetChanges. Si cest le cas, elle est mise jour laide de la mthode Update du DVDTableAdapter.

Filtrer la collection
Lorsque votre collection aura atteint une certaine taille, vous dsirerez srement faire des recherches parmi vos DVD. Pour cette raison, vous avez prvu un champ de texte appel Filtrer dans votre formulaire. Il sagit, dailleurs, du seul contrle de saisie qui na pas t li la source de donnes. Vous allez crer un gestionnaire dvnements TextChanged pour ce champ de texte.

Le guide du codeur 27

Gestion simple dune vidothque

Private Sub Filtre_TextChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Filtre.TextChanged If Filtre.Text.Length > 2 Then Me.DVDBindingSource.Filter = String.Format( _ "{0} like %{1}% OR {2} like %{1}%", _ Me.MesDVDsDataSet.DVD.TitreColumn.ColumnName, _ Me.Filtre.Text, _ Me.MesDVDsDataSet.DVD.DescriptionColumn.ColumnName) End If End Sub
m Filtrer la source de donnes

Tout dabord, on vrie que le texte saisi comme ltre a, au moins, trois caractres. Une longueur infrieure nuirait aux performances de lapplication puisque un trop grand nombre de rsultats serait renvoy. Une fois la longueur du ltre vrie, il ne reste plus qu construire une clause WHERE pour lappliquer au contrle DVDBindingSource. La clause cre compare le texte saisi dans le champ Filtre avec le titre et la description de chaque enregistrement dans la base, ds que ce texte dpasse une longueur de deux caractres. Le fait dutiliser lvnement TextChanged au lieu dun bouton, par exemple, fait que les rsultats sont affichs immdiatement au fur et mesure que lutilisateur saisit sa requte. Votre application est maintenant prte grer votre collection de DVD.

1.6 Check-list
La ralisation de cette application vous a permis dapprendre :
j

crer et grer une base de donnes SQL Server 2005 Express partir de Visual Basic 2005 Express ; utiliser une base de donnes SQL Server 2005 Express comme source de donnes de lapplication ; lier des contrles de lapplication Windows aux donnes fournies par une source.

28 Le guide du codeur

Ch apit re

2 Gestion dun album de photos


Classes et espaces de noms utiliss ............... Interface utilisateur ..................................... Ralisation .................................................. Check-list .................................................... 30 30 36 41

Gestion dun album de photos

La plateforme .NET fournit des classes servant charger, manipuler et afficher des images de diffrents formats. Vous allez utiliser ces classes pour crire un programme permettant de visualiser et de raliser des transformations simples sur des photographies et des images au format JPEG. En dveloppant cette application, vous apprendrez vous servir des fonctionnalits de base de ces classes et vous dcouvrirez une astuce pour enregistrer des images qui sont charges en mmoire dans leur chier dorigine, une source derreurs souvent difficile dtecter.

2.1 Classes et espaces de noms utiliss


Il sagit ici dune application Windows. Vous aurez donc besoin de lespace de noms System.Windows.Forms. De plus, pour la manipulation dimages, vous aurez besoin de fonctionnalits de la librairie GDI+, qui sont encapsules dans des classes se trouvant dans lespace de noms System.Drawing. En particulier, les classes Image et Bitmap de lespace de noms System.Drawing vous permettront deffectuer toutes les oprations dont vous avez besoin. Enn, pour la manipulation des chiers, vous aurez besoin des classes de lespace de noms System.IO.

2.2 Interface utilisateur


Votre application sera constitue dun seul formulaire qui affichera, gauche, les aperus des images contenues dans un rpertoire choisi par lutilisateur, et droite, la photo slectionne en grand format ainsi que la barre doutils servant la manipuler.

m Figure 2-1 : Interface graphique de lalbum de photos

30 Le guide du codeur

Interface utilisateur

Prparer le formulaire principal


Commencez par crer un nouveau projet de type Application Windows. Il contiendra, par dfaut, un formulaire de dmarrage appel Form1. Vous allez changer ce nom par un libell plus parlant grce la proprit (Name) dans le volet des proprits. Appelez votre formulaire AlbumPhotos.

b Figure 2-2 : Personnaliser les proprits dun formulaire

Modiez aussi la proprit Text en saisissant le texte Album Photos.

b Figure 2-3 : Les proprits

Ces deux modications permettront non seulement de personnaliser linterface graphique de votre application, mais aussi de rendre votre code auto-descriptif de manire faciliter sa maintenance et sa comprhension par la suite. Enn, avant de commencer ajouter dautres lments de linterface graphique, glissez un contrle de type FolderBrowserDialog et un autre de type SaveFileDialog dans votre formulaire. Ces contrles ne sont pas visibles dans le formulaire, mais ils vous permettront de slectionner le rpertoire dans lequel
Le guide du codeur 31

Gestion dun album de photos

se trouvent les chiers que vous souhaitez parcourir ainsi que le nom dune image lorsque vous voudrez lenregistrer.

Barres de menus et dtat


Vous devez maintenant ajouter une barre de menus votre application. Cette barre ne contiendra quun seul menu, en loccurrence Fichier. Il permettra lutilisateur de charger dans lapplication les images dun rpertoire sur le disque dur ou de quitter lapplication. Glissez, partir de la bote outils, un contrle de type MenuStrip dans votre formulaire. Ce contrle se trouve dans la catgorie Menus et barres doutils. Remarquez comme la barre vient se positionner automatiquement en haut de votre formulaire.

b Figure 2-4 : Insrer une barre de menus dans un formulaire

Appelez le premier, et le seul, menu de la barre &Fichier. Lesperluette devant le nom du menu permettra lutilisateur dy accder par un raccourci clavier.

b Figure 2-5 : Saisie du menu

Une fois que vous avez ajout sous ce menu les commandes &Ouvrir et &Quitter, spares par un Separator, cliquez sur la commande Ouvrir an de congurer un raccourci clavier et une icne pour celle-ci. Cherchez la proprit ShortcutKeys et cliquez sur son bouton ch an de spcier le raccourci clavier [Ctrl]+[O]. Modiez ensuite, si vous le souhaitez, la proprit Image an de spcier une icne afficher ct de la commande.

32 Le guide du codeur

Interface utilisateur

b Figure 2-6 : Attribuer un raccourci une commande dun menu

b Figure 2-7 : Menu Fichier termin

Il ne reste plus qu insrer une barre dtat dans le formulaire en glissant, partir de la bote outils, un contrle de type StatusStrip. La barre viendra se positionner en bas du formulaire, permettant aux utilisateurs de lapplication de le redimensionner plus facilement.

Diviser un formulaire en deux


Le menu et la barre dtat en place, vous pouvez diviser lespace restant de votre application en deux parties : celle de gauche affichera les miniatures des chiers que lutilisateur aura chargs grce la commande Ouvrir, et celle de droite affichera une version grand format de limage que lutilisateur aura slectionne. Pour diviser votre formulaire, glissez dessus un contrle de type SplitContainer. Ce contrle se trouve dans la catgorie Conteneurs de la bote outils. Remarquez comme il adapte sa taille pour occuper automatiquement lespace entre la barre de menus et celle dtat. Double-cliquez sur la proprit IsSplitterFixed de votre SplitContainer pour changer sa valeur True an dviter que lutilisateur ne dplace le sparateur entre les deux parties de votre formulaire.

Le guide du codeur 33

Gestion dun album de photos

Panneau de gauche
gauche, votre application affichera une liste de miniatures des images se trouvant dans un rpertoire donn. Le meilleur moyen pour parvenir ce rsultat est dutiliser un contrle ListView. En effet, ce contrle permet, comme son nom lindique, dafficher des listes et, en plus, dassocier une image chaque lment de ladite liste. Toutefois, les images utilises ne se trouvent pas directement dans le contrle ListView. Vous devez ajouter dans votre formulaire un contrle ImageList, qui se trouve dans la section Composants de la bote outils. Congurez la proprit ImageSize du contrle pour que les images stockes aient une largeur et une hauteur de 100 pixels.

b Figure 2-8 : Modier la dimension des images dans une ImageList

Glissez maintenant, partir de la section Contrles communs de la bote outils, un contrle ListView dans le panneau de gauche de votre SplitContainer. Pour congurer ce contrle, cliquez sur la che de balise active et sur la commande Ancrer dans le conteneur parent. La liste occupera alors tout lespace disponible dans le panneau. Vriez ensuite que le champ Vue contient bien la valeur LargeIcon. Modiez la valeur si ce nest pas le cas. Associez lImageList que vous venez de crer au contrle en slectionnant la valeur approprie dans le champ Grand ImageList. Enn, pensez changer la valeur de la proprit MultiSelect an quun seul lment du contrle puisse tre slectionn la fois.

b Figure 2-9 : Conguration du contrle ListView

34 Le guide du codeur

Interface utilisateur

Panneau de droite
Ce panneau contiendra une barre doutils qui permettra de naviguer dans la liste et de manipuler les images, ainsi quun contrle PictureBox qui permettra dafficher limage slectionne. Commencez par dposer un contrle ToolStrip dans le Panel2 de votre SplitContainer. En cliquant sur la che de balise active, congurez les proprits Dock Bottom et GripStyle Hidden.

b Figure 2-10 : Positionner le contrle ToolStrip

Ajoutez des boutons et des sparateurs votre barre doutils pour arriver au rsultat suivant :
b Figure 2-11 : Barre doutils de lalbum de photos

Dans lordre, les boutons sappellent : PrecedentToolStripButton, SuivantToolStripButton, RetournerHToolStripButton, RetournerVToolStripButton, PivoterDToolStripButton, PivoterGToolStripButton, CopierToolStripButton, EnregistrerToolStripButton, EnregistrerSousToolStripButton, SupprimerToolStripButton. Les noms et les images parlent deux-mmes. Pensez mettre la proprit Enabled de tous ces boutons False, an quils ne soient pas accessibles avant le chargement des images. Finalement, glissez un contrle PictureBox dans lespace inoccup et, laide de la che de balise active, ancrez-le au conteneur parent et slectionnez le mode de redimensionnement CenterImage. Vous tes maintenant prt donner vie votre interface.

Le guide du codeur 35

Gestion dun album de photos

2.3 Ralisation
Il y a trois rgions dans lapplication avec lesquelles lutilisateur peut interagir : le menu Fichier, la ListBox qui affichera les images et, enn, la barre doutils. Vous allez crire des gestionnaires dvnements pour les contrles de chacune de ces rgions. Si vous lancez votre application telle quelle est et si la taille des panneaux du SplitContainer ne vous convient pas, xez la largeur du panneau de gauche dans le gestionnaire dvnements Load de votre formulaire :
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) SplitContainer1.SplitterDistance = 160 End Sub
m Dnition de la taille des panneaux du SplitContainer

Ce dtail rgl, vous pouvez commencer programmer le menu Fichier.

Menu Fichier
Le code de la commande Quitter est trivial (un simple appel la mthode Close du formulaire) et ne sera donc pas dcrit en dtail. En revanche, le gestionnaire dvnements Click de la commande Ouvrir est lune des mthodes les plus importantes de lapplication. Voici son implmentation :
Private Sub OuvrirToolStripMenuItem_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) FolderBrowserDialog1.SelectedPath = _ My.Computer.FileSystem.SpecialDirectories.MyPictures If FolderBrowserDialog1.ShowDialog = DialogResult.OK _ Then ImageList1.Images.Clear() ListView1.Items.Clear() For Each file As String In _ Directory.GetFiles(FolderBrowserDialog1.SelectedPath, _ "*.jp*g") Dim index As Integer = _ ImageList1.Images.Add(ObtenirImage(file), _ Nothing) Dim photo As ListViewItem = New _ ListViewItem(Path.GetFileNameWithoutExtension(file), index) photo.Tag = file ListView1.Items.Add(photo) Next For Each tsi As ToolStripItem In ToolStrip1.Items

36 Le guide du codeur

Ralisation

tsi.Enabled = (ListView1.Items.Count > 0) Next If (ListView1.Items.Count > 0) Then ListView1.Items(0).Selected = True Else PictureBox1.Image = Nothing End If End If End Sub
m Peupler une ListBox avec les images contenues dans un rpertoire

La plupart du code est auto-explicatif : on commence par congurer le FolderBrowserDialog pour que le chemin par dfaut soit celui du rpertoire Mes Images et ensuite on laffiche. Si lutilisateur valide un choix en utilisant le bouton OK, le travail commence. Tout dabord, on doit supprimer les ventuelles images susceptibles dtre stockes dans lImageList ainsi que les miniatures affiches dans la ListView. Ensuite on itre sur la liste de chiers ayant les extensions .jpg ou .jpeg dans le rpertoire slectionn par lutilisateur, que lon rcupre en utilisant la mthode GetFiles de la classe Directory. Pour chaque image, on cre une miniature dans lImageList. Limage que lon insre dans lImageList na pas t cre avec la mthode FromFile de la classe Image ou encore avec le constructeur de la classe Bitmap, mais avec une fonction appele ObtenirImage. Retenez pour linstant que cette fonction retourne un objet de type Image, les raisons de ce choix sont expliques dans le prochain encadr. Ensuite, un ListViewItem est cr auquel on associe le nom du chier, sans extension, et le numro dimage obtenu lorsque lon a cr la miniature dans lImageList. La proprit Tag de ce ListViewItem contiendra le chemin complet vers limage originale, qui sera utilis plusieurs reprises par la suite. Enn, llment est ajout dans le contrle ListView. Une fois les miniatures cres et affiches, il faut activer ou dsactiver les boutons de la barre doutils selon que images ont t trouves ou non dans le rpertoire fourni, ce que lon peut aisment dterminer en vriant que le nombre dlments dans la ListView est suprieur 0. Ensuite, il suffit ditrer sur la collection Items de la barre et dattribuer la valeur approprie la proprit Enabled de chaque bouton. Finalement, sil y a bien des lments dans le contrle ListView, le premier dentre eux est slectionn, ce qui affichera limage correspondante dans le contrle PictureBox. Dans le cas contraire, limage de ce dernier est efface.

Le guide du codeur 37

Gestion dun album de photos

Travailler avec des images Bien que la plateforme .NET prvoie maintes possibilits pour charger une image en mmoire, cela reprsente un danger potentiel : on ne peut pas garantir que les objets concerns auront libr le chier source lorsque lon voudra rcrire dessus, moins de les dtruire. La solution consiste dtruire lobjet qui aura charg limage le plus vite possible et ne manipuler quune copie tout au long du programme. Cest justement ce que fait la fonction

ObtenirImage : Private Function ObtenirImage(ByRef chemin As String) _ As Image Dim original As Bitmap = New Bitmap(chemin) Dim copie As Bitmap = New Bitmap(original.Width, _ original.Height, _ original.PixelFormat) Dim g As Graphics = Graphics.FromImage(copie) g.DrawImage(original, 0, 0) g.Dispose() original.Dispose() Return copie End Function
m ObtenirImage charge une image en mmoire et en renvoie une copie

Afficher limage slectionne


Vous affichez dsormais les miniatures des images dans le contrle ListView gauche. Vous devez maintenant grer lvnement SelectedIndexChanged de ce contrle an que limage slectionne soit affiche dans le contrle PictureBox.
Private Sub ListView_SelectedIndexChanged(ByVal sender _ As System.Object, ByVal e As System.EventArgs) If ListView1.SelectedItems.Count > 0 Then PictureBox1.Image = _ ObtenirImage(ListView1.SelectedItems(0).Tag) If (PictureBox1.Image.Width > Width Or _ PictureBox1.Image.Height > Height) Then PictureBox1.SizeMode = PictureBoxSizeMode.Zoom Else PictureBox1.SizeMode = _ PictureBoxSizeMode.CenterImage End If End If End Sub
m Afficher limage slectionne dans le contrle PictureBox

38 Le guide du codeur

Ralisation

Aprs avoir vri quil y a bien une miniature slectionne, vous pouvez utiliser la fonction ObtenirImage pour charger la photo partir du chemin stock dans la proprit Tag du premier objet slectionn du contrle ListView. Si limage est plus grande que le contrle PictureBox, elle est affiche en mode Zoom, sinon elle est centre dans le contrle.

Barre doutils
tant donn la similitude de nombreux boutons de la barre doutils, la gestion de leurs vnements Click peut se faire avec seulement cinq gestionnaires dvnements simples. Commencez par les boutons permettant la navigation :
Private Sub Navigation(ByVal sender As System.Object, _ ByVal e As System.EventArgs) With ListView1 If .Items.Count > 0 Then Dim SelectedIndex As Integer If .SelectedIndices.Count = 0 Then SelectedIndex = 0 Else SelectedIndex = .SelectedIndices(0) If sender.Equals(PrecedentToolStripButton) _ And .SelectedIndices(0) > 0 Then SelectedIndex = .SelectedIndices(0) - 1 ElseIf sender.Equals(SuivantToolStripButton) _ And .SelectedIndices(0) < .Items.Count - 1 Then SelectedIndex = .SelectedIndices(0) + 1 End If End If .Items(SelectedIndex).Selected = True .EnsureVisible(SelectedIndex) End If End With End Sub
m Gestionnaire dvnements pour les boutons de navigation

Cette mthode rcupre lindex de la miniature slectionne et, en fonction du bouton slectionn et de la disponibilit des images, slectionne lindex prcdent ou suivant, ce qui provoquera laffichage de la photo en grand format dans le contrle PictureBox. La mthode EnsureVisible sassure que llment slectionn sera toujours visible dans le contrle ListView. Le gestionnaire des quatre boutons de transformation est un peu plus compliqu car il y a plus doptions considrer :

Le guide du codeur 39

Gestion dun album de photos

Private Sub Transformations(ByVal sender As _ System.Object, ByVal e As System.EventArgs) With PictureBox1 If sender.Equals(RetournerHToolStripButton) Then .Image.RotateFlip(RotateFlipType.RotateNoneFlipX) ElseIf sender.Equals(RetournerVToolStripButton) Then .Image.RotateFlip(RotateFlipType.RotateNoneFlipY) ElseIf sender.Equals(PivoterDToolStripButton) Then .Image.RotateFlip(RotateFlipType.Rotate90FlipNone) ElseIf sender.Equals(PivoterGToolStripButton) Then .Image.RotateFlip(RotateFlipType.Rotate270FlipNone) End If If (.Image.Width > .Width Or _ .Image.Height > .Height) Then .SizeMode = PictureBoxSizeMode.Zoom Else .SizeMode = PictureBoxSizeMode.CenterImage End If .Refresh() End With End Sub
m Gestionnaire dvnements des boutons de transformation

On utilise la mthode RotateFlip avec une valeur de lnumration RotateFilpType pour raliser la transformation. Ensuite, on appelle la mthode Refresh sur le contrle PictureBox an de sassurer que les transformations seront visibles ds la n de lexcution de la procdure. Les gestionnaires des boutons Copier et Supprimer sont si simples quils ne mritent pas que lon sattarde dessus. Souvenez-vous seulement que la proprit Tag de chaque ListViewItem contient le chemin complet du chier image.
Private Sub Copier(ByVal sender As System.Object, _ ByVal e As System.EventArgs) My.Computer.Clipboard.SetImage(PictureBox1.Image) End Sub Private Sub Supprimer(ByVal sender As System.Object, _ ByVal e As System.EventArgs) File.Delete(ListView1.SelectedItems(0).Tag) ListView1.Items.Remove(ListView1.SelectedItems(0)) PictureBox1.Image = Nothing End Sub
m Gestionnaires dvnments des boutons Copier et Supprimer

40 Le guide du codeur

Check-list

Finalement, tant donn les prcautions qui ont t prises lors du chargement des photos, le gestionnaire des boutons Enregistrer et Enregistrer Sous est lui aussi fort simple. Il suffit de dterminer, en fonction du bouton sur lequel lutilisateur a cliqu, si limage doit tre enregistre son emplacement dorigine ou sil est ncessaire dafficher un SaveFileDialog an de demander un nouvel emplacement. Ensuite, on utilise la mthode Save de lImage du PictureBox pour enregistrer la photo et lon met jour le contrle ListView avec une nouvelle miniature.
Private Sub Enregistrer(ByVal sender As Object, _ ByVal e As System.EventArgs) Dim chemin As String = Nothing If sender.Equals(EnregistrerToolStripButton) Then chemin = ListView1.SelectedItems(0).Tag ElseIf (SaveFileDialog1.ShowDialog = _ Windows.Forms.DialogResult.OK) Then chemin = SaveFileDialog1.FileName End If If Not String.IsNullOrEmpty(chemin) Then PictureBox1.Image.Save(chemin) ImageList1.Images.Item( _ ListView1.SelectedItems(0).Index) = New Bitmap(PictureBox1.Image, 100, 100) ListView1.Refresh() End If End Sub
m Gestionnaire dvnements des boutons denregisterment

Les fonctionnalits de base tant implmentes, vous pouvez proter de votre nouvel album de photos.

2.4 Check-list
Le dveloppement de cette application vous a permis dapprendre :
j j

manipuler des chiers au format JPEG avec la plateforme .NET ; viter des erreurs lors de lcriture de chiers image chargs avec les classes Bitmap et Image ; raliser des transformations simples sur des images, laide de ces mmes classes.

Le guide du codeur 41

Ch apit re

3 Envoi de messages chiffrs


Classes et espaces de noms utiliss ............... Interface utilisateur ..................................... Ralisation .................................................. Check-list .................................................... 44 44 48 56

Envoi de messages chiffrs

Vous allez tirer parti, dans ce chapitre, des fonctionnalits de messagerie et de cryptographie que propose la plateforme .NET. Lapplication que vous obtiendrez vous permettra de chiffrer vos messages importants avant de les envoyer par courrier lectronique. Vous utiliserez pour cela un algorithme de chiffrage symtrique, dont le fonctionnement vous sera expliqu en dtail.

3.1 Classes et espaces de noms utiliss


Comme pour toute application Windows, vous aurez besoin de lespace de noms System.Windows.Forms. De plus, votre application fera appel de nombreuses bibliothques de classes de base, telles que System.Net.Mail pour lenvoi des messages et System.Securty.Cryptography pour le chiffrement. Enn, vous aurez besoin de quelques classes auxiliaires qui se trouvent dans les espaces de noms System.Text et System.IO.

3.2 Interface utilisateur


Vous allez crer deux formulaires pour cette application : un premier, le principal, qui permettra aux utilisateurs de composer un message et de lenvoyer, chiffr, sil le dsire, un destinataire, et un second, qui lui permettra de dchiffrer les messages quil reoit.

Formulaire principal
Lorsque vous crerez un nouveau projet de type Application Windows, Visual Basic 2005 Express prparera pour vous un formulaire qui sera affich au dmarrage de lapplication. Vous allez ajouter des contrles ce formulaire pour permettre un utilisateur denvoyer des messages par courrier lectronique.

m Figure 3-1 : Formulaire principal de lapplication

44 Le guide du codeur

Interface utilisateur

Commencez par glisser un contrle de type MenuStrip, un autre de type ToolStrip et un autre de type StatusStrip, que vous trouverez dans la section Menus et barres doutils de la bote outils, dans le formulaire. Ces contrles vont se placer automatiquement leurs positions habituelles, cest--dire, en haut du formulaire pour les deux premiers, et en bas pour le dernier.

b Figure 3-2 : Contrles MenuStrip, StatusStrip et ToolStrip dans la bote outils

Dans cette application, le contrle StatusStrip aura un rle purement dcoratif. En revanche, vous devrez ajouter des menus et des boutons au MenuStrip et au ToolStrip pour pouvoir les utiliser pour raliser des actions. Ajoutez maintenant les menus et les commandes du contrle MenuStrip. Vous devez obtenir un menu Fichier avec les commandes Nouveau et Quitter, et un menu Outils avec la commande Dchiffrer.

Cration de menus Vous pouvez utiliser la che de balise active qui apparat droite du contrle MenuStrip lorsque celui-ci est slectionn, pour insrer automatiquement les menus les plus utiliss.

m Figure 3-3 : Insertion dlments standard dans un MenuStrip laide de la che de balise active

Le guide du codeur 45

Envoi de messages chiffrs

Les menus ajouts sont dj congurs avec des images et des options daccessibilit, ce qui vous fera gagner du temps. Vous tes libre ensuite de modier ou de supprimer les menus dont vous navez pas besoin.

Ajoutez deux boutons dans la barre doutils grce au bouton qui apparat lorsque le contrle est slectionn. Renommez-les en modiant leur proprit (Name) : le premier sappellera Envoyer et le deuxime ChiffrerEtEnvoyer. Choisissez des images pour chacun des boutons en modiant leur proprit Image et modiez aussi leur proprit Text an que le premier affiche Envoyer et lautre Chiffrer et Envoyer. Pour que les boutons affichent limage et le texte, vous devrez aussi modier leur proprit DisplayStyle et lui attribuer la valeur ImageAndText.
b Figure 3-4 : Barre doutils

Avant de vous occuper des autres composants de votre formulaire, dposez un contrle de type TableLayoutPanel dans celui-ci. Il permet de placer les contrles dun formulaire de manire tabulaire, ce qui est appropri dans le cas de la prsente application. Pour congurer TableLayoutPanel, cliquez sur le lien Modifiez les lignes et les colonnes du menu de la balise active. La fentre Styles de ligne et de colonne souvre. Dans la liste droulante Afficher, slectionnez Lignes et utilisez le bouton Ajouter pour insrer trois nouvelles lignes an den avoir cinq au total. Enn, dans le volet des proprits, attribuez la valeur Fill la proprit Dock du contrle TableLayoutPanel an que celui-ci occupe tout lespace disponible entre les barres doutils et dtat. Ne vous souciez pas de la taille des cellules pour linstant, vous y reviendrez ds que les autres composants seront en place. Glissez maintenant quatre contrles Label dans la premire cellule des quatre premires lignes, et quatre contrles TextBox ct de celles-ci, ainsi quun cinquime dans la premire colonne de la dernire ligne. Modiez les proprits des contrles que vous venez dajouter comme suit :
Proprits des contrles du formulaire principal Contrles Label Contrles TextBox

Text De : : Objet :

Dock Right

(Name) DeTextBox ATextBox ObjetTextBox

Dock Fill

46 Le guide du codeur

Interface utilisateur

Proprits des contrles du formulaire principal Contrles Label Contrles TextBox

Mot de passe :

MdpTextBox MessageTextBox

Slectionnez le contrle MessageTextBox et modiez ses proprits Multiline True et ColumnSpan 2, pour pouvoir crire plusieurs lignes et pour que la zone de texte stende sur les deux colonnes de la ligne. Modiez aussi la proprit UseSystemPasswordChar du contrle MdpTextBox en lui attribuant la valeur True, pour que les caractres du mot de passe soient remplacs par un symbole spcial lors de laffichage. Pour terminer, ouvrez la fentre Styles de ligne et de colonne du contrle TableLayoutPanel pour changer la taille des lignes et des colonnes. Slectionnez loption Redimensionner automatiquement dans la rubrique Type de taille pour toutes les lignes et toutes les colonnes. Si vous faites cela lorsque vous ajoutez les lignes supplmentaires votre contrle, vous obtenez des lignes et des colonnes trop petites pour y placer les diffrents lments. Maintenant que le formulaire principal est termin, il faut crer un deuxime formulaire qui vous permettra de dchiffrer vos messages.

Formulaire de dchiffrement
Pour ajouter un formulaire votre projet, cliquez du bouton droit sur le nom de celui-ci et slectionnez Formulaire Windows dans le sous-menu Ajouter. Appelez votre nouveau formulaire Dechiffrer, en crivant cette valeur dans le champ de texte Nom et en cliquant sur OK. Vous allez utiliser un nouveau contrle TableLayoutPanel dans ce formulaire, qui aura trois lignes et trois colonnes. En plus, vous affecterez sa proprit Dock la valeur Fill pour que la grille comprenne tout le formulaire. Ajoutez maintenant des contrles Label, TextBox et Button dans la premire ligne, et deux TextBox dans la deuxime et la troisime ligne. Congurez-les en vous basant sur le tableau suivant :
Proprits des contrles du formulaire de dchiffrement (Name) Text Dock Multiline

Label TextBox Button MdpTextBox

Mot de passe : Dchiffrer

Fill Fill

Le guide du codeur 47

Envoi de messages chiffrs

Proprits des contrles du formulaire de dchiffrement (Name) Text Dock Multiline

TextBox TextBox

MessageChiffre MessageClair

Fill Fill

True True

En plus, congurez le premier contrle TextBox pour que les caractres du mot de passe soient remplacs lors de laffichage, et les deux contrles TextBox suivants pour quils stendent sur trois colonnes. Finalement, dans la fentre Styles de ligne et de colonne du contrle TableLayoutPanel, spciez le redimensionnement automatique pour la premire et la troisime colonne, et une largeur de 100 % pour la deuxime. De la mme manire, spciez le redimensionnement automatique pour la premire ligne, et des valeurs de 50 % pour les deux lignes suivantes.

b Figure 3-5 : Fentre de dchiffrement termine

Les deux fentres de votre interface graphique sont dsormais termines. Vous pourrez passer la ralisation de votre application.

3.3 Ralisation
Votre application a, principalement, deux parties fonctionnelles : lenvoi de messages par courrier lectronique et le chiffrement et dchiffrement de ces messages. Vous allez commencer par grer le chiffrement, qui requiert la cration dune classe auxiliaire.

48 Le guide du codeur

Ralisation

Classe auxiliaire pour la cryptologie


Pour accder aux fonctions de cryptologie depuis les deux fentres de votre application, sans avoir rcrire plusieurs fois le mme code, vous allez les encapsuler dans une classe auxiliaire. Ajoutez une nouvelle classe dans votre projet en cliquant du bouton droit sur le nom de votre projet et en slectionnant Classe dans le sous-menu Ajouter. Appelez votre classe Crypto. Votre classe contiendra trois constantes, qui serviront congurer le chiffrement et le dchiffrement, ainsi que deux mthodes statiques, qui greront les oprations proprement dites.
Const TailleSalt As Integer = 16 Const TailleCle As Integer = 32 Const TailleIV As Integer = 16
m Constantes servant congurer le fonctionnement de la classe Crypto

Ces trois constantes servent dnir les tailles, en octets, de certains lments ncessaires aux oprations de chiffrement et de dchiffrement :
j

Le salt est un jeu alatoire doctets utilis pour rendre plus difficile le dcryptage du mot de passe employ pour la cration de la cl de chiffrement. La cl de chiffrement sera celle utilise pour encoder le message. Elle nest pas gale au mot de passe, car elle doit avoir une longueur prcise, mais elle est gnre partir de celui-ci. Le fait dutiliser un salt pour gnrer la cl fait que celle-ci est diffrente chaque fois quelle est gnre. Il faudra communiquer le salt pour permettre la gnration de la bonne cl lors du dchiffrement. Le vecteur dinitialisation (IV) est un jeu alatoire doctets dont le but est de rendre plus difficile le dcryptage dun message chiffr. En effet, lutilisation du IV empche un bloc de texte brut donn, lorsquil apparat plusieurs reprises dans le message chiffrer, dtre encod de la mme manire. Cela rend plus difficile lanalyse du texte chiffr.

Vient ensuite la mthode de chiffrement :


Public Shared Function Chiffrer( _ ByRef messageClair As String, ByRef mdp As String) _ As String Dim octetsClair() As Byte = _ Encoding.Unicode.GetBytes(messageClair) Dim octetsMdp As New Rfc2898DeriveBytes(mdp, TailleSalt) Dim ms As New MemoryStream
Le guide du codeur 49

Envoi de messages chiffrs

Dim algo As New RijndaelManaged algo.Key = octetsMdp.GetBytes(TailleCle) algo.IV = octetsMdp.GetBytes(TailleIV) Dim cs As New CryptoStream(ms, algo.CreateEncryptor(), _ CryptoStreamMode.Write) cs.Write(octetsClair, 0, octetsClair.Length) cs.Close() Dim messageChiffre() As Byte = ms.ToArray() Dim resultat(octetsMdp.Salt.Length + _ messageChiffre.Length - 1) As Byte Array.ConstrainedCopy(octetsMdp.Salt, 0, _ resultat, 0, octetsMdp.Salt.Length) Array.ConstrainedCopy(messageChiffre, 0, resultat, _ octetsMdp.Salt.Length, messageChiffre.Length) Return Convert.ToBase64String(resultat) End Function
m Mthode de chiffrement

La mthode Chiffrer prend en paramtre une chane de caractres et le mot de passe servant la chiffrer. On utilise lalgorithme Rijndael pour chiffrer votre message. Mais tout dabord, on transforme le message encoder en un tableau doctets laide de la classe Encoding, tandis que la classe Rfc2898DeriveBytes sert gnrer un jeu doctets partir duquel on extraira les octets correspondant la cl de chiffrement et au IV. Le constructeur de cette classe gnre en plus un salt de la taille indique quil faudra concatner au message chiffr par la suite. Les oprations de chiffrement et de dchiffrement sont ralises non pas avec des donnes stockes dans des variables, mais avec des ux doctets. Cette particularit permet dencoder de grandes quantits de donnes et de rediriger les octets chiffrs vers un chier ou vers le rseau de manire efficace. Mais elle implique aussi de crer un tel ux. tant donn que lon souhaite rcuprer le message chiffr en mmoire pour constituer le message lectronique, on doit crer un ux en mmoire avec la classe MemoryStream. On doit ensuite crer un objet reprsentant lalgorithme de chiffrement choisi. On utilise la version manage de lalgorithme Rijndael, reprsent par la classe RijndaelManaged. Rijndael est un algorithme de chiffrage symtrique, ce qui veut dire que la mme cl est utilise pour le chiffrement et pour le dchiffrement des donnes. Comme on gnre la cl de chiffrement de manire pseudo-alatoire en utilisant le mot de passe fourni et un salt, on doit fournir ce dernier avec le message chiffr pour gnrer de nouveau la cl et dchiffrer le message.
50 Le guide du codeur

Ralisation

On congure la cl et le vecteur dinitialisation de lobjet RijndaelManaged en extrayant des octets de lobjet Rfc2898DeriveBytes avec sa mthode GetBytes et en les stockant dans les proprits Key et IV. Il est dsormais possible de chiffrer un message. En ce sens, on a besoin dun ux spcial, le CryptoStream, que lon cre en spciant le ux qui recevra le message chiffr, un objet chiffreur cr avec la mthode CreateEncryptor de lalgorithme et la valeur CryptoStreamMode.Write pour spcier que lon souhaite crire dans le premier paramtre. Il ne reste plus qu crire le ux doctets que lon souhaite chiffrer dans le ux de chiffrement laide de sa mthode Write et de le fermer avec sa mthode Close, une fois lopration termine. Finalement, on rcupre le message chiffr, qui se trouve dans lobjet MemoryStream, dans un tableau doctets et lon prpare un autre tableau doctets pour y stocker le salt et le message chiffr. Comme le salt et le message se trouvent dj sous forme de tableaux, on peut utiliser la mthode statique ConstrainedCopy pour copier ces deux valeurs dans le tableau resultat. On peut retourner le rsultat du chiffrement sous forme de chane de caractres aprs avoir converti le tableau resultat en utilisant la mthode ToBase64String de la classe Convert. Cette conversion assure que, quels que soient les octets rsultant du chiffrement, ils seront tous reprsentables lcran, dans un chier texte ou encore dans un courrier lectronique. La procdure de dchiffrement fonctionne linverse du processus que vous venez dimplmenter.
Public Shared Function Dechiffrer( _ ByRef messageChiffre As String, ByRef mdp As String) _ As String Dim message() As Byte = _ Convert.FromBase64String(messageChiffre) Dim salt(TailleSalt - 1) As Byte Dim octetsChiffres( _ message.Length - TailleSalt - 1) As Byte Array.ConstrainedCopy(message, 0, salt, 0, TailleSalt) Array.ConstrainedCopy(message, TailleSalt, _ octetsChiffres, 0, octetsChiffres.Length) Dim octetsMdp As New Rfc2898DeriveBytes(mdp, TailleSalt) octetsMdp.Salt = salt Dim ms As New MemoryStream Dim algo As New RijndaelManaged algo.Key = octetsMdp.GetBytes(TailleCle) algo.IV = octetsMdp.GetBytes(TailleIV)

Le guide du codeur 51

Envoi de messages chiffrs

Dim cs As New CryptoStream(ms, algo.CreateDecryptor(), _ CryptoStreamMode.Write) cs.Write(octetsChiffres, 0, octetsChiffres.Length) cs.Close() Return Encoding.Unicode.GetString(ms.ToArray()) End Function
m Mthode de dchiffrement

On rcupre un tableau doctets partir dune chane de caractres encode en base 64 et on la spare en deux autres tableaux doctets pour rcuprer le salt et le message chiffr. On recre ensuite la cl de chiffrage comme on la fait pour le chiffrement, et lon prpare un objet RijndaelManaged et un ux MemoryStream pour les rsultats, et un ux CryptoStream pour lopration de dchiffrement. Cependant, lors de la cration de ce dernier, il faut passer un dchiffreur en tant que second paramtre grce la mthode CreateDecryptor de lalgorithme. Une fois le dchiffrement effectu, on peut rcuprer une chane de caractres grce la classe Encoding. La classe auxiliaire est termine.

Envoyer des messages chiffrs


Dans la fentre principale de votre application, vous avez ajout deux boutons qui permettent denvoyer des courriers lectroniques chiffrs ou bruts. Vous allez associer un gestionnaire dvnements ces deux boutons pour permettre lutilisateur denvoyer par courrier lectronique le message quil a saisi, ventuellement chiffr avec le mot de passe sil le dsire. Slectionnez les deux boutons en cliquant dessus tout en appuyant sur la touche [Ctrl]. Dans le volet des proprits, cliquez sur le bouton en forme dclair pour afficher les vnements des deux boutons.

b Figure 3-6 : Cration dun gestionnaire dvnements Click

52 Le guide du codeur

Ralisation

Saisissez EnvoyerMessage comme nom du gestionnaire dvnements Click et appuyez sur la touche [Entre] pour crer la mthode.
Private Sub EnvoyerMessage(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Envoyer.Click, CrypterEnvoyer.Click Dim smtp As New SmtpClient("smtp.monserveur.com") AddHandler smtp.SendCompleted, _ AddressOf Envoyer_SendCompleted Dim message As New MailMessage() message.From = New MailAddress(DeTextBox.Text) message.To.Add(New MailAddress(ATextBox.Text)) message.Subject = ObjetTextBox.Text If sender.Equals(Envoyer) Then message.Body = MessageTextBox.Text Else message.Body = Crypto.Chiffrer( _ MessageTextBox.Text, MdpTextBox.Text) End If smtp.SendAsync(message, message.Subject) End Sub
m Prparer et envoyer un message lectronique

On cre un client SMTP laide de la classe SmtpClient. Le constructeur de cette classe a besoin de ladresse du serveur SMTP pour envoyer des messages. On congure un gestionnaire dvnements SendCompleted de lobjet cr. Il permettra de savoir si le message a t envoy avec succs. On cre ensuite un nouvel objet de type MailMessage, qui reprsente le message lectronique. On congure cet objet laide des valeurs saisies par lutilisateur dans le formulaire. Il ne reste plus qu dcider, en fonction du bouton sur lequel lutilisateur a cliqu, si le corps du message doit tre chiffr laide de la classe auxiliaire Crypto, et lenvoyer en utilisant la mthode SendAsync du client SMTP. Le premier paramtre fournit au client toutes les informations ncessaires pour dlivrer le message, tandis que le deuxime nest l que pour des raisons purement informatives. Il pourra tre utilis dans le gestionnaire dvnements SendCompleted.
Private Sub Envoyer_SendCompleted( ByVal sender As System.Object, _ ByVal e As System.ComponentModel.AsyncCompletedEventArgs) If e.Error IsNot Nothing Then

Le guide du codeur 53

Envoi de messages chiffrs

Dim messageErreur As New StringBuilder() messageErreur.AppendFormat("Erreur lors de lenvoi _ du message [{0}]. ", e.UserState.ToString()) messageErreur.AppendLine(e.Error.Message) If (e.Error.InnerException IsNot Nothing) Then messageErreur.AppendFormat("Message : {0}", _ e.Error.InnerException.Message) End If MessageBox.Show(messageErreur.ToString(), _ "Erreur", MessageBoxButtons.OK, _ MessageBoxIcon.Error) Else MessageBox.Show("Message envoy !", "Succs", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End If End Sub
m Gestionnaire dvnements SendCompleted

Dans ce gestionnaire, on vrie simplement la prsence dune erreur lors de lenvoi du message et lon affiche des dtails sur celle-ci. Sil ny a pas derreur, on affiche un message informant du succs de lopration.

Dchiffrer les messages


Le deuxime formulaire permettra de dchiffrer les messages que lon vous aura envoys en utilisant votre application. Le code que vous devez crire pour cela est simple. Ouvrez le formulaire Dechiffrer et double-cliquez sur le bouton disponible. Compltez la mthode cre comme suit :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try TexteClair.Text = _ Crypto.Dechiffrer(TexteChiffre.Text, MotDePasse.Text) Catch ex As Exception Msgbox("Mot de passe incorrect ou message corrompu !", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub
m Dchiffrer un message

On utilise la mthode Dechiffrer de la classe auxiliaire pour dchiffrer le texte qui se trouve dans le premier champ de texte. Ce code doit se trouver dans un bloc Try Catch, car si le mot de passe fourni est incorrect ou si le texte chiffr
54 Le guide du codeur

Ralisation

a t altr, une exception sera leve. Il faut grer cette exception pour informer lutilisateur de lchec.

Touches nales
Les deux formulaires sont dsormais fonctionnels. Or vous ne pouvez pas accder au deuxime partir du formulaire principal. Toutefois, lors de la prparation de ce dernier, vous avez prvu des commandes dans les diffrents menus, qui permettent, entre autres, cet accs. Il ne reste plus qu implmenter leurs gestionnaires dvnements en double-cliquant sur chacun des boutons et en crivant leur code comme suit :
Menu Fichier Private Sub NouveauToolStripMenuItem_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles NouveauToolStripMenuItem.Click DeTextBox.Text = String.Empty ATextBox.Text = String.Empty ObjetTextBox.Text = String.Empty MdpTextBox.Text = String.Empty MessageTextBox.Text = String.Empty End Sub Private Sub QuitterToolStripMenuItem_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles QuitterToolStripMenuItem.Click Close() End Sub Menu Outils Private Sub DechiffrerToolStripMenuItem_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles PersonnaliserToolStripMenuItem.Click Dim d As New Dechiffrer() d.Show() End Sub
m Gestionnaires dvnements des diffrentes commandes des menus du formulaire principal

La commande Nouveau du menu Fichier servira donc vider tous les champs du formulaire principal et la commande Quitter du mme menu servira, logiquement, le fermer. La commande Dchiffrer du menu Outils crera un nouveau formulaire de dchiffrement et laffichera. Grce ces touches nales, votre application est maintenant termine.

Le guide du codeur 55

Envoi de messages chiffrs

3.4 Check-list
En dveloppant cette application, vous avez appris :
j

utiliser les classes de lespace de noms System.Net.Mail pour envoyer des courriers lectroniques ; utiliser les classes et les mthodes de conversion de la plateforme .NET pour transformer et encoder des donnes de diffrentes manires ; utiliser les algorithmes de cryptologie proposs par la plateforme, en particulier celui de Rijndael, pour scuriser lchange de messages lectroniques ; encapsuler des fonctionnalits dans une classe auxiliaire pour les rendre accessibles dautres classes de lapplication.

56 Le guide du codeur

Ch apit re

4 Gestion dun concours


Classes et espaces de noms utiliss ............... Interface utilisateur ..................................... Ralisation .................................................. Check-list .................................................... 58 62 69 74

Gestion dun concours

Le but de lapplication que vous allez dvelopper dans ce chapitre est de permettre de grer des donnes sans faire appel un systme de gestion de bases de donnes (SGBD). Grce aux Assistants et aux contrles inclus dans Visual Basic 2005 Express, vous serez capable de connecter vos objets directement votre interface graphique. Vous pourrez ensuite enregistrer vos donnes en stockant ltat de tous vos objets dans un chier. La transformation des objets en un format qui peut tre stock ou transport sappelle "srialisation". Vous allez utiliser les classes fournies par la plateforme .NET qui vous permettront de stocker vos objets sous forme binaire. Les classes pour le processus inverse, appel "dsrialisation", se trouvent aussi dans les bibliothques .NET. Votre application servira la gestion dun concours de pche. Elle devra grer linscription des participants, la saisie des rsultats et laffichage des classements. Pour chaque participant, les rsultats enregistrer sont :
j j j

la masse totale de poissons pchs ; la masse du plus gros poisson ; le nombre de poissons.

Les rsultats pourront tre classs soit par genre (hommes et femmes), soit par ge, avec une catgorie "junior" pour les moins de 17 ans.

4.1 Classes et espaces de noms utiliss


Comme pour toute application Windows, vous allez utiliser des classes de lespace de noms System.Windows.Forms. Vous aurez aussi besoin de classes dans les espaces de noms System.IO pour la manipulation de chiers et de la classe BinaryFormatter de lespace de noms System.Runtime.Serialization .Formatters.Binary, qui se chargera de la srialisation. Toutefois, ces classes ne vous seront pas dune grande utilit si vous ne crez pas les classes qui reprsenteront les objets du domaine de votre application. Crez un nouveau projet de type Application Windows pour commencer programmer.

La classe Personne
Chaque personne inscrite au concours sera caractrise par un certain nombre dattributs communs. En particulier, elles auront toutes un nom, un prnom, une
58 Le guide du codeur

Classes et espaces de noms utiliss

date de naissance et un genre. Vous allez encapsuler ces informations dans la classe Personne. Cliquez du bouton droit sur le nom de votre projet et ajoutez la classe Personne laide de la commande Classe du sous-menu Ajouter.
<Serializable()> _ Public Class Personne Implements IComparable(Of Personne) Public Public Public Public m_nom As String m_prenom As String m_dateN As DateTime m_feminin As Boolean

Public Sub New(ByVal nom As String, _ ByVal prenom As String, _ ByVal dateNaissance As DateTime, _ ByVal feminin As Boolean) Me.m_nom = nom Me.m_prenom = prenom Me.m_dateN = dateNaissance Me.m_feminin = feminin End Sub Public Property Nom() As String Get Return m_nom End Get Set(ByVal value As String) m_nom = value End Set End Property Public Property Prenom() As String Get Return m_prenom End Get Set(ByVal value As String) m_prenom = value End Set End Property Public Property DateDeNaissance() As DateTime Get Return m_dateN End Get Set(ByVal value As DateTime) m_dateN = value End Set
Le guide du codeur 59

Gestion dun concours

End Property Public Property Feminin() As Boolean Get Return m_feminin End Get Set(ByVal value As Boolean) m_feminin = value End Set End Property Public ReadOnly Property NomComplet() As String Get Return Me.m_nom.ToUpper() + " " + Me.m_prenom End Get End Property Public ReadOnly Property Age() As Integer Get Return CInt( _ Today.Subtract(Me.m_dateN).TotalDays / _ 365.25) End Get End Property Public Function CompareTo(ByVal obj As Personne) _ As Integer _ Implements IComparable(Of Personne).CompareTo Return Me.NomComplet.CompareTo(obj.NomComplet) End Function End Class
m La classe Personne

Lattribut Serializable, plac au dbut de la dclaration de la classe, est ncessaire car on va srialiser les donnes des personnes participant au concours. On ajoute un constructeur la classe, qui permet dinitialiser tous ses champs lors de linstanciation des objets de type Personne. On cre aussi des proprits pour chacun des champs de la classe. Elles permettront dutiliser automatiquement les objets comme source de donnes dans Visual Basic 2005 Express. On cre deux proprits supplmentaires en lecture seule : NomComplet et Age. La premire retourne une chane de caractres compose du nom de famille de la personne en majuscules, suivi de son prnom ; cette proprit est utile pour laffichage des informations relatives aux participants. La deuxime proprit

60 Le guide du codeur

Classes et espaces de noms utiliss

calcule lge des individus et est utilise pour dterminer les membres de la catgorie "junior". Enn, on implmente une mthode CompareTo, puisque lon va implmenter linterface IComparable(Of Personne). Parce que lon utilise une interface gnrique, on na pas se soucier du type du paramtre pass la mthode : on a dni ds la compilation quil sagit dune Personne. Cette mthode sert trier par ordre alphabtique une liste dinstances de la classe Personne.

La classe Participant
Vous avez dj encapsul certaines donnes relatives aux personnes participant au concours dans la classe Personne. Mais cela ne suffit pas : il faut associer chaque participant ses rsultats. Vous allez donc crer une classe Participant, qui drivera de la classe Personne et contiendra les rsultats en plus des donnes personnelles de chacun.
<Serializable()> _ Public Class Participant Inherits Personne Private m_nbPoissons As Integer Private m_masseTotalePoisson As Single Private m_massePlusGrosPoisson As Single Public Sub New(ByVal nom As String, _ ByVal prenom As String, _ ByVal dateNaissance As DateTime, _ ByVal feminin As Boolean) MyBase.New(nom, prenom, dateNaissance, feminin) Me.NombrePoissons = 0 Me.MassePlusGrosPoisson = 0 Me.MasseTotalePoisson = 0 End Sub Public Property NombrePoissons() As Integer Get Return Me.m_nbPoissons End Get Set(ByVal value As Integer) Me.m_nbPoissons = value End Set End Property Public Property MasseTotalePoisson() As Single Get Return Me.m_masseTotalePoisson End Get

Le guide du codeur 61

Gestion dun concours

Set(ByVal value As Single) Me.m_masseTotalePoisson = value End Set End Property Public Property MassePlusGrosPoisson() As Single Get Return Me.m_massePlusGrosPoisson End Get Set(ByVal value As Single) Me.m_massePlusGrosPoisson = value End Set End Property End Class
m La classe Participant

Tout comme la classe Personne, la classe Participant doit avoir lattribut Serializable pour quil soit possible de stocker son tat dans un chier par la suite. Bien que cette classe nimplmente pas linterface IComparable, ses instances peuvent tre compares entre elles grce limplmentation de sa classe de base. Ici on cre un constructeur qui permettra dinitialiser les donnes personnelles de chaque participant en appelant le constructeur de la classe de base laide de MyBase.New. On doit, une fois de plus, crer des proprits pour accder aux champs de la classe, an que celle-ci puisse tre utilise comme source de donnes par la suite.

4.2 Interface utilisateur


Maintenant que vous avez cr les classes reprsentant les donnes que manipulera votre application, il ne vous reste plus qu crer linterface graphique de celle-ci. Les nouveaux Assistants et contrles prsents dans Visual Basic 2005 Express vous faciliteront la tche.

Dnition de la source de donnes


Commencez par gnrer la solution laide de la commande Gnrer du menu de mme nom. Cela a pour effet de compiler les types que vous avez crs prcdemment et de les rendre visibles aux Assistants de Visual Basic 2005 Express.

62 Le guide du codeur

Interface utilisateur

Affichez maintenant le volet Sources de donnes en cliquant sur la commande Afficher les sources de donnes dans le menu Donnes. Aucune source de donnes nest associe au projet pour linstant. Cliquez sur le lien Ajouter une nouvelle source de donnes pour en crer une.

b Figure 4-1 : Le volet Sources de donnes est vide

b Figure 4-2 : La source de donnes Participant

Dans lAssistant qui se lance, slectionnez le choix Objet et cliquez sur Suivant.

m Figure 4-3 : Assistant de Conguration de source de donnes

Le guide du codeur 63

Gestion dun concours

Maintenant, slectionnez le type dobjet que vous souhaitez utiliser en tant que source de donnes. Dveloppez larborescence pour trouver le type Participant et cliquez sur Terminer.

m Figure 4-4 : Choix de lobjet lier

Maintenant que vous avez dni votre source de donnes, la cration de votre formulaire sera presque un jeu denfants.

Cration du formulaire
Commencez par dposer un contrle de type ToolStrip dans votre formulaire et utilisez la che de balise active de celui-ci pour insrer des lments standard.

m Figure 4-5 : Insrer des lments standard dans la barre doutils

Vous allez supprimer tous les lments, sauf les boutons Ouvrir et Enregistrer.
64 Le guide du codeur

Interface utilisateur

Cration de barres doutils et de menus Visual Basic 2005 Express propose un certain nombre dlments standard, aussi bien pour les ToolStrip que pour les MenuStrip que vous pouvez insrer laide des ches de balise active des contrles. Vous tes libre de crer vos barres de menus et doutils manuellement si vous le souhaitez. Mais les lments standard insrs par Visual Basic 2005 Express sont, pour la plupart, dj congurs, avec les images et raccourcis clavier. Il ne vous reste plus qu supprimer ceux dont vous navez pas besoin.

Vous allez maintenant diviser votre application en trois parties fonctionnelles : la gestion des inscriptions, lenregistrement des rsultats et laffichage des classements. Pour cela, insrez un contrle TabControl dans votre formulaire et rglez sa proprit Dock sur Fill. Par dfaut, le contrle sera cr avec deux onglets. Ajoutez le troisime en cliquant sur la che de balise active et en choisissant Ajouter un onglet.

b Figure 4-6 : Ajouter un nouvel onglet

Utilisez la proprit TabPages du TabControl pour afficher lditeur de collections TabPage. Servez-vous de lditeur pour saisir les valeurs Inscription, Rsultats et Classements dans la proprit Text de chaque onglet (voir Figure 4-7). Maintenant, ajoutez les champs qui vous permettront de raliser les inscriptions. Pour cela, glissez les champs Nom, Prenom, Feminin et DateDeNaissance partir du volet Sources de donnes vers votre formulaire. Pour chacun dentre eux, un Label et un contrle permettant la saisie des donnes sont ajouts au formulaire.

Le guide du codeur 65

Gestion dun concours

m Figure 4-7 : diteur de collections TabPage

Les contrles ParticipantBindingSource et ParticipantBindingNavigator sont apparus dans la zone des contrles non affichables. Il sagit de deux contrles qui permettront laffichage et la navigation dun jeu de donnes. Slectionnez le contrle ParticipantBindingNavigator. Coupez-le pour le retirer du haut du formulaire et collez-le sous longlet Inscription. Il viendra se placer vers le haut de celui-ci. Changez sa proprit Dock Bottom an quil se place en bas de longlet.

b Figure 4-8 : Onglet Inscription

66 Le guide du codeur

Interface utilisateur

Slectionnez maintenant le deuxime onglet. Vous allez y ajouter un contrle ComboBox, qui servira slectionner le participant pour saisir ses rsultats. Pour lier ce contrle la source de donnes, utilisez la che de balise active et cochez la case Utilisez des lments lis aux donnes. Slectionnez ParticipantBindingSource comme Source de donnes et choisissez dafficher le membre NomComplet.

m Figure 4-9 : Liaison dun contrle ComboBox une source de donnes

Vous pourriez ajouter les champs correspondant aux rsultats de chaque participant, comme vous lavez fait sous longlet prcdent. Mais si vous procdez ainsi, les champs insrs seront de type TextBox et personne ne peut garantir que les valeurs saisies seront des nombres, comme le requiert le type Participant. Cliquez donc sur un champ tel que NombrePoissons dans le volet Sources de donnes et slectionnez la commande Personnaliser du menu qui saffiche lorsque vous cliquez sur le bouton ch situ ct du champ. Vriez, dans la fentre qui souvre, que le contrle de type NumericUpDown est coch. Faites cette opration pour les trois champs qui concernent les rsultats. Dsormais, vous pouvez utiliser le bouton ch qui se trouve ct de chaque champ dans le volet Sources de donnes pour slectionner le type NumericUpDown affecter aux champs de rsultats. Glissez les trois champs qui concernent les rsultats des participants.

Le guide du codeur 67

Gestion dun concours

b Figure 4-10 : Onglet Rsultats

Modiez la proprit DecimalPlaces des champs relatifs aux masses des poissons pour pouvoir insrer des chiffres aprs la virgule. Enn, sous le troisime onglet, ajoutez un contrle DataGridView. Dcochez les options dajout, de modication et de suppression dans la balise active, car ce contrle servira seulement afficher des donnes. Une fois le contrle DataGridView en place, vous pouvez modier sa proprit Anchor pour "ancrer" ses cts aux bords de son conteneur an quil soit redimensionn avec celui-ci. Insrez maintenant deux contrles GroupBox et des boutons radio.

b Figure 4-11 : Onglet Classements

Votre interface est maintenant termine. Il ne reste que peu de code crire pour assurer le fonctionnement de lapplication.
68 Le guide du codeur

Ralisation

4.3 Ralisation
La gestion des donnes est faite par les contrles ParticipantBindingSource et ParticipantBindingNavigator, par lintermdiaire des contrles lis et de la barre doutils du BindingNavigator. Cependant, votre application nest pas capable, telle quelle est, de charger et denregistrer des donnes.

Chargement et enregistrement des donnes


La classe Participant nayant pas de constructeur par dfaut, le contrle ParticipantBindingSource nest pas capable par lui-mme de crer de nouvelles instances. Vriez que la proprit AllowNew de la source est True et crez le gestionnaire dvnements AddingNew du contrle.
Private Sub ParticipantBindingSource_AddingNew( _ ByVal sender As System.Object, ByVal e As System.ComponentModel.AddingNewEventArgs) _ Handles ParticipantBindingSource.AddingNew e.NewObject = New Participant(Me.NomTextBox.Text, _ Me.PrenomTextBox.Text, _ Me.DateNaissanceDateTimePicker.Value, _ Me.FemininCheckBox.Checked) End Sub
m Gestionnaire dvnements AddingNew

Dsormais, vous pouvez grer les vnements des boutons Ouvrir et Enregistrer de la barre doutils pour enregistrer et charger des listes de participants srialises. Double-cliquez sur les boutons pour crer leurs gestionnaires dvnements.
Private Sub OuvrirToolStripButton_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles OuvrirToolStripButton.Click Dim Formatter As New _ Runtime.Serialization.Formatters.Binary.BinaryFormatter Dim ofd As New OpenFileDialog ofd.InitialDirectory = _ My.Computer.FileSystem.SpecialDirectories.MyDocuments If ofd.ShowDialog(Me) = DialogResult.OK Then Dim fs As New IO.FileStream(ofd.FileName, _ IO.FileMode.Open) Try Me.ParticipantBindingSource.DataSource = _ CType(Formatter.Deserialize(fs), _ IList(Of Participant))

Le guide du codeur 69

Gestion dun concours

Catch ex As Exception MessageBox.Show("La rcupration a choue : " _ + vbCrLf + ex.Message, "Erreur", _ MessageBoxButtons.OK, MessageBoxIcon.Error) Finally fs.Close() End Try End If End Sub Private Sub EnregistrerToolStripButton_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles EnregistrerToolStripButton.Click Dim Formatter As New _ Runtime.Serialization.Formatters.Binary.BinaryFormatter Dim sfd As New SaveFileDialog sfd.InitialDirectory = _ My.Computer.FileSystem.SpecialDirectories.MyDocuments If sfd.ShowDialog(Me) = DialogResult.OK Then Dim fs As New IO.FileStream(sfd.FileName, _ IO.FileMode.Create) Try Formatter.Serialize(fs, _ Me.ParticipantBindingSource.List) Catch ex As Exception MessageBox.Show("La sauvegarde a chou : " _ + vbCrLf + ex.Message, "Erreur", _ MessageBoxButtons.OK, MessageBoxIcon.Error) Finally fs.Close() End Try End If End Sub
m Srialisation et dsrialisation de la liste de participants

Dans chacun des gestionnaires dvnements, on cre un BinaryFormatter qui sera charg de raliser la srialisation et la dsrialisation. Dans le gestionnaire du bouton Ouvrir, on utilise un OpenFileDialog pour rcuprer le nom du chier, tandis que, dans celui du bouton Enregistrer, on utilise un SaveFileDialog. On emploie les mthodes Serialize et Deserialize du BinaryFormatter que lon a cr pour srialiser et dsrialiser la liste de participants accessible par la proprit List de lobjet ParticipantBindingSource.

70 Le guide du codeur

Ralisation

Classement des rsultats


Pour nir, vous allez crer le gestionnaire dvnements des boutons radio du troisime onglet, qui permettra laffichage des rsultats classs dans le contrle DataGridView. Avant de crer le gestionnaire dvnements des contrles RadioButton, vous devez implmenter des classes auxiliaires dans la classe Participant pour permettre la comparaison des rsultats des participants.
Public Class ComparerParNombrePoissons Implements IComparer(Of Participant) Public Function Compare(ByVal x As Participant, _ ByVal y As Participant) As Integer _ Implements IComparer(Of Participant).Compare Return x.NombrePoissons.CompareTo(y.NombrePoissons) End Function End Class Public Class ComparerParMasseTotalePoisson Implements IComparer(Of Participant) Public Function Compare(ByVal x As Participant, _ ByVal y As Participant) As Integer _ Implements IComparer(Of Participant).Compare Return x.MasseTotalePoisson.CompareTo( _ y.MasseTotalePoisson) End Function End Class Public Class ComparerParMassePlusGrosPoisson Implements IComparer(Of Participant) Public Function Compare(ByVal x As Participant, _ ByVal y As Participant) As Integer _ Implements IComparer(Of Participant).Compare Return x.MassePlusGrosPoisson.CompareTo( _ y.MassePlusGrosPoisson) End Function End Class
m Classes internes de la classe Participant

Lutilisation dinterfaces gnriques IComparer(Of T) vite la conversion inutile des donnes et facilite la lecture des mthodes. Slectionnez maintenant tous les contrles RadioButton en cliquant dessus en maintenant la touche [Ctrl] enfonce. Saisissez Classement_Click comme valeur de lvnement Click dans le volet des proprits et appuyez sur la touche [Entre] pour crer le gestionnaire.
Le guide du codeur 71

Gestion dun concours

Private Sub Classement_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles optGros.Click, optNombre.Click, _ optGeneral.Click, optJunior.Click, optFemmes.Click, _ optHommes.Click, optTous.Click Dim ClassementConcours As New List(Of Participant) If Not optTous.Checked Then Dim participant As Participant For Each participant In _ Me.ParticipantBindingSource.List If optJunior.Checked AndAlso _ participant.Age < 17 Then ClassementConcours.Add(participant) ElseIf Me.optHommes.Checked AndAlso _ participant.Feminin = False Then ClassementConcours.Add(participant) ElseIf Me.optFemmes.Checked AndAlso _ participant.Feminin Then ClassementConcours.Add(participant) End If Next Else ClassementConcours.AddRange( _ Me.ParticipantBindingSource.List) End If If Me.DataGridView1.DataSource IsNot Nothing Then Me.DataGridView1.DataSource = Nothing End If Select Case True Case Me.optGeneral.Checked ClassementConcours.Sort( _ New Participant.ComparerParMasseTotalePoisson) With Me.DataGridView1 .DataSource = ClassementConcours .Columns("NomComplet").DisplayIndex = 0 .Columns("MasseTotalePoisson").Visible = True .Columns("MasseTotalePoisson").DisplayIndex = 1 .Columns("MassePlusGrosPoisson").Visible = True .Columns("MassePlusGrosPoisson").DisplayIndex = 2 .Columns("NombrePoissons").Visible = True .Columns("NombrePoissons").DisplayIndex = 3 End With Case Me.optGros.Checked ClassementConcours.Sort( _
72 Le guide du codeur

Ralisation

New Participant.ComparerParMassePlusGrosPoisson) With Me.DataGridView1 .DataSource = ClassementConcours .Columns("NomComplet").DisplayIndex = 0 .Columns("MassePlusGrosPoisson").DisplayIndex = 1 .Columns("MasseTotalePoisson").Visible = False .Columns("NombrePoissons").Visible = False End With Case Me.optNombre.Checked ClassementConcours.Sort( _ New Participant.ComparerParNombrePoissons) With Me.DataGridView1 .DataSource = ClassementConcours .Columns("NomComplet").DisplayIndex = 0 .Columns("NombrePoissons").DisplayIndex = 1 .Columns("MasseTotalePoisson").Visible = False .Columns("MassePlusGrosPoisson").Visible = False End With End Select With Me.DataGridView1 .Columns("Age").Visible = False .Columns("DateDeNaissance").Visible = False .Columns("Feminin").Visible = False .Columns("Nom").Visible = False .Columns("Prenom").Visible = False End With End Sub
m Mthode pour le classement

Cette mthode vrie quel est le bouton radio du groupe Catgories qui est coch et gnre une liste temporaire de type List(Of Participant) en vue dun affichage dans le contrle DataGridView. Si la case Tous est coche, tous les lments stocks dans la liste du contrle ParticipantBindingSource seront ajouts la liste temporaire ; sinon, une slection sera faite. Enn, en fonction du bouton radio du groupe Classement qui sera coch, une instance des classes internes de la classe Participant sera cre pour que la liste temporaire soit trie grce sa mthode Sort. Toutes les fonctionnalits de votre application sont dsormais implmentes.

Le guide du codeur 73

Gestion dun concours

4.4 Check-list
En dveloppant cette application, vous avez appris :
j

j j

crer des classes srialisables et stocker des collections de celles-ci dans un chier ; utiliser Visual Basic 2005 Express pour crer des sources de donnes partir dobjets ; crer des interfaces graphiques lies des sources de donnes ; implmenter des interfaces pour permettre la comparaison de classes personnalises.

74 Le guide du codeur

Ch apit re

5 Outil de traitement de texte RTF


Classes et espaces de noms utiliss ............... Interface utilisateur ..................................... Ralisation .................................................. Check-list .................................................... 76 76 80 90

Outil de traitement de texte RTF

Vous allez crer, dans ce chapitre, une application qui vous permettra dditer des chiers au format RTF (Rich Text Format, en franais "format de texte enrichi"). RTF est frquemment utilis pour lchange de donnes formates aussi bien entre programmes quentre plateformes, car il est reconnu par beaucoup dapplications et, plus particulirement, par les logiciels de traitement de texte des diffrents systmes dexploitation. Lapplication que vous allez crer aura une interface multidocument (MDI), qui permettra douvrir, simultanment, au sein dun mme formulaire, dit "parent", plusieurs sous-formulaires, dits "enfants". Adobe Photoshop est un exemple dapplication MDI, tout comme Microsoft Visual Basic 2005 Express Edition, qui utilise des onglets par dfaut, mais qui peut tre converti en application MDI grce la commande Options du menu Outils.

5.1 Classes et espaces de noms utiliss


Comme pour toute application Windows, vous aurez besoin de lespace de noms System.Windows.Forms. Dans cet espace de noms, vous trouverez la classe RichTextBox, qui sera le cur de votre outil de traitement de texte. Pensez aussi importer lespace de noms System.IO, qui vous servira pour certaines manipulations de chiers.

5.2 Interface utilisateur


Une grande partie de votre interface graphique est dj prte. Vous allez comprendre pourquoi.

Formulaire principal
Vous allez commencer par crer le formulaire principal (celui qui hbergera les formulaires enfants) de votre application dans un nouveau projet. 1 Crez une nouvelle application Windows appele RTFEditor. 2 Dans lExplorateur de solutions, supprimez le chier Form1.vb en cliquant sur celui-ci du bouton droit et en slectionnant la commande Supprimer. 3 Pour crer la fentre principale de votre application, cliquez du bouton droit sur le nom de votre projet dans lExplorateur de solutions et slectionnez la commande Nouvel lment du sous-menu Ajouter.
76 Le guide du codeur

Interface utilisateur

m Figure 5-1 : Ajouter un nouveau formulaire parent MDI

4 Dans lAssistant, slectionnez le modle Formulaire parent MDI et, dans la zone de texte Nom, saisissez FenetrePrincipale.vb. Si vous cliquez sur le bouton Ajouter, Visual Studio cre une fentre complte, avec les menus et les barres doutils les plus utiliss, et prte recevoir des formulaires enfants.

m Figure 5-2 : Fentre principale

Le guide du codeur 77

Outil de traitement de texte RTF

Vos propres conteneurs MDI Le modle de formulaire MDI propos par Visual Studio peut vous faire gagner du temps, car, en quelques clics, vous obtenez un formulaire avec menus et barres doutils, prt lemploi. Toutefois, vous ntes pas oblig dutiliser ce modle. En effet, tout formulaire est susceptible de devenir un conteneur MDI. Il suffit pour cela de changer la valeur de sa proprit IsMdiContainer True. Vous remarquerez que sa bordure et sa couleur de fond changent, signalant quil est prt accueillir des formulaires enfants.

Le bouton Aide a t supprim de la barre doutils ainsi que les deux boutons qui concernent limpression. Les menus Aide et Outils, et les commandes du menu Fichier qui concernent limpression ont aussi t supprims, car ces fonctionnalits ne seront pas implmentes. Vous devez ajouter trois boutons la barre doutils :
j j j

GaucheToolStripButton ; CentreToolStripButton ; DroiteToolStripButton.


b Figure 5-3 : Barre doutils de la fentre principale

Le formulaire principal de votre application est prt recevoir les formulaires enfants que vous allez prparer dans la section suivante.

Formulaires enfants
Maintenant que le formulaire principal est prt, vous devez crer une nouvelle classe qui reprsentera les formulaires enfants : ceux qui vous permettront dditer vos documents RTF. 1 Pour cela, ajoutez un nouvel lment votre projet, comme vous lavez fait pour le formulaire principal. Choisissez, toutefois, Windows Form comme modle et appelez-le DocumentRtf.vb. 2 Insrez maintenant un contrle RichTextBox en double-cliquant sur celui-ci dans la bote outils. 3 Cliquez sur la che de balise active dans le coin suprieur droit du contrle que vous venez dinsrer.

78 Le guide du codeur

Interface utilisateur

4 Cliquez sur Ancrer dans le conteneur parent pour attribuer la proprit Dock la valeur Fill. Le contrle RichTextBox sancre aux limites du formulaire DocumentRtf.

b Figure 5-4 : Insrer un RichTextBox

b Figure 5-5 : Ancrer le RichTextBox au conteneur parent

5 Dans la proprit (name) du contrle RichTextBox, saisissez RichTextBox. Votre formulaire ddition est termin. Ce formulaire, et plus particulirement le contrle RichTextBox quil contient, seront utiliss dans le formulaire principal pour diter un ou plusieurs documents RTF simultanment.

b Figure 5-6 : Formulaire ddition

Le guide du codeur 79

Outil de traitement de texte RTF

Dnition du formulaire de dmarrage


Les diffrents lments de votre interface graphique sont prts. Toutefois, si vous essayez de compiler et de lancer lapplication, vous allez vous retrouver avec une erreur du compilateur. Cela est d au fait que le formulaire par dfaut, Form1.vb, a t supprim. Vous devez donc spcier, manuellement, le formulaire de dmarrage de votre application. 1 Dans lExplorateur de solutions, cliquez du bouton droit sur le nom de votre projet et slectionnez Proprits. 2 Sous longlet Application, slectionnez FenetrePrincipale dans la liste droulante Formulaire de dmarrage.

m Figure 5-7 : Modier le formulaire de dmarrage de lapplication

3 Fermez longlet laide de la croix. Votre interface graphique est maintenant prte. Il ne reste plus qu implmenter les fonctionnalits de base dun outil de traitement de texte. Au pralable, vous pouvez la tester en appuyant sur la touche [F5] de votre clavier.

5.3 Ralisation
Visual Studio a prpar votre formulaire principal avec des lments graphiques qui donnent laccs la plupart des fonctionnalits proposes par un outil de traitement de texte. Vous en avez ajout dautres lors de la prparation de celui-ci. Toutefois, ces fonctionnalits ne sont toujours pas implmentes. Le modle de formulaire MDI a dj cr certains gestionnaires dvnements pour vous, par exemple celui qui permet de crer de nouveaux sous-formulaires lintrieur de la fentre principale ou encore celui qui affiche une bote de dialogue pour ouvrir un document. Cependant, vous devez les modier pour quils correspondent exactement vos besoins.

80 Le guide du codeur

Ralisation

Complter la classe DocumentRtf


Au niveau de linterface graphique, la classe DocumentRtf est prte, mais vous devez encore crire un peu de code an de lutiliser par la suite. Affichez le code de la classe DocumentRtf en cliquant du bouton droit sur le chier de mme nom dans lExplorateur de solutions et en slectionnant la commande Afficher le code.

b Figure 5-8 : Afficher le code de la classe DocumentRtf

crivez le mot Property et appuyez sur la touche [Tab] de votre clavier. Cela a pour effet dinsrer un extrait de code correspondant une proprit publique et son membre priv associ. Remplacez les noms et les types insrs par dfaut pour obtenir le code suivant :
Private m_nomDuFichier As String = String.Empty Public Property NomDuFichier() As String Get Return m_nomDuFichier End Get Set(ByVal value As String) m_nomDuFichier = value End Set End Property

Ce champ et cette proprit serviront identier les diffrents documents ouverts dans votre application, ce qui permettra, par exemple, de nouvrir quune seule instance dun document la fois. Vous pouvez fermer le code source et le Concepteur de vues du chier DocumentRtf.vb car il na plus besoin dtre modi.

Le guide du codeur 81

Outil de traitement de texte RTF

Crer de nouveaux documents


Si vous testez votre interface graphique, vous pouvez constater que le bouton Nouveau de la barre doutils et la commande Nouveau du menu Fichier vous permettent dj de crer de nouvelles fentres lintrieur du formulaire principal de votre application. Toutefois, ces fentres ne sont que de simples instances de la classe Form, sans fonctionnalit supplmentaire. Vous devez modier la mthode ShowNewForm pour ouvrir de nouvelles fentres DocumentRtf dans votre application. Double-cliquez sur le bouton Nouveau de la barre doutils an daccder au code source de la mthode ShowNewFrom. Modiez la dclaration de la variable ChildForm comme suit :
Private Sub ShowNewForm(ByVal sender As Object, _ ByVal e As EventArgs) _ Handles NewToolStripMenuItem.Click, _ NewToolStripButton.Click, _ NewWindowToolStripMenuItem.Click Crez une nouvelle instance du formulaire enfant. Dim ChildForm As New DocumentRtf Configurez-la en tant quenfant de ce formulaire MDI avant de lafficher. ChildForm.MdiParent = Me m_ChildFormNumber += 1 ChildForm.Text = "Fentre " & m_ChildFormNumber ChildForm.Show() End Sub
m Cration dun nouveau formulaire

Les nouveaux formulaires enfants seront de type DocumentRtf. La mthode dnit ensuite le formulaire courant, Me, comme parent MDI du formulaire que vous venez de crer en utilisant la proprit MdiParent de celui-ci, et incrmente un compteur qui contient le nombre de nouveaux enfants. Le titre du nouveau formulaire est ensuite modi et celui-ci est affich.

Ouvrir un document existant


Comme pour la commande Nouveau, il existe dj un gestionnaire dvnements qui est appel lorsque lon clique sur le bouton Ouvrir ou lorsque lon slectionne la commande Ouvrir du menu Fichier. La mthode sappelle OpenFile et elle est capable dafficher une bote de dialogue permettant de slectionner un chier ouvrir et de rcuprer le nom de ce chier dans une variable. Mais cest vous de ltendre pour quun nouveau formulaire de type DocumentRtf soit ouvert et affiche effectivement le chier slectionn.

82 Le guide du codeur

Ralisation

Toutefois, avant douvrir le chier demand, vous allez dabord vrier quil nest pas dj ouvert an dviter dafficher le mme document plusieurs fois. Pour cela, vous allez crer une fonction prive au sein de la classe FenetrePrincipale.
Private Function RechercherDocument(ByRef nom As String) _ As DocumentRtf For Each Document As DocumentRtf In MdiChildren If Document.NomDuFichier.Equals(nom) Then Return Document End If Next Return Nothing End Function
m Recherche dun document ouvert

Cette fonction prend une chane de caractres en paramtre, qui correspond au nom complet du chier que lon souhaite ouvrir. On parcourt la collection de formulaires enfants de la fentre principale, MdiChildren, tout en vriant si leur proprit NomDuFichier est gale au nom demand. Si cest le cas, le document correspondant est renvoy. Si lon arrive la n de la collection sans trouver le nom demand, la valeur Nothing est renvoye. Vous pouvez prsent modier la mthode OpenFile an douvrir le document souhait ou ramener sa fentre vers le front sil est dj ouvert.
Private Sub OpenFile(ByVal sender As Object, _ ByVal e As EventArgs) _ Handles OpenToolStripMenuItem.Click, OpenToolStripButton.Click Dim OpenFileDialog As New OpenFileDialog OpenFileDialog.InitialDirectory = _ My.Computer.FileSystem.SpecialDirectories.MyDocuments OpenFileDialog.Filter = _ "Fichiers RTF (*.rtf)|*.rtf|Tous les fichiers (*.*)|*.*" If (OpenFileDialog.ShowDialog(Me) = _ System.Windows.Forms.DialogResult.OK) Then Dim FileName As String = OpenFileDialog.FileName Dim ChildForm As DocumentRtf = _ RechercherDocument(FileName) If ChildForm IsNot Nothing Then ChildForm.BringToFront() Else ChildForm = New DocumentRtf ChildForm.RichTextBox.LoadFile(FileName) ChildForm.MdiParent = Me ChildForm.Text = Path.GetFileName(FileName) ChildForm.NomDuFichier = FileName
Le guide du codeur 83

Outil de traitement de texte RTF

ChildForm.Show() End If End If End Sub


m Ouverture dun chier RTF

On commence par prparer une nouvelle bote de dialogue de type OpenFileDialog pour slectionner le chier ouvrir. On doit modier le ltre utilis dans cette bote de dialogue an quelle affiche les chiers *.rtf. La bote de dialogue est ensuite affiche et, si lutilisateur la valide grce au bouton OK ou la touche [Entre], on rcupre le nom du chier slectionn dans la variable FileName. On doit ensuite crer une variable appele ChildForm laquelle on affectera le rsultat de la recherche du document souhait parmi ceux qui sont dj ouverts. Si le document demand est dj ouvert, la variable ChildForm contiendra une rfrence vers la fentre qui le contient, ce qui permettra de la ramener vers le front plus tard, sinon elle contiendra la valeur Nothing. On teste si la recherche a abouti. Si cest le cas, il suffit dappeler la mthode BringToFront pour amener le document souhait par-dessus les autres documents ouverts. Sinon, on stocke dans la variable ChildFrom une nouvelle instance de la classe DocumentRtf et lon dnit le formulaire courant en tant que son parent MDI, grce sa proprit MdiParent. On accde ensuite au contrle RichTextBox du nouveau formulaire en utilisant la proprit de mme nom et lon appelle sa mthode LoadFile en passant le nom du chier en argument pour le charger. On utilise ensuite la mthode statique GetFileName de la classe Path pour extraire le nom du chier et lutiliser comme titre de la nouvelle fentre que lon affichera par la suite. Il faut stocker le nom du chier, qui se trouve dans la variable FileName, dans la proprit NomDuFichier du document, car il permettra didentier le document si jamais on essaye de le rouvrir. Il permettra aussi denregistrer le document sans avoir redemander lemplacement de celui-ci lutilisateur. Vous pouvez prsent tester votre application en ouvrant un chier RTF cr avec une autre application, telle que Microsoft Word ou WordPad.

Enregistrer un document
Lorsque lutilisateur veut enregistrer un document, il faut considrer trois cas possibles :
j

Lutilisateur souhaite enregistrer un nouveau document et il clique sur la commande Enregistrer du menu Fichier ou sur le bouton Enregistrer de la barre doutils. Lutilisateur clique sur la commande Enregistrer sous du menu Fichier.

84 Le guide du codeur

Ralisation

Lutilisateur clique sur la commande Enregistrer du menu Fichier ou sur le bouton Enregistrer de la barre doutils pour enregistrer un chier qui existe dj.

Dans les deux premiers cas, une bote de dialogue souvre permettant lutilisateur de choisir le nom sous lequel il souhaite enregistrer le document. Dans le troisime cas, cela nest pas ncessaire, car lemplacement du chier est connu. Vous allez grer les deux premiers cas ensemble en vous servant du gestionnaire dvnements SaveAsToolStripMenuItem_Click. Il a dj t cr par le modle que vous avez utilis en concevant votre formulaire principal. Comme pour le gestionnaire de la commande Ouvrir, vous devez complter cette mthode an dindiquer ce qui devra tre enregistr.
Private Sub SaveAsToolStripMenuItem_Click( _ ByVal sender As Object, ByVal e As EventArgs) _ Handles SaveAsToolStripMenuItem.Click If ActiveMdiChild IsNot Nothing Then Dim SaveFileDialog As New SaveFileDialog SaveFileDialog.InitialDirectory = _ My.Computer.FileSystem.SpecialDirectories.MyDocuments SaveFileDialog.Filter = _ "Fichiers RTF (*.rtf)|*.rtf|Tous les fichiers (*.*)|*.*" If (SaveFileDialog.ShowDialog(Me) = _ System.Windows.Forms.DialogResult.OK) Then Dim FileName As String = SaveFileDialog.FileName Dim FenetreActive As DocumentRtf = ActiveMdiChild FenetreActive.RichTextBox.SaveFile(FileName) FenetreActive.Text = Path.GetFileName(FileName) End If End If End Sub
m Enregistrer un document RTF dans un nouveau chier

Lutilisateur ne peut pas enregistrer de chier sil na pas ouvert de document. Pour cette raison, on commence par entourer le code existant par une clause If Else qui teste lexistence dun formulaire enfant en vriant que la proprit ActiveMdiChild contient une valeur. Comme pour la commande Ouvrir, on prpare une bote de dialogue, de type SaveFileDialog cette fois, pour rcuprer le nom du chier. On doit aussi modier le ltre de cette bote de dialogue pour afficher des chiers de type .rtf. Si lutilisateur valide sa slection, le nom du chier est stock dans une variable appele FileName. On doit alors crer une autre variable appele FenetreActive de type DocumentRtf qui rfrence le formulaire enfant actif, que lon rcupre
Le guide du codeur 85

Outil de traitement de texte RTF

grce la proprit ActiveMdiChild. On procde ainsi pour accder la RichTextBox du DocumentRtf. Il ne reste plus qu appeler la mthode SaveFile du contrle RichTextBox de la fentre active, en lui passant le nom du chier contenu dans la variable FileName, pour que celui-ci soit enregistr. On met ensuite jour le titre de la fentre active pour reter le nouveau nom du document. Le troisime cas est plus rapide crire. Double-cliquez sur le bouton Enregistrer du menu Fichier de votre fentre principale dans le Concepteur de vues et compltez le gestionnaire dvnements qui est cr.
Private Sub SaveToolStripMenuItem_Click(ByVal sender As _ System.Object, _ ByVal e As System.EventArgs) _ Handles SaveToolStripMenuItem.Click, _ SaveToolStripButton.Click If ActiveMdiChild IsNot Nothing Then Dim FenetreActive As DocumentRtf = ActiveMdiChild If String.IsNullOrEmpty(FenetreActive.NomDuFichier) Then SaveAsToolStripMenuItem.PerformClick() Else FenetreActive.RichTextBox.SaveFile(FenetreActive.NomDuFichier) End If End If End Sub
m Enregistrer le nom du chier

Une fois de plus, on doit vrier quil y a bien un document enregistrer en sassurant quil y a un formulaire enfant actif. Si cest le cas, on stocke une rfrence vers la fentre active dans une variable FenetreActive. laide de la mthode IsNotNullOrEmpty de la classe String, on vrie la proprit NomDuFichier du document enregistrer. Si la mthode retourne True, cela veut dire quil sagit dun nouveau document pour lequel il faut demander un nom. Mais comme cette fonctionnalit a dj t programme pour la commande Enregistrer sous, il ne reste plus qu simuler un clic sur celle-ci en utilisant la mthode PerformClick. Dans le cas contraire, on appelle la mthode SaveFile du contrle RichTextBox de la fentre active en lui passant la proprit NomDuFichier comme emplacement pour sauvegarder le chier. An dattacher ce gestionnaire dvnements la commande Enregistrer du menu Fichier, cliquez sur celle-ci puis sur le bouton en forme dclair dans le volet des proprits pour afficher les vnements disponibles. Cliquez sur lvnement Click puis sur le bouton ch pour slectionner la mthode SaveToolStripMenuItem_Click dans la liste.
86 Le guide du codeur

Ralisation

b Figure 5-9 : Associer la mthode lvnement Click

Maintenant que vous avez implment louverture et lenregistrement de chiers, vous pouvez utiliser votre application pour crer de nouveaux chiers RTF et diter des chiers crs par dautres applications.

Menu Edition
Le modle de formulaire parent que vous utilisez contient un menu Edition avec des commandes proposes par la plupart des applications Windows. Ces commandes, qui font souvent penser des manipulations de piles ou la gestion des diffrents types de donnes dans le Presse-papiers, sont gres par la classe RichTextBox. Les gestionnaires dvnements des six commandes seront virtuellement identiques, sauf pour la commande qui est appele sur la RichTextBox. Ils respecteront tous le modle suivant :
If ActiveMdiChild IsNot Nothing Then Dim FenetreActive As DocumentRtf = ActiveMdiChild FenetreActive.RichTextBox.[Commande Executer] End If
m Modle de code des commandes du menu Edition

Pour crer chacun des gestionnaires, double-cliquez sur la commande que vous souhaitez implmenter et copiez ce modle en remplaant le texte entre crochets par lappel la mthode approprie.

Le guide du codeur 87

Outil de traitement de texte RTF

Ainsi, pour la commande Annuler, la mthode appeler est Undo et le gestionnaire dvnements ressemblera ceci :
Private Sub UndoToolStripMenuItem_Click(ByVal sender As _ System.Object, _ ByVal e As System.EventArgs) _ Handles UndoToolStripMenuItem.Click If ActiveMdiChild IsNot Nothing Then Dim FenetreActive As DocumentRtf = ActiveMdiChild FenetreActive.RichTextBox.Undo() End If End Sub
m Gestionnaire de la commande Annuler

Le tableau suivant indique les mthodes appeler pour chacune des six commandes :
Mthodes du contrle RichTextBox correspondant aux commandes du menu Edition Commande Annuler Rtablir Couper Copier Coller Slectionner tout Mthode

Undo() Redo() Cut() Copy() Paste() SelectAll()

Aligner le texte
Pour le moment, vous navez fait quimplmenter des comportements pour les lments de linterface que Visual Studio a prpare pour vous. Or, lorsque vous avez cr la fentre principale de votre application, vous avez ajout trois boutons la barre doutils permettant daligner horizontalement le texte du document. Comme pour les commandes prcdentes, ce ne sera pas vous daligner directement le texte. Vous allez simplement modier une proprit du contrle RichTextBox de la fentre active pour changer lalignement du texte slectionn. Cependant, le code pour chacun des trois boutons tant quasiment identique, vous allez crer un seul gestionnaire dvnements que vous associerez aux trois boutons en question et qui dterminera automatiquement lalignement appliquer en fonction du bouton sur lequel lutilisateur aura cliqu.

88 Le guide du codeur

Ralisation

Commencez par crire le gestionnaire dvnements pour les trois boutons :


Private Sub AlignerSelection(ByVal sender As Object, _ ByVal e As EventArgs) If ActiveMdiChild IsNot Nothing Then Dim FenetreActive As DocumentRtf = ActiveMdiChild Dim NouvelAlignement As HorizontalAlignment If sender.Equals(GaucheToolStripButton) Then NouvelAlignement = HorizontalAlignment.Left ElseIf sender.Equals(CentreToolStripButton) Then NouvelAlignement = HorizontalAlignment.Center ElseIf sender.Equals(DroiteToolStripButton) Then NouvelAlignement = HorizontalAlignment.Right End If FenetreActive.RichTextBox.SelectionAlignment = _ NouvelAlignement End If End Sub
m Aligner la slection

Il faut vrier quun document est ouvert avant de faire une quelconque modication. Si un document est bien ouvert, on procde la cration de deux variables, FenetreActive et NouvelAlignement, qui contiendront respectivement une rfrence vers la fentre active, de type DocumentRtf, pour rcuprer son contrle RichTextBox, et lalignement souhait, de type HorizontalAlignment. La suite de clauses If Else permet daffecter une valeur de lnumration HorizontalAlignment la variable NouvelAlignement en fonction du bouton qui a dclench lvnement. Cette valeur est ensuite affecte la proprit SelectionAlignement du contrle RichTextBox de la fentre active. Revenez dans le Concepteur de vues an dassocier le gestionnaire dvnements que vous venez de crer aux trois boutons. Pour ce faire : 1 Slectionnez les trois boutons en cliquant sur le premier puis sur les deux autres tout en maintenant la touche [Ctrl] enfonce. 2 Cliquez sur le bouton en forme dclair dans le volet des proprits pour afficher les vnements disponibles pour les trois boutons. 3 Cliquez sur lvnement Click puis sur le bouton ch pour slectionner la mthode AlignerSelection dans la liste. Votre application est dsormais un outil de traitement de texte RTF part entire. Certes, toutes les possibilits de formatage offertes par RTF ne sont pas exploites, mais si vous le souhaitez, vous pouvez facilement tendre votre
Le guide du codeur 89

Outil de traitement de texte RTF

application en suivant les modles de code que vous avez dj crits et en modiant dautres proprits du contrle RichTextBox, par exemple la proprit SelectionColor, qui permet de changer la couleur du texte slectionn.

5.4 Check-list
Dans ce chapitre vous avez appris :
j

j j

utiliser les modles fournis par Visual Basic 2005 Express Edition an dacclrer le dveloppement de vos applications ; grer plusieurs formulaires enfants dans une interface multidocument ; excuter des commandes sur les formulaires enfants dune application MDI partir des contrles du formulaire parent ; diter un document au format de texte enrichi grce au contrle RichTextBox.

90 Le guide du codeur

Ch apit re

6 Site web personnel

Cration de linterface .................................. 92 Cration de menus ....................................... 94 Gestion des liens ......................................... 96 Page Contact ............................................ 101 Check-list .................................................. 103

Site web personnel

Les sites web personnels, qui permettent de crer un espace virtuel sur Internet, sont la mode depuis quelques annes. Vous allez crer le vtre tout au long de ce chapitre pour vous prsenter, prsenter vos activits, votre CV, etc.

6.1 Cration de linterface


Commencez par crer votre projet web. Pour cela, ouvrez Visual Web Developer 2005 Express et crez un nouveau projet via le menu Fichier. Une bote de dialogue saffiche, permettant de crer diffrents types dapplications web. Slectionnez le modle de projet intitul Site Web vide. Vriez que le langage slectionn est le Visual Basic, nommez et placez le projet web o vous le souhaitez puis validez.

m Figure 6-1 : Modles de projets web

Votre projet web est maintenant cr. Il est vide car il ne contient aucun chier. LExplorateur de solutions en rend compte. Vous allez crer une page matre, cest--dire un ensemble de pages web. Vous pouvez, contenant linterface commune toutes les appliquer. Elles ne contiendront ds lors que un modle de page appliquer par exemple, crer un modle pages web dun site, et le leur le contenu variable.

92 Le guide du codeur

Cration de linterface

Pour crer une page matre, cliquez sur le menu Site Web et slectionnez Ajouter un nouvel lment. Dans la bote de dialogue, slectionnez llment Page matre.

m Figure 6-2 : Cration dune page matre

Aprs validation, le designer de Visual Web Developer affiche une page vierge blanche, qui contient un contrle spcial : ContentPlaceHolder. La page nouvellement cre ne sera pas accessible en tant que telle. Elle devra tre utilise par dautres. Dans son code source, gurent, la place de la directive Page, une directive Master, et un peu plus bas, le contrle ContentPlaceHolder.
<%@ Master Language="VB" CodeFile="MasterPage.master.vb" Inherits="MasterPage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Page sans titre</title> </head> <body> <form id="form1" runat="server"> <div> <asp:contentplaceholder id="ContentPlaceHolder1"
Le guide du codeur 93

Site web personnel

runat="server"> </asp:contentplaceholder> </div> </form> </body> </html>

Lobjectif prsent est de dnir dans la page matre linterface qui sera commune toutes les pages web. Celles-ci seront automatiquement affiches dans le contrle ContentPlaceHolder. Vous allez crer un tableau contenant une seule ligne et deux colonnes. La premire colonne permettra de placer le menu du site web, la seconde colonne contiendra le contrle ContentPlaceHolder. Vous devez arriver un rsultat proche de celui-ci :
<table><tr><td>menu</td><td><asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder></td></tr></table>

6.2 Cration de menus


ASP .NET propose deux contrles serveurs pour afficher les menus de sites web. Le premier est Menu, disponible dans la catgorie Navigation dans la bote outils. Il permet de crer des menus horizontaux et verticaux, et il est entirement personnalisable via lutilisation de styles CSS, dimages, etc. Le second contrle disponible pour la cration de menus est TreeView. Il permet dafficher des donnes de manire hirarchique (ce qui est idal pour un menu de site web), verticalement uniquement. Comme le contrle Menu, il est personnalisable. Slectionnez donc le contrle TreeView dans la bote outils et placez-le dans la premire cellule du tableau prcdemment cr.

b Figure 6-3 : Le contrle TreeView dans la bote outils

94 Le guide du codeur

Cration de menus

Vous allez prsent dnir lapparence de ce contrle. Pour ce faire, cliquez sur le smart tag li votre contrle TreeView puis sur le lien Mise en forme automatique.

b Figure 6-4 : Affichage du smart tag du TreeView

Un clic sur ce lien ouvre une bote de dialogue permettant de slectionner diffrents types de mises en forme prdnies. Vous pouvez ainsi donner une apparence professionnelle votre contrle TreeView de manire rapide. Slectionnez le thme Flches, sobre et lgant. Maintenant que le contrle TreeView est dispos sur votre page matre et que son apparence est dnie, il faut le remplir avec les informations concernant les diffrentes pages de votre site. Il ne sagit pas de remplir le contrle TreeView "en dur" en ajoutant les diffrents lments grce sa proprit Nodes. Vous allez crer un nouveau chier de type "sitemap" dans votre projet. Ajoutez un nouvel lment votre projet et slectionnez Plan de site. Une fois la cration valide, vous disposez dun chier de type "sitemap", qui est en fait un simple chier XML, avec un schma particulier. Il permet de dnir la hirarchie dun site web en ajoutant et en organisant des balises siteMapNode.
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns= "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"> <siteMapNode url="" title="" description=""> <siteMapNode url="" title="" description="" /> <siteMapNode url="" title="" description="" /> </siteMapNode> </siteMap>

Aprs avoir personnalis ce chier, vous devez arriver un rsultat proche de celui-ci :
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns= "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx"
Le guide du codeur 95

Site web personnel

title="Mon Site web personnel" description=""> <siteMapNode url="cv.aspx" title="CV" ></siteMapNode> <siteMapNode url="links.aspx" title="Liens prfrs" description="" /> <siteMapNode url="Contact.aspx" title="Contact" description="" /> </siteMapNode> </siteMap>

Maintenant que le chier est rempli, il faut le lier au contrle TreeView. Le contrle SiteMapDataSource est ddi cela. Vous allez lutiliser pour remplir le contrle TreeView avec les informations prsentes dans le chier "sitemap". En ce sens, placez un contrle SiteMapDataSource sur votre page matre et cliquez sur le smart tag du contrle TreeView pour le lier au contrle SiteMapDataSource grce la liste droulante Choisir la source de donnes. Une fois la source de donnes slectionne, le rsultat nal de votre menu apparat en mode Conception dans le designer de Visual Web Developer.

m Figure 6-5 : Slection de la source de donnes du contrle TreeView

6.3 Gestion des liens


Les sites personnels proposent couramment de consulter une liste de liens favoris que lauteur du site affectionne. Vous allez mettre en place cette fonctionnalit sur votre site personnel. Pour grer cette liste de liens, vous
96 Le guide du codeur

Gestion des liens

devez implmenter plusieurs fonctions : laffichage de la liste en question, sa sauvegarde et son chargement.

Srialisation XML
Une liste de liens contient gnralement peu de liens, une cinquantaine maximum. Pour les grer, nul besoin de base de donnes. Un simple chier fera laffaire, en loccurrence un chier XML gnr automatiquement grce un mcanisme appel "srialisation". La srialisation permet de sauvegarder un objet, plus prcisment de le faire persister un instant t et de le recharger plus tard, par exemple lors dune utilisation ultrieure de lapplication. Le Framework .NET propose deux types de srialisations : la srialisation binaire, qui stocke linformation dans un chier binaire et donc non lisible avec un diteur de texte, et la srialisation XML, qui permet de gnrer un chier XML contenant lobjet srialis. Crez une classe Lien qui permettra de reprsenter et de stocker un lien en mmoire. Pour cela, affichez le menu contextuel du projet et slectionnez llment
Ajouter une nouvelle classe. Nommez cette classe lien, et crez deux propri-

ts renvoyant des objets de type String : Nom et Url. Elles serviront daccesseur aux champs privs correspondants. Vous devez arriver un rsultat proche de celui-ci :
Public Class Lien Private m_nom As String = String.Empty Private m_url As String = String.Empty Public Property Nom() As String Get Return m_nom End Get Set(ByVal value As String) m_nom = value End Set End Property Public Property URL() As String Get Return m_url End Get Set(ByVal value As String) m_url = value End Set End Property End Class

Le guide du codeur 97

Site web personnel

Comme vous souhaitez grer une liste de liens, et non pas un lien unique, crez une nouvelle classe que vous nommerez Liens. Elle contiendra une proprit Liens qui renvoie une liste de Lien.
Public Class Liens Private Shared m_liens As List(Of Lien) Public Shared Property Liens() As List(Of Lien) Get If m_liens Is Nothing Then m_liens = ChargerLiens() End If Return m_liens End Get Set(ByVal value As List(Of Lien)) m_liens = value End Set End Property End Class

Maintenant que vous pouvez stocker en mmoire une liste de liens, sauvegardez cette liste via le mcanisme de srialisation XML. Pour ce faire, vous devez utiliser trois espaces de noms : System.IO pour les objets lis la manipulation de chiers, System.Xml pour les objets lis la manipulation de documents XML, et System.Xml.Serialization pour les objets ddis la srialisation XML. La srialisation se fait laide dun objet XmlSerializer. Cet objet devant crire dans un chier, il est ncessaire de le lier un autre objet dot de cette capacit dcriture, tel que TextWriter, qui permet dcrire des documents de type texte :
Public Shared Sub SauverLiens() Dim ser As XmlSerializer = _ New XmlSerializer(GetType(List(Of Lien))) Dim writer As TextWriter = _ New StreamWriter("links.xml") ser.Serialize(writer, m_liens) writer.Close() End Sub

Il ne reste plus qu mettre en place la dsrialisation de lobjet pour charger la liste de liens sauvegarde. Ce mcanisme inverse de la srialisation se fait de manire analogue, si ce nest que, au lieu dutiliser un TextWriter pour crire un chier, il faut utiliser un objet TextReader pour le lire :

98 Le guide du codeur

Gestion des liens

Public Shared Function ChargerLiens() As List(Of Lien) Dim returnLiens As List(Of Lien) = _ New List(Of Lien) Dim deser As XmlSerializer = _ New XmlSerializer(GetType(List(Of Lien))) Dim reader As TextReader reader = New StreamReader("links.xml") returnLiens = deser.Deserialize(reader) reader.Close() Return returnLiens End Function

Affichage des liens


Ajoutez une nouvelle page Links.aspx, qui contiendra les contrles ncessaires la gestion des liens. Pour ce faire, affichez le menu contextuel du projet et cliquez sur Ajouter un nouvel lment. Dans la bote de dialogue qui souvre, nommez votre chier Links.aspx. Vriez que la case cocher Slectionner la page matre est coche. Cela vous permettra de slectionner la page matre que vous avez cre prcdemment. Pour afficher la liste de liens, vous allez utiliser un contrle source de donnes qui permet de remplir des contrles daffichage avec une liste ou une collection dobjets. Ce contrle non visuel sappelle ObjectDataSource. Il permet dafficher des donnes venant dune liste dobjets directement dans un contrle daffichage tel que GridView. Il a besoin au minimum dune mthode lui renvoyant cette liste dobjets. Vous devez donc ajouter dans la classe Liens une mthode qui renvoie la liste de Lien :
Public Shared Function GetLiens() As List(Of Lien) Return Liens End Function

Cela fait, placez sur votre formulaire le contrle ObjectDataSource. Il saffiche sous la forme dun rectangle gris, non visible lexcution de la page. Affichez le smart tag li au contrle et cliquez sur le lien Configurer la source de donnes. Un nouvel Assistant apparat, permettant de slectionner la classe utilise. Dcochez la case Afficher uniquement les composants, et slectionnez la classe Liens cre prcdemment. Cliquez sur le bouton Suivant pour passer la prochaine tape. Vous devez slectionner les mthodes de la classe Liens qui seront appeles par le contrle ObjectDataSource lorsque lutilisateur souhaitera afficher les donnes (onglet
Le guide du codeur 99

Site web personnel

Select), les modier (onglet Update), les insrer (onglet Insert) ou encore les supprimer (onglet Delete).

Classe ou mthode absente de la liste Lors de la slection de la classe Liens ou de la mthode GetLiens dans lAssistant de conguration du contrle ObjectDataSource, la classe ou la mthode risque dtre absente de la liste. Si tel est le cas, recompilez lapplication, par exemple laide de la combinaison de touches [Ctrl]+[Maj]+[B], et relancez lAssistant.

Laffichage des donnes est votre unique objectif pour le moment. Sous longlet Select, slectionnez la mthode GetLiens que vous venez dajouter la classe Liens. Cliquez sur le bouton Finish pour valider. Vous avez prsent congur le contrle daccs aux donnes, ObjectDataSource. Il ne reste plus qu afficher les donnes. Pour cela, placez un contrle GridView sur votre formulaire. Ensuite, cliquez sur son smart tag puis, dans la liste droulante Choisir la source de donnes, slectionnez le contrle ObjectDataSource que vous avez ajout la page web. Ds la slection de la source de donnes, Visual Web Developer modie laffichage du contrle GridView et affiche automatiquement deux colonnes, une pour le nom du lien et une autre pour son URL. Ces colonnes ne conviennent pas. En effet, il serait plus pratique de prsenter aux visiteurs une seule colonne, avec des liens ayant comme texte le nom du lien et comme URL la proprit Url de lobjet Lien. Pour arriver ce rsultat, cliquez sur le smart tag du contrle, puis sur le lien
Modifier les colonnes. Une bote de dialogue saffiche permettant de manipuler

les diffrentes colonnes du GridView. Supprimez les colonnes existantes laide du bouton ayant une croix rouge comme icne, et crez-en une nouvelle de type HyperLinkField. Ce type de colonne permet de crer une liste de liens. Dnissez le texte affich en en-tte de la colonne grce la proprit HeaderText. Dnissez les donnes qui vont tre affiches grce deux proprits : DataNavigateUrlFields et DataTextField. La premire permet dindiquer le champ utilis pour dnir le lien, cest--dire lURL vers laquelle le lien va pointer. Dnissez sa valeur Url puisquil sagit du nom de la proprit de la classe Lien quil faut utiliser. Concernant la proprit DataTextField, dnissez sa valeur Nom puisquil sagit du nom de la proprit de la classe Lien qui contient le nom du lien.

100 Le guide du codeur

Page Contact

Ajout des liens


La procdure dajout de liens est assez triviale raliser. Ajoutez deux contrles TextBox la page web, un pour la saisie du nom et un second pour la saisie de lURL, ainsi quun bouton. Dans lvnement Click du bouton, ajoutez le lien la collection de liens prsente en mmoire, puis rafrachissez laffichage du contrle GridView :
Protected Sub Button1_Click(ByVal sender As Object,_ ByVal e As System.EventArgs) Handles Button1.Click Dim nouveauLien As Lien = New Lien nouveauLien.Nom = txtUrl.Text nouveauLien.URL = txtNom.Text Liens.Liens.Add(nouveauLien) GridView1.DataBind() Liens.SauverLiens() End Sub

Enregistrez, puis compilez et affichez le rsultat grce la touche [F5].

6.4 Page Contact


Passons prsent la page Contact. Elle permettre votre visiteur de prendre contact avec vous grce lenvoi dun courrier lectronique. Pour crer cette page Contact, utilisez la commande Ajouter un nouvel lment et ajoutez une WebForm. Vriez que le langage slectionn est Visual Basic et que la case Slectionner la page matre est coche.

m Figure 6-6 : Ajout dune page web Le guide du codeur 101

Site web personnel

Validez. Slectionnez la page matre cre prcdemment pour lappliquer votre page Contact. Ajoutez trois TextBox dans votre page Contact.aspx, la premire ayant un ID gal txtNom, la deuxime un ID gal txtMail, et la dernire un ID gal txtMessage. Modiez galement la proprit TextMode de cette dernire TextBox pour dnir sa valeur Multiline. Ajoutez quelques contrles Label pour dcrire les diffrents champs de saisie, ainsi quun bouton permettant denvoyer le message.

m Figure 6-7 : Interface de la page Contact

Il faut prsent crire un peu de code pour que le visiteur puisse envoyer son e-mail lorsquil clique sur le bouton Envoyer. Les objets lis lenvoi de-mails se situent dans lespace de noms System.Net.Mail. Il est donc utile dcrire un Imports System.Net.Mail en dbut de classe pour accder directement tous ces objets. crivez le code suivant dans lvnement Click du bouton Envoyer :
Protected Sub btnEnvoyer_Click(ByVal sender As Object,_ ByVal e As System.EventArgs) Handles btnEnvoyer.Click Dim mail As New MailMessage() mail.From = _ New MailAddress("adressemail@fai.fr", "Contact") mail.To.Add(New MailAddress("monadressemail@monfai.fr")) mail.Body = "Mail envoy par " & txtNom.Text & vbCrLf mail.Body &= "Adresse mail : " & txtMail.Text & vbCrLf mail.Body &= "Message :" & vbCrLf
102 Le guide du codeur

Check-list

mail.Body &= txtMessage.Text Dim smtp As New SmtpClient smtp.Host = "smtp.wanadoo.fr" smtp.Credentials = _ New Net.NetworkCredential("userName", "password") smtp.Send(mail) envoi du message End Sub

Lapplication est prsent termine. Il ne vous reste plus qu crer une page contenant votre CV par exemple, pour complter le site web.

6.5 Check-list
Dans ce chapitre, vous avez appris :
j j j j

utiliser une page matre au sein de votre site web personnel ; crer un menu grce un chier "sitemap" et un contrle Treeview ; sauvegarder des objets grce la srialisation XML ; utiliser le contrle ObjectDataSource pour remplir un contrle daffichage des donnes avec des objets ; envoyer des e-mails.

Le guide du codeur 103

Ch apit re

7 Site web familial

Classes et espaces de noms utiliss ............. Accs aux donnes .................................... Interface utilisateur ................................... Ralisation ................................................ Check-list ..................................................

106 106 107 109 116

Site web familial

Dans ce chapitre, vous allez crer un site web personnel qui vous permettra de prsenter votre famille ainsi que les photos de vos vacances. Vous utiliserez des composants cls dASP .NET 2.0, comme les pages matres, les thmes et contrles lis aux donnes.

7.1 Classes et espaces de noms utiliss


Il sagit ici, une fois de plus, dune application web. Vous devrez donc utiliser des clases dans lespace de noms System.Web. De plus, vous manipulerez des chiers avec les classes qui se trouvent dans
System.IO, et vous vous connecterez votre base de donnes grce lespace de noms System.Data.SqlClient.

7.2 Accs aux donnes


Vous aurez besoin dune base de donnes pour stocker les photos de lalbum que vous prsenterez sur votre site web. Pour cela, crez votre nouveau site web dans Visual Web Developer 2005 Express.

b Figure 7-1 : Cration dune nouvelle base de donnes pour un site web ASP .NET

Sous le nom de votre site gure un dossier App_Data dans lequel vous stockerez votre base de donnes. Cliquez du bouton droit sur ce dossier et slectionnez la commande Ajouter un nouvel lment. Crez une base de donnes SQL que vous appellerez MaFamille.mdf.

106 Le guide du codeur

Interface utilisateur

m Figure 7-2 : La nouvelle base de donnes

Dans lExplorateur de bases de donnes qui souvre, cliquez du bouton droit sur le dossier Tables pour crer une nouvelle table dans la base. Crez la table Photos en vous basant sur la gure suivante :

b Figure 7-3 : Structure de la table Photos

7.3 Interface utilisateur


Votre site web consistera en deux pages : la page principale, Default.aspx, qui servira prsenter votre famille, et lalbum de vos photos, Album.aspx. Vous pourrez par la suite, ajouter dautres pages si vous le souhaitez. Pour le moment, pour assurer un style uniforme dans toutes les pages du site, vous allez crer une page matre : cliquez du bouton droit sur le nom de votre site web, slectionnez Ajouter un nouvel lment et puis le modle Page matre.

Le guide du codeur 107

Site web familial

m Figure 7-4 : Cration dune page matre

Votre page matre servira de modle pour toutes les autres pages de votre site. Elle contient un ContentPlaceHolder par dfaut, qui correspond la rgion qui pourra tre modie dans les autres pages. Remplissez votre page matre avec le texte que vous voulez, en dehors du ContentPlaceHolder. Par exemple, crivez le nom de votre famille comme titre de la page. Ne dnissez pas les couleurs ou lemplacement des lments. Cela sera fait grce aux thmes que vous prparerez par la suite. Enn, supprimez le chier Default.aspx qui a t cr par dfaut. En effet, celui-ci ne tient pas compte de la page matre que vous venez de construire. Vous allez donc rcrer un chier qui aura le mme nom, mais qui se basera sur votre page matre. Ajoutez un nouvel lment votre site web, comme vous lavez fait pour la page matre, mais slectionnez le modle Web Form (voir Figure 7-5). Les cases Placer le code dans un fichier distinct et Slectionner la page matre doivent tre coches. La premire permet de sparer le code Visual Basic du code ASP .NET, ce qui apporte de la clart, et la deuxime vous oblige slectionner la page matre que vous venez de crer comme modle de votre nouveau formulaire. De la mme manire, crez un deuxime formulaire que vous appellerez Album.aspx.
108 Le guide du codeur

Ralisation

m Figure 7-5 : Cration dun formulaire web bas sur une page matre

Chaque page base sur une page matre contient un contrle Content, qui correspond au ContentPlaceHolder de celle-ci. Dans le contrle Content de la page Default.aspx, prsentez votre famille et crez un lien vers lalbum de photos. Votre interface graphique est presque termine. Vous allez la complter dans la prochaine section en crivant du code ASP .NET.

7.4 Ralisation
Vous avez, pour linstant, deux formulaires web vides, qui se basent sur une page matre. Cependant, aucune de ces pages na de mise en forme ou de mise en page, car cela sera fait laide de thmes. Vous allez, dailleurs, crer un thme pour votre site web tout de suite.

Associer un thme au site


Tout dabord, crez un dossier ASP .NET qui sera ddi aux thmes. Cliquez du bouton droit sur le nom de votre projet et slectionnez, dans le sous-menu Ajouter le dossier ASP .NET, Thme. Appelez votre premier thme Theme1. Dans ce dossier, vous stockerez des images de fond et des feuilles de style CSS qui seront appliques vos formulaires, ds que vous aurez spci ce thme comme celui par dfaut.
Le guide du codeur 109

Site web familial

Pour ce faire, ouvrez le chier Web.config et cherchez la section pages. Ajoutez dans cette balise un attribut theme auquel vous affecterez comme valeur le nom de votre thme.

Source de donnes
Avant de commencer votre album de photos, glissez un objet SqlDataSource dans votre formulaire. Il servira de source de donnes pour le contrle FormView qui grera votre album. Utilisez la balise active pour congurer votre objet an quil se connecte votre base de donnes. Les options par dfaut sont appropries pour les deux premiers crans de lAssistant. En revanche, sur lcran Congurer linstruction Select, en plus de cocher la case ct de lastrisque pour que lobjet SqlDataSource rcupre toutes les donnes de la table, cliquez sur le bouton Options avances pour spcier que les insertions et les mises jour devront aussi tre gres. Il suffit pour cela de cocher les deux cases de la fentre qui souvre. Malheureusement, comme votre base de donnes utilise le type image pour la colonne qui stocke les photos, la conguration cre par lAssistant ne convient pas compltement votre application. Vous devez donc modier le code ASP .NET la main pour supprimer les rfrences aux paramtres correspondant la colonne Photo :
<asp:SqlDataSource ID="SqlDataSource" runat="server" ConflictDetection="CompareAllValues" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" DeleteCommand="DELETE FROM [Photos] WHERE [PhotoID] = @original_PhotoID" InsertCommand="INSERT INTO [Photos] ([Titre], [Description], [Photo]) VALUES (@Titre, @Description, @Photo)" OldValuesParameterFormatString="original_{0}" SelectCommand="SELECT * FROM [Photos]" UpdateCommand="UPDATE [Photos] SET [Titre] = @Titre, [Description] = @Description WHERE [PhotoID] = @original_PhotoID"> <DeleteParameters> <asp:Parameter Name="original_PhotoID" Type="Int32" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="Titre" Type="String" /> <asp:Parameter Name="Description" Type="String" /> <asp:Parameter Name="original_PhotoID" Type="Int32" /> </UpdateParameters> <InsertParameters> <asp:Parameter Name="Titre" Type="String" /> <asp:Parameter Name="Description" Type="String" />
110 Le guide du codeur

Ralisation

</InsertParameters> </asp:SqlDataSource>
m SqlDataSource modi sans paramtre pour la colonne Photo

tant donn que vous avez supprim les paramtres correspondant la colonne Photo, vous ne pouvez pas stocker les images dans votre base de donnes, moins de grer les vnements Inserting et Updating de SqlDataSource.
Protected Sub SqlDataSource_Inserting( _ ByVal sender As Object, _ ByVal e As SqlDataSourceCommandEventArgs) _ Handles SqlDataSource.Inserting Dim stateTextBox As FileUpload = _ FormView1.FindControl("FichierPhoto") Dim inputStream As Stream = _ stateTextBox.PostedFile.InputStream Dim imageLength As Integer = _ stateTextBox.PostedFile.ContentLength Dim imageBinary(imageLength) As Byte Dim inputRead As Integer = _ inputStream.Read(imageBinary, 0, imageLength) Dim imageData() As Byte = imageBinary Dim param As New SqlParameter("@photo", _ System.Data.SqlDbType.Image) param.Value = imageData e.Command.Parameters.Add(param) End Sub Protected Sub SqlDataSource_Updating( _ ByVal sender As Object, _ ByVal e As SqlDataSourceCommandEventArgs) Handles SqlDataSource.Updating Dim stateTextBox As FileUpload = _ FormView1.FindControl("FichierPhoto") If stateTextBox.FileName.Length > 0 Then e.Command.CommandText = "UPDATE [Photos] _ SET [Titre] = @Titre, [Description] = @Description, _ [Photo] = @Photo WHERE [PhotoID] = @original_PhotoID" Dim inputStream As Stream = _ stateTextBox.PostedFile.InputStream Dim imageLength As Integer = _ stateTextBox.PostedFile.ContentLength Dim imageBinary(imageLength) As Byte Dim inputRead As Integer = _ inputStream.Read(imageBinary, 0, imageLength) Dim imageData() As Byte = imageBinary Dim param As New SqlParameter("@photo", _ System.Data.SqlDbType.Image) param.Value = imageData

Le guide du codeur 111

Site web familial

e.Command.Parameters.Add(param) End If End Sub


m Gestionnaires des vnements Inserting et Updating du contrle SqlDataSource

Dans ces gestionnaires, on cre le paramtre correspondant la colonne Photo. On utilise, comme valeur de ce paramtre, limage qui se trouve dans le champ FichierPhoto du contrle FormView que lon crera par la suite. Vous allez maintenant crer le contrle FormView, une nouveaut dASP .NET 2.0, qui grera votre album photos.

Album de photos
Dposez un contrle de type FormView dans votre chier Album.aspx pour la gestion de votre album de photos. Utilisez la balise active de FormView pour spcier le contrle SqlDataSource comme source de donnes de celui-ci et pour activer la pagination. Modiez les modles du contrle FormView correspondant ldition des donnes, leur insertion et la page qui sera affiche si la source de donnes est vide. Voici un exemple de contrle FormView pour la gestion de lalbum de photos :
<asp:FormView ID="FormView1" runat="server" AllowPaging="True" DataKeyNames="PhotoID" DataSourceID="SqlDataSource"> <EditItemTemplate> Titre: <br /> <asp:TextBox ID="TitreTextBox" runat="server" Text=<%# Bind("Titre") %>></asp:TextBox><br /> Description: <br /> <asp:TextBox ID="DescriptionTextBox" runat="server" Text=<%# Bind("Description") %> Rows="5" TextMode="MultiLine"></asp:TextBox> <br /> Photo: <br /> <asp:FileUpload ID="FichierPhoto" runat="server" /> <br /> <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="Mettre jour"> </asp:LinkButton> <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False"

112 Le guide du codeur

Ralisation

CommandName="Cancel" Text="Annuler"> </asp:LinkButton> </EditItemTemplate> <InsertItemTemplate> Titre: <br /> <asp:TextBox ID="TitreTextBox" runat="server" Text=<%# Bind("Titre") %>></asp:TextBox><br /> Description: <br /> <asp:TextBox ID="DescriptionTextBox" runat="server" Text=<%# Bind("Description") %> Rows="4" TextMode="MultiLine"></asp:TextBox> <br /> Photo: <br /> <asp:FileUpload ID="FichierPhoto" runat="server" /> <br /> <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Insrer"> </asp:LinkButton> <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Annuler"> </asp:LinkButton> </InsertItemTemplate> <ItemTemplate> <h2> <asp:Label ID="TitreLabel" runat="server" Text=<%# Bind("Titre") %>></asp:Label> </h2> <asp:Image ID="Image2" runat="server" ImageUrl=<%# Eval("PhotoID", "Photo.ashx?id={0}") %> /> <br /> <asp:Label ID="DescriptionLabel" runat="server" Text=<%# Bind("Description") %>></asp:Label> <p> <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit" Text="Modifier"></asp:LinkButton> <asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete" Text="Supprimer"> </asp:LinkButton> <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New" Text="Nouveau"></asp:LinkButton> </p>
Le guide du codeur 113

Site web familial

</ItemTemplate> <EmptyDataTemplate> <p>Lalbum photos est vide, cliquez <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New" Text="ici"></asp:LinkButton> pour ajouter une photo.</p> </EmptyDataTemplate> </asp:FormView>
m Exemple de contrle FormView pour la gestion de lalbum de photos

Vous pouvez personnaliser vos modles votre guise. La seule contrainte vitale respecter est le nom des contrles FileUpload. En effet, il faut absolument que celui-ci corresponde au nom utilis dans les gestionnaires dvnements de lobjet SqlDataSource. Tous vos contrles sont directement lis votre source de donnes, lexception de celui qui affiche limage stocke dans la base de donnes. En effet, cette liaison nest pas possible et vous devrez utiliser un gestionnaire gnrique qui retrouvera les images dans la base.

Gestionnaire gnrique
Ajoutez un chier de type Gestionnaire gnrique votre projet. Pour tre conforme aux modles de lexemple de contrle FormView prcdent, appelez-le Photo.ashx. Un gestionnaire gnrique est une simple classe capable de rpondre une requte HTTP. En effet, la mthode ProcessRequest du gestionnaire sera excute chaque appel de celui-ci et son rsultat sera renvoy au client qui a fait la requte. Vous allez donc utiliser lidentiant de la photo que vous souhaitez afficher pour rcuprer celle-ci dans la base de donnes et la renvoyer au client. Voici un gestionnaire gnrique qui cherche limage demande dans la base de donnes et la renvoie au client :
Public Class Photo : Implements IHttpHandler Public Sub ProcessRequest( _ ByVal context As HttpContext) _ Implements IHttpHandler.ProcessRequest context.Response.ContentType = "image/jpeg" context.Response.Cache.SetCacheability( _ HttpCacheability.Public) context.Response.BufferOutput = False Dim id As Integer = -1
114 Le guide du codeur

Ralisation

Dim stream As Stream id = Convert.ToInt32( _ context.Request.QueryString("id")) stream = GetPhoto(id) Const buffersize As Integer = 1024 * 16 Dim buffer(buffersize) As Byte Dim count As Integer = stream.Read( _ buffer, 0, buffersize) While (count > 0) context.Response.OutputStream.Write( _ buffer, 0, count) count = stream.Read(buffer, 0, buffersize) End While End Sub Private Shared Function GetPhoto( _ ByVal photoid As Integer) As Stream Using connection As New SqlConnection( _ ConfigurationManager.ConnectionStrings( _ "ConnectionString").ConnectionString) Using myCommand = New SqlCommand( _ "SELECT [photo] FROM [photos] _ WHERE ([photoid]=@id)", connection) myCommand.Parameters.Add(New SqlParameter( _ "@id", photoid)) connection.Open() Dim result As Object = _ myCommand.ExecuteScalar() Try Return New MemoryStream( _ CType(result, Byte())) Catch Return Nothing End Try End Using End Using End Function Public ReadOnly Property IsReusable() As Boolean _ Implements IHttpHandler.IsReusable Get Return True End Get End Property End Class
m Gestionnaire gnrique pour rcuprer des images stockes dans une base de donnes

Le guide du codeur 115

Site web familial

On utilise simplement les objets SqlConnection et SqlCommand pour se connecter la base de donnes et rcuprer limage souhaite. Celle-ci est transforme en ux MemeoryStream et renvoye au client via la mthode Response.Output Stream.Write de lobjet context, qui est le seul paramtre de la mthode ProcessRequest et qui correspond la session HTTP courante. Maintenant que vous pouvez rcuprer les images qui se trouvent dans votre base de donnes, votre site est fonctionnel. Il ne reste plus qu personnaliser la page matre et le thme crs prcdemment pour que le site illustre au mieux vos vacances en famille.

7.5 Check-list
Dans ce chapitre, vous avez appris :
j

j j j

crer un site web avec un style uniforme en utilisant les pages matres et les thmes ; stocker des images dans une base de donnes SQL Server 2005 ; utiliser les contrles lis aux donnes de Visual Basic 2005 ; utiliser un HTTPHandler pour rcuprer des chiers stocks dans une base de donnes.

116 Le guide du codeur

Ch apit re

8 Site web dune association


Cration de la hirarchie des pages .............. Gestion des informations ............................ Gestion de la scurit ................................. Check-list .................................................. 118 119 128 134

Site web dune association

Vous allez crez, dans ce chapitre, le site web dune association. La France compte prs dun million dassociations, quelles soient humanitaires, sportives, religieuse, etc. La communication est souvent un outil indispensable la vie dune association. Pour prsenter les activits proposes, vous allez crer un site permettant de consulter lactualit de lassociation, et des dossiers. Pour vivre, un site doit tre dynamique. Vous allez donc inviter les membres du site saisir eux-mmes leurs actualits ou leurs dossiers pour quils participent activement la vie du site. Cela implique une gestion de la scurit pour viter que nimporte qui puisse modier le site. Vous allez apprendre mettre en place ce genre de fonctionnalit grce ASP .NET 2, Visual Basic 2005 et Visual Web Developer Express.

8.1 Cration de la hirarchie des pages


Le chapitre Site web familial explique comment crer une page
Renvoi matre, des pages web utilisant cette page matre et comment crer

des menus.

Pour dbuter ce nouveau projet, crez un nouveau site web et ajoutez la hirarchie de pages suivantes :

b Figure 8-1 : Hirarchie des pages

118 Le guide du codeur

Gestion des informations

Laissez ces pages vides pour le moment. Vous allez les remplir tout au long de ce chapitre. Vous navez qu appliquer la page matre cre toutes les autres pages et le travail sera termin pour le moment.

8.2 Gestion des informations


Il faut prsent stocker une information en mmoire. Pour cela, crez une classe Information qui va dnir ce quest une information. Celle-ci peut tre caractrise par un identiant (id), un titre, son contenu, sa date de publication, ainsi que son type. Une information peut tre une actualit ou un dossier. Il est donc pertinent dutiliser une numration pour dnir le type dinformation :
Public Enum TypeInformation Actualite = 0 Dossier = 1 End Enum

En programmation oriente objet, les caractristiques dun lment sont souvent reprsentes par des proprits. Implmentez donc autant de proprits que de donnes lies une information. Vous devez arriver un rsultat proche de celui-ci :
Public Class Information Private m_id As Integer Private m_titre As String Private m_contenu As String Private m_typeInformation As TypeInformation Private m_datePublication As Date Public Property Id() As Integer Get Return m_id End Get Set(ByVal value As Integer) m_id = value End Set End Property Public Property Titre() As String Get Return m_titre End Get Set(ByVal value As String) m_titre = value End Set End Property

Le guide du codeur 119

Site web dune association

Public Property Contenu() As String Get Return m_contenu End Get Set(ByVal value As String) m_contenu = value End Set End Property Public Property Type() As TypeInformation Get Return m_typeInformation End Get Set(ByVal value As TypeInformation) m_typeInformation = value End Set End Property Public Property DatePublication() As Date Get Return m_datePublication End Get Set(ByVal value As Date) m_datePublication = value End Set End Property End Class

Cration de la base de donnes


La gestion des informations consiste enregistrer des donnes dans la base. Pour cela, vous allez utiliser SQL Server Express Edition. Dmarrez lapplication SQL Management Studio Express Edition et crez une nouvelle base de donnes que vous appellerez SiteAssoc. Dans cette base, ajoutez une table nomme Informations et crez-la selon le schma suivant :

b Figure 8-2 : Schma de la table Informations

120 Le guide du codeur

Gestion des informations

Prtez attention aux points suivants :


j

Le champ id_information doit tre dni en tant que cl primaire. Pour cela, cliquez du bouton droit sur la ligne correspondant au champ et slectionnez Crer cl primaire dans le menu contextuel. Le champ id_information doit tre dni en tant que champ en autoincrmentation. Cela vous vitera dincrmenter manuellement la valeur du champ chaque insertion dune information. Lopration sera effectue automatiquement par SQL Server. Pour cela, dans la zone des proprits du champ, slectionnez la proprit Identity Specification et dnissez la proprit IsIdentity Yes et la proprit Identity Increment 1.

b Figure 8-3 : Auto-incrmentation dun champ

Voici le script SQL permettant de crer directement la table Informations :


CREATE TABLE [dbo].[Informations]( [id_information] [int] IDENTITY(1,1) NOT NULL, [titre_information] [varchar](50) COLLATE French_CI_AS NOT NULL, [contenu_information] [varchar](max) COLLATE French_CI_AS NOT NULL, [date_information] [nchar](10) COLLATE French_CI_AS NOT NULL CONSTRAINT [DF_Informations_date_information] DEFAULT (getdate()), [type_information] [tinyint] NOT NULL, CONSTRAINT [PK_Informations] PRIMARY KEY CLUSTERED ( [id_information] ASC )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO

Le guide du codeur 121

Site web dune association

Insrer les informations


Il faut prsent implmenter la fonctionnalit dinsertion des informations dans la base de donnes. La classe daccs aux donnes se nommera InformationDAO. Ajoutez donc cette nouvelle classe dans votre projet. Celle-ci se retrouve dans le dossier spcial dASP .NET App_Code. Vous utiliserez deux espaces de noms relatifs la gestion des donnes en base SQL Server : System.Data et System.Data.SqlClient. Noubliez donc pas de placer des instructions dimportation de ces espaces de noms en tout dbut du chier contenant votre classe. Pour insrer des donnes dans une base de donnes SQL Server, vous devez utiliser au moins deux objets : un objet SqlConnection, qui permet dtablir une connexion la base, et un objet SqlCommand, qui permet dexcuter une requte SQL. Vous ouvrirez la connexion en spciant une chane de connexion qui dsigne la base utiliser ainsi que le mode dauthentication.
Attributs de la chane de connexion dnir Attribut Description

server

Dnit ladresse du serveur ainsi que son instance. Vous pouvez indiquer ici le nom de la machine et le nom dinstance, ou alors ladresse IP de la machine et le nom dinstance. Nom de la base de donnes laquelle se connecter. Permet de dnir le nom dutilisateur et le mot de passe utiliser en cas dactivation du mode dauthentication SQL. Doit tre dni et gal SSPI en cas dactivation du mode dauthentication Windows.

Database User ;password

Integrated Security

Ouvrez la connexion dans un bloc Try Catch car cette ouverture peut chouer en cas dindisponibilit du serveur par exemple. Ajoutez les paramtres dentre (et mme de sortie) lobjet SqlCommand en utilisant la mthode Add de la collection Parameters de celui-ci, puis en dnissant le nom du paramtre ajouter dnir et sa valeur :
Imports System.Data Imports System.Data.SqlClient Public Class InformationDAO

122 Le guide du codeur

Gestion des informations

Public Shared Sub CreateInformation(ByVal information As Information) Dim connection As New SqlConnection ("server=.\SQLEXPRESS;database=siteassoc;integrated security=SSPI") Try connection.Open() Dim cmdCreate As SqlCommand cmdCreate = connection.CreateCommand cmdCreate.CommandText = "insert into informations" & _ "(titre_information, contenu_information, " & _ & "type_information) values (@titre,@contenu,@type)" With cmdCreate.Parameters .AddWithValue("@titre", information.Titre) .AddWithValue("@contenu", information.Contenu) .AddWithValue("@type", information.Type) End With cmdCreate.ExecuteNonQuery() Catch ex As Exception Throw Finally connection.Dispose() End Try End Sub End Class

Insrer des actualits et des dossiers


Vous pouvez prsent passer la ralisation des pages ddition des actualits et des dossiers situes dans le dossier Prive. La ralisation de ces pages est simple. Pour permettre aux rdacteurs dactualits et de dossiers de rdiger leurs informations et dappliquer une mise en page et une mise en forme au texte saisi, il est ncessaire dutiliser un composant externe ASP .NET, bien plus riche que le contrle TextBox propos en standard. Utilisez par exemple le contrle FreeTextBox, qui est gratuit et disponible en tlchargement ladresse http://freetextbox.com/default.aspx, sous la forme dun chier ZIP. Pour lajouter dans la bote outils, dzippez le chier dans un dossier grce un outil de compression/dcompression. Cliquez du bouton droit dans la bote outils. Dans le menu contextuel qui saffiche, slectionnez Choisir les lments. Dans la bote de dialogue qui saffiche, cliquez sur le bouton Parcourir pour rechercher le chier FreeTextBox.dll prsent dans le dossier Framework-2.0.

Le guide du codeur 123

Site web dune association

m Figure 8-4 : Ajout de FreeTextBox dans la bote outils

Validez pour afficher le contrle dans la bote outils. Il ne reste plus qu glisser le contrle sur la page de rdaction des actualits pour pouvoir lutiliser. Ajoutez galement un contrle TextBox, que vous nommerez txtTitre, qui permettra de saisir le titre de lactualit, et un bouton qui permettra deffectuer linsertion. Pour effectuer linsertion, appelez la mthode CreateInformation crite auparavant, en lui passant en paramtre un objet Information :
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim information As New Information information.Contenu = FreeTextBox1.Text information.Titre = txtTitre.Text information.Type = TypeInformation.Actualite InformationDAO.CreateInformation(information) End Sub

124 Le guide du codeur

Gestion des informations

m Figure 8-5 : Le contrle FreeTextBox dans une page web en cours dexcution

Scurit ASP .NET Ds que le rdacteur saisira une information en appliquant une mise en forme (mise en gras, italique) et cliquera sur le bouton, cela provoquera une erreur "Une valeur Request.Form potentiellement dangereuse a t dtecte partir du client". Cette erreur vient du fait que lon essaie denvoyer du code HTML au serveur alors que ASP .NET bloque cette possibilit par dfaut pour des raisons de scurit. Pour viter une telle erreur, vous devez ajouter lattribut ValidateRequest dans la directive Page en lui attribuant la valeur false. Pour cela, affichez le code source HTML de votre page dans Visual Web Developer, et dans la premire ligne (o se trouve la directive Page), ajoutez lattribut et sa valeur.

Rptez les mmes oprations pour la page de rdaction des dossiers, en prenant soin de modier le type de linformation dans lvnement Click du bouton dinsertion pour insrer un dossier, et non une actualit, dans la base.

Afficher les actualits et les dossiers


Maintenant quil est possible dajouter des donnes dans la base et dafficher des informations, vous allez crer la page daffichage des actualits, laffichage des dossiers pouvant se faire exactement de la mme manire.

Le guide du codeur 125

Site web dune association

Placez un contrle SqlDataSource sur la page Actualites.aspx. Il sagit dun contrle source de donnes, qui permet de remplir un contrle daffichage avec des donnes issues dune base de donnes, et tout cela sans crire une ligne de code. Cliquez sur le smart tag du contrle puis sur le lien Configurer la source de
donnes.

Dans lAssistant qui saffiche, cliquez sur le bouton Nouvelle Connexion pour crer la chane de connexion qui sera utilise par le contrle. Slectionnez une base de type SQL Server puis saisissez les informations fournies dans la chane de connexion dnie prcdemment.

b Figure 8-6 : Paramtres Connexion

Validez et cliquez sur Suivant dans lAssistant pour slectionner les donnes afficher. La base nayant quune seule table, la table Informations est alors slectionne par dfaut. Slectionnez les champs que vous souhaitez afficher. Slectionnez-les tous, except le champ type_information.

126 Le guide du codeur

Gestion des informations

Vous devez prsent dnir un critre de slection puisque toutes les informations sont stockes dans la table Informations : les actualits comme les dossiers. Pour ce faire, cliquez sur le bouton Where, slectionnez le champ sur lequel portera le critre, cest--dire le champ type_information. Dans la zone de slection Source, slectionnez None, et affectez la valeur 0 au paramtre. Cette valeur 0 est la valeur dnie par lnumration TypeInformation cre en dbut de chapitre. Validez et fermez lAssistant pour afficher les donnes.

m Figure 8-7 : Clause Where

Ajoutez prsent un contrle DataList sur votre page, affichez son smart tag pour slectionner le contrle SqlDataSource qui vient dtre cr comme source de donnes. Ds que lon affecte une source de donnes au contrle, celui-ci reconnat les diffrents lments afficher. Toujours dans le smart tag, cliquez sur le lien Mise en forme automatique, pour slectionner un style daffichage plus propre et plus professionnel que celui par dfaut. Vous pouvez maintenant excuter la page laide de la touche [F5] pour vrier que les actualits saffichent correctement. Laffichage des dossiers peut se faire exactement de la mme manire. Vous devez simplement modier la valeur du paramtre de la clause Where et la dnir 1 pour rcuprer les dossiers, et non les actualits.
Le guide du codeur 127

Site web dune association

8.3 Gestion de la scurit


ASP .NET 2 propose une gestion de la scurit simple mettre en uvre. Nul besoin dcrire du code pour implmenter une gestion des membres, des rles, des autorisations, de lauthentication, vous pouvez tout faire directement, en modiant quelques paramtres de conguration de lapplication, et en utilisant les contrles web de scurit, tels que le contrle de login, le contrle de cration de compte, etc.

Cration de la base de donnes


Crez la base de donnes qui va contenir les informations ncessaires la gestion des membres de votre site. Habituellement, cette tape prend du temps, car il est ncessaire de rchir au schma de la base, aux donnes stocker, etc. Pour vous faciliter la vie et mettre en place rapidement une gestion des membres dans une application web, ASP .NET 2 propose un Assistant capable de crer automatiquement une base de donnes, les diffrentes tables et procdures stockes ncessaires une gestion solide des membres. Pour lancer cet Assistant, excutez le programme aspnet_regsql.exe prsent dans le dossier dinstallation du Framework .NET 2.

Dossier du Framework .NET 2 Le Framework .NET se situe dans le dossier Windows/Microsoft.NET/Framework. Vous y trouverez un dossier par version du Framework .NET install sur votre machine. Rendez-vous dans le dossier de la version 2. Exemple : C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727.

Une fois lapplication lance, lAssistant saffiche (voir Figure 8-8). Cliquez sur Suivant pour passer ltape suivante et slectionnez loption Configurer SQL Server pour les services dapplications. Cliquez de nouveau sur le bouton Suivant pour saisir les paramtres de connexion votre serveur SQL Server. Si votre serveur est install sur votre poste de dveloppement, vous pouvez saisir .\SQLEXPRESS dans le champ Serveur, le point dsignant la machine locale, et SQLEXPRESS dsignant linstance cre lors de linstallation de SQL Server 2005 Express.

128 Le guide du codeur

Gestion de la scurit

m Figure 8-8 : Assistant de cration de base de donnes de gestion des membres

Cliquez de nouveau plusieurs fois sur le bouton Suivant pour valider la cration de la base de donnes. Cette base sappelle par dfaut aspnetdb et peut tre utilise par plusieurs applications. Si vous ouvrez prsent SQL Server Management Studio Express, vous trouverez une base de donnes aspnetdb contenant plusieurs tables, comme aspnet_Membership, aspnet_Users, aspnet_UserInRoles, etc.

m Figure 8-9 : Tables gnres par lAssistant

Le guide du codeur 129

Site web dune association

Examinez la liste des procdures stockes qui ont t gnres et qui accdent ces tables (plus dune cinquantaine !) : lAssistant a fait une bonne partie du travail. Cette tche aurait ncessit plusieurs heures si elle avait du tre ralise manuellement.

Conguration de lapplication
Ltape suivante consiste congurer lapplication web pour utiliser tout ce qui a t gnr. Pour cela, affichez lExplorateur de solutions et cliquez sur licne daccs au site dadministration de lapplication.

b Figure 8-10 : Icne daccs

Cliquez sur longlet Scurit puis sur le lien Slectionner le type dauthentification.

Vous arrivez sur une page permettant de slectionner le type daccs au site : depuis un rseau local ou depuis Internet. Slectionnez laccs depuis Internet. Cela a pour effet de congurer lapplication pour quelle utilise une authentication base sur un formulaire (comme la grande majorit des sites web), et non base sur les comptes Windows. Rendez-vous ensuite sous longlet Fournisseur. Il permet de slectionner le fournisseur daccs aux donnes utiliser pour accder aux donnes relatives la gestion des membres. Cliquez sur le lien Slectionner un fournisseur daccs unique pour toutes les donnes de gestion de site et slectionnez le fournisseur AspNetSqlProvider. Ce fournisseur permet dutiliser les donnes gnres par lAssistant prcdemment utilis. Cliquez sur le lien Test pour vrier que la connexion la base de donnes se fait correctement et validez.

130 Le guide du codeur

Gestion de la scurit

Cration des rles


Vous allez maintenant crer les rles utilisateurs de votre application. Le site web accepte plusieurs types dutilisateurs :
j

Les utilisateurs anonymes, qui viennent consulter le site web pour rcuprer des informations sur lassociation. Les rdacteurs dactualits, authentis sur le site et qui peuvent ajouter des informations sur le site. Les rdacteurs de dossiers, authentis sur le site et qui peuvent ajouter des dossiers.

Pour crer ces deux rles, rendez-vous sous longlet Scurit du site web dadministration et cliquez sur le lien Activez les rles. Cliquez ensuite sur le lien Crer ou Grer des rles pour crer les deux rles que vous nommerez RedacteurActualites, RedacteurDossiers.

Cration des rgles daccs


Il faut prsent crer les rgles daccs aux diffrents dossiers du site web. Pour cela, toujours sous longlet Scurit du site web dadministration, cliquez sur le lien Crer des rgles daccs. Ces rgles daccs correspondent aux autorisations que vous souhaitez affecter aux membres en fonction de leurs rles :
Liste des rgles daccs mettre en place Dossier Prive Prive\Actualites Prive\Dossiers Rle Rgle

Tout le monde
RedacteurActualites RedacteurDossiers

Refuser Autoriser Autoriser

La cration est intuitive : il suffit de cliquer sur le dossier souhait, de slectionner le rle souhait ainsi que la rgle crer pour que les autorisations soient automatiquement gres.

Le guide du codeur 131

Site web dune association

m Figure 8-11 : Cration de rgles daccs

Cration dun utilisateur


Il ne reste plus qu crer le compte utilisateur qui sera, par exemple, rdacteur dactualits pour enn tre capable de mettre en place le mcanisme de gestion des membres et des rles au sein de lapplication. Pour cela, sous longlet Scurit, cliquez sur le lien Crer un utilisateur. Puis dans la fentre qui souvre, saisissez toutes les informations ncessaires la cration du compte, sans oublier de slectionner le rle RedacteurActualites.

m Figure 8-12 : Cration de lutilisateur RedacteurActualites

132 Le guide du codeur

Gestion de la scurit

Implmentation du site web


Il ne vous reste plus qu raliser les pages de login et de cration de compte pour que la scurit soit fonctionnelle sur le site web. Pour ce faire, rien de plus simple : ouvrez la page Login.aspx et placez un contrle Login.

b Figure 8-13 : Contrle Login dans la bote outils

Le contrle Login reprsente une bote de dialogue de connexion. Cette bote est semblable toutes celles que lon a lhabitude de voir sur les sites web : elle permet au visiteur de saisir son nom dutilisateur, son mot de passe et de spcier sil souhaite que son identication soit mmorise ou non. Il ne sagit pas dun simple contrle graphique. Lorsque vous linsrez sur une page web, vous indiquez ASP .NET 2 que vous souhaitez utiliser les services de gestion des membres quil propose. En effet, ce contrle a un comportement prdni, ce qui le rend prt lemploi. Vous pouvez ds prsent le tester en excutant la page et en essayant de vous connecter sous le compte utilisateur Administrateur que vous avez cr, et sous un compte qui nexiste pas pour vrier que ASP .NET renvoie bien une erreur didentication dans ce cas. Le contrle tant prt lemploi, il suffit dappliquer une petite modication de mise en forme an que le rsultat soit parfait. Pour cela, cliquez sur le smart tag puis sur le lien Mise en forme automatique. Une bote de dialogue saffiche. Elle propose diffrents styles appliquer au contrle Login. Slectionnez celui qui vous convient.

b Figure 8-14 : Appliquer un style au contrle Login

Le guide du codeur 133

Site web dune association

Il faut galement modier la page Signin.aspx, qui permet de crer un compte utilisateur,. Placez un contrle CreateUserWizard, qui est un Assistant de cration de compte. Il permet de crer des utilisateurs sans crire une seule ligne de code. De plus, des validations sont effectus pour vrier que le nom dutilisateur est bien unique, que le mot de passe est assez complexe, etc.

Mot de passe Lors de la cration dutilisateurs avec CreateUserWizard, une erreur peut intervenir au niveau de la validation du mot de passe. En effet, les rgles de scurit dASP .NET imposent de saisir des mots de passe de 7 caractres minimum, avec au moins un caractre non alphanumrique. Il suffit de saisir un mot de passe satisfaisant ces rgles pour que la cration de lutilisateur soit effective.

8.4 Check-list
Dans ce chapitre, vous avez appris :
j j

insrer des donnes dans une base de donnes SQL Server Express 2005 ; afficher des donnes provenant dune table grce un contrle SqlDataSource ; implmenter des fonctions de scurit telles que la gestion des membres et des rles dans un site web.

134 Le guide du codeur

Ch apit re

9 Moniteur de performances
Classes et espaces de noms utiliss ............. Espace de noms My ................................... Rcuprer des informations grce lespace de noms System.Management ..................... Afficher des informations sur le processeur ... Crer une vue synthtique ........................... Check-list .................................................. 136 136 141 144 145 149

Moniteur de performances

Les utilitaires de diagnostic permettant dafficher des informations prcises sur lordinateur que lon est en train dutiliser et de mesurer son activit sont de plus en plus lgion, et sont de plus utiliss. Ces outils permettent de sassurer que tout fonctionne correctement, et de savoir le taux doccupation de la machine en regardant des informations telles que loccupation de la mmoire vive, lespace disque utilis sur le ou les disques dur, le taux doccupation du microprocesseur, etc. Pour avoir un outil qui vous convienne parfaitement, vous allez crer votre propre moniteur de performances. Il affichera les caractristiques dtailles de lordinateur et surveillera les informations les plus pertinentes en les affichant sous forme de graphique.

9.1 Classes et espaces de noms utiliss


Vous allez utiliser plusieurs espaces noms. Lespace de noms My est spcial. Il est apparu avec la version 2005 de Visual Basic et nexistait pas dans les versions 2002 et 2003. Il permet daccder un ensemble de fonctionnalits souvent utilises. Vous allez crer une application Windows et utiliserez donc frquemment lespace de noms System.Windows.Forms, qui contient toutes les classes permettant de crer des interfaces graphiques grce des formulaires et des contrles.
System.Management donne accs la bibliothque WMI, qui permet de grer un ordinateur et de rcuprer des informations dtaills son propos.

9.2 Espace de noms My


Vous allez commencer par rcuprer quelques informations simples propos de lordinateur grce aux fonctionnalits proposes par lespace de noms My. Il permet daccder rapidement un ensemble de fonctionnalits utiles, sans recourir aux nombreux espaces de noms prsents dans le Framework .NET 2.
My contient les classes suivantes :
Fonctionnalits proposes par lespace de noms My Classe Fonctionnalit

Application Computer

Informations sur lapplication : son titre, sa version, sa description, son auteur, etc. Informations et accs certaines fonctionnalits lies lordinateur : manipulation de la Base de registre, accs au systme de chiers, informations sur les composants, etc.

136 Le guide du codeur

Espace de noms My

Fonctionnalits proposes par lespace de noms My Classe Fonctionnalit

Forms Ressources Settings User WebServices

Permet daccder la collection des formulaires de lapplication. Permet daccder aux ressources de lapplication : icnes, images, etc. Paramtres de lapplication et paramtres utilisateurs Information sur lutilisateur qui excute lapplication : nom dutilisateur, groupe, domaine auquel il est rattach, etc. Permet daccder la collection des services web rfrencs au niveau du projet.

Vous allez dans un premier temps rcuprer les informations proposes par la classe Computer, prsente dans lespace de noms My.

Informations sur le systme dexploitation


Vous allez commencer par afficher des informations sur le systme dexploitation install sur votre ordinateur. Pour cela, et dans le but de les regrouper de manire logique dans la fentre, ajoutez un contrle GroupBox puis trois contrles Label dans GroupBox. Ces contrles Label vont permettre dafficher le nom de systme dexploitation, son type et sa version. Changez la proprit Name de ces contrles Label et utilisez les valeurs suivantes : lblOS, lblPlateForme et lblVersion. Ajoutez trois autres contrles Label pour dcrire ces champs. Il ne reste plus qu afficher la valeur relle de ces informations dans les contrles Label que vous venez de crer. Ces informations sont accessibles via la proprit Info de lobjet Computer prsent dans lespace de noms My. Vous allez donc utiliser My.Computer.Info pour afficher tous les lments ncessaires dans lvnement Load du formulaire an que les donnes soit affiches ds son ouverture.
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load With My.Computer lblOS.Text = .Info.OSFullName lblPlateForme.Text = .Info.OSPlatform lblVersion.Text = .Info.OSVersion End With End Sub

Le guide du codeur 137

Moniteur de performances

m Figure 9-1 : Affichage des informations sur le systme dexploitation

Information sur lutilisation de la mmoire


Vous allez prsent afficher des informations sur lutilisation de la mmoire de lordinateur. Il sagit de donnes concernant la mmoire physique de la machine (la mmoire vive, galement appele RAM) et la mmoire virtuelle. En ce sens, vous devez ajouter quelques contrles linterface de la fentre. Commencez comme prcdemment par placer un contrle GroupBox pour dlimiter le groupe de contrles qui afficheront des donnes sur la mmoire. Ajoutez ensuite quatre contrles Label. Modiez leur proprit Name en affectant les valeurs lblMemPhyFree, lblMemPhyTotal, lblMemVirtFree et lblMemVirtTotal, pour afficher la mmoire physique libre, le volume total de mmoire physique, la mmoire virtuelle libre et le volume total de la mmoire virtuelle. Ajoutez quelques contrles Label "compagnons" pour dcrire les champs prcdemment insrs dans la fentre. Ajoutez enn deux contrles ProgressBar pour afficher le pourcentage de mmoire physique et virtuelle occupe.

m Figure 9-2 : Affichage des informations sur la mmoire

Pour afficher des informations sur la mmoire, vous allez utiliser comme prcdemment My.Computer.Info. Mais pour actualiser ces donnes en quasi "temps rel", vous utiliserez un contrle Timer.
Proprits fournissant des informations sur la mmoire Proprit Description

AvailablePhysicalMemory AvailableVirtualMemory

Mmoire vive physique (RAM) disponible sur lordinateur. Valeur exprime en octets. Mmoire virtuelle disponible sur lordinateur. Valeur exprime en octets.

138 Le guide du codeur

Espace de noms My

Proprits fournissant des informations sur la mmoire Proprit Description

TotalPhysicalMemory TotalVirtualMemory

Total de la mmoire vive prsente sur le systme (libre et occupe). Valeur exprime en octets. Total de la mmoire virtuelle prsente sur le systme (libre et occupe). Valeur exprime en octets.

Les valeurs sont toutes exprimes en octets. Il est donc ncessaire deffectuer une opration arithmtique pour convertir cette valeur en mgaoctets, plus lisible pour lutilisateur. Un kilo-octet tant gal 1 024 octets, et un mgaoctet tant gal 1 024 Ko, il faut donc diviser la valeur renvoye par les proprits par le carr de 1 024 :
With My.Computer.Info lblMemPhyFree.Text = CType(.AvailablePhysicalMemory /(1024*1024),Int16) lblMemPhyFree.Text += " Mo" End With

De mme, pour afficher le pourcentage de mmoire occupe, il est ncessaire deffectuer quelques oprations. La premire tape consiste rcuprer le pourcentage de mmoire libre et effectuer un simple calcul de pourcentage.
Dim physical As Double physical = My.Computer.Info.AvailablePhysicalMemory/ My.Computer.Info.TotalPhysicalMemory physical *= 100

Vous avez prsent le pourcentage de mmoire libre. Pour avoir le pourcentage de mmoire occupe, il suffit de soustraire le pourcentage obtenu 100.
prgPhysical.Value = 100 - physical

Timer est un contrle non visuel, qui permet dexcuter du code en boucle par

intervalles de temps rgulier, par exemple toutes les secondes (voir Figure 9-3). Placez un contrle Timer sur votre formulaire. Celui-ci apparat alors dans la zone des composants non visuels. Slectionnez-le pour modier ses proprits. Modiez sa proprit Interval, dnie en millisecondes : donnez-lui une valeur de 500. Interval permet de dnir lintervalle de temps qui spare deux excutions de code.

Le guide du codeur 139

Moniteur de performances

b Figure 9-3 : Contrle Timer dans la bote outils

Modiez ensuite sa proprit Enabled et dnissez-la True pour activer le contrle Timer ds louverture de la fentre. Il ne reste plus qu placer le code dans lvnement Tick du Timer, dclench en boucle intervalles de temps rgulier.

b Figure 9-4 : vnement Tick

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim physical As Double With My.Computer.Info lblMemPhyFree.Text = CType(.AvailablePhysicalMemory / (1024 * 1024), Int16) lblMemPhyFree.Text += " Mo" physical =.AvailablePhysicalMemory/.TotalPhysicalMemory physical *= 100 prgPhysical.Value = 100 - physical Dim virtual As Double lblMemVirtFree.Text=CType(AvailableVirtualMemory

140 Le guide du codeur

Rcuprer des informations grce lespace de noms System.Management

/(1024*1024),Int16) lblMemVirtFree.Text += " Mo" virtual =.AvailableVirtualMemory virtual /=.TotalVirtualMemory virtual *= 100 End With prgVirtual.Value = 100 - virtual End Sub

Il ne manque plus qua afficher les informations concernant le volume total de mmoire libre et virtuelle. Comme elles sont xes (on najoute pas de mmoire vive lorsque lordinateur est en cours dutilisation), vous allez afficher ces donnes une fois pour toutes, lors de louverture de la fentre. Pour cela, il est ncessaire dajouter quelques lignes de code lvnement Load du formulaire :
With My.Computer lblOS.Text = .Info.OSFullName lblPlateForme.Text = .Info.OSPlatform lblVersion.Text = .Info.OSVersion End With With My.Computer.Info lblMemPhyTotal.Text=CType(.TotalPhysicalMemory /(1024*1024),Int16) lblMemPhyTotal.Text += " Mo" lblMemVirtTotal.Text = CType(.TotalVirtualMemory /(1024 * 1024), Int16) End With lblMemVirtTotal.Text += " Mo"

9.3 Rcuprer des informations grce lespace de noms System.Management


Il est possible de rcuprer, grce lespace de noms My, quasiment toutes les informations possibles propos dun systme via une API appele Windows Management Instrumentation (WMI). En outre, cette API permet de modier des paramtres systme pour matriser totalement lenvironnement Windows. Des outils complets tels que Microsoft Operation Manager sappuient sur WMI. Bien que dvelopp en COM et donc non en .NET, WMI peut sutiliser depuis une application dveloppe en Visual Basic 2005 grce lespace de noms System.Management, qui permet de consulter les informations offertes par WMI tout en cachant toute la complexit sous-jacente. Vous allez dans cet exemple crer une classe permettant dafficher des informations propos du ou des processeurs prsents dans votre ordinateur.
Le guide du codeur 141

Moniteur de performances

Cela nest pas possible via lespace de noms My. Vous allez donc vous tournez vers lespace de noms System.Management. Pour dbuter, crez une classe nomme Processeur. Elle permettra de rcuprer des informations telles que le fabriquant, le modle, la frquence, la plage dadressage (32 ou 64 bits), ainsi que le nombre de processeurs :
Imports System.Management Public Class Processeur Private m_fabriquant As String Dim m_modele As String Dim m_frequence As String Dim m_adressage As String Dim m_nombre As Integer Public Property Fabriquant() As String Get Return m_fabriquant End Get Set(ByVal value As String) m_fabriquant = value End Set End Property Public Property Modele() As String Get Return m_modele End Get Set(ByVal value As String) m_modele = value End Set End Property Public Property Frequence() As String Get Return m_frequence End Get Set(ByVal value As String) m_frequence = value End Set End Property Public Property Adressage() As String Get Return m_adressage End Get Set(ByVal value As String) m_adressage = value
142 Le guide du codeur

Rcuprer des informations grce lespace de noms System.Management

End Set End Property Public Property Nombre() As Integer Get Return m_nombre End Get Set(ByVal value As Integer) m_nombre = value End Set End Property

La classe Processeur permet de reprsenter un processeur via quelques caractristiques implmentes laide de proprits. Il ne reste plus qu dnir les valeurs de ces proprits grce des objets prsents dans lespace de noms System.Management.
Public Sub New() Dim query As New SelectQuery("Win32_Processor") Dim search As New ManagementObjectSearcher(query) For Each info As ManagementObject In search.Get m_fabriquant = info("Manufacturer").ToString m_modele = info("Name").ToString m_frequence = (CDbl(info("CurrentClockSpeed") / 1000)).ToString & " GHz" m_adressage = info("AddressWidth").ToString & " bits" m_nombre = Environment.ProcessorCount Next search.Dispose() End Sub End Class

Extension de lespace de noms My


Vous avez dans un premier temps utilis lespace de noms My pour rcuprer des informations sur lordinateur, telles que le nom du systme dexploitation, le volume de mmoire physique libre. Dautres espaces de noms tels que System.Management ont permis daller plus loin et de rcuprer par exemple des informations sur le processeur de lordinateur. La classe Processeur pourrait tre logiquement rattache lobjet Computer prsent dans lespace de noms My si celui-ci tait extensible. La bonne nouvelle est quil lest. Vous allez donc lenrichir grce la classe Processeur. Pour cela, crez une nouvelle classe MyComputer. MyComputer est le nom interne de lobjet point par la proprit Computer. Dnissez son espace de noms comme tant lespace de noms My, puis ajoutez une proprit Processeur renvoyant un objet
Le guide du codeur 143

Moniteur de performances

de type Processeur :
Namespace My Friend Class MyComputer Private m_processeur As Processeur Public ReadOnly Property Processeur() As Processeur Get If m_processeur Is Nothing Then m_processeur = New Processeur End If Return m_processeur End Get End Property End Class End Namespace

b Figure 9-5 : Affichage via lIntellisense de la proprit Computer tendue

9.4 Afficher des informations sur le processeur


Vous tes prsent capable dafficher les informations sur le processeur. Insrez un contrle GroupBox puis ajoutez-y cinq contrles Label pour afficher les informations lies au processeur. Nommez-les lblProcAdressage, lblProcFabriquant, lblProcFrequence, lblProcModele, lblProcNombre. Ajoutez ensuite le code suivant dans lvnement Load du formulaire pour afficher les informations :
With My.Computer.Processeur lblProcAdressage.Text = .Adressage lblProcFabriquant.Text = .Fabriquant lblProcFrequence.Text = .Frequence lblProcModele.Text = .Modele lblProcNombre.Text = .Nombre End With

144 Le guide du codeur

Crer une vue synthtique

9.5 Crer une vue synthtique


Une grande partie des outils de surveillance des performances proposent une vue synthtique des donnes quils rcuprent pour les afficher tout le temps en premier plan sur lcran de lutilisateur. Ces vues sont souvent partiellement transparentes pour ne pas masquer la ou les fentres qui se situent en arrire-plan an de ne pas gner lespace de travail. Vous allez donc faire de mme pour visualiser le pourcentage du processeur occup, ainsi que le pourcentage de mmoire vive occupe, et cela en permanence via une fentre transparente de petite taille. En ce sens, crez une nouvelle fentre que vous appellerez Monitor. Cliquez du bouton droit sur votre projet pour afficher le menu contextuel et slectionnez llment de menu intitul Ajouter un nouvel lment. Dans la bote de dialogue qui saffiche, slectionnez licne Windows Form.

m Figure 9-6 : Cration dun nouveau formulaire Windows

Validez pour dbuter la construction du formulaire. Vous vous retrouvez prsent devant le Concepteur de formulaires propos par Visual Basic 2005 Express Edition. La fentre daffichage devant tre le plus discrte possible, vous allez la congurer pour la rendre beaucoup moins imposante que la majorit des formulaires qui composent les applications Windows. Commencez par supprimer la barre de titre de la fentre, contenant le nom de lapplication, son icne ainsi que les boutons systme de rduction, dagrandissement et de fermeture de lapplication. Ces informations sont inutiles dans ce cas. Pour oprer la suppression, modiez la proprit FormBorderStyle de la
Le guide du codeur 145

Moniteur de performances

fentre. Cette proprit dnit le type de bordure de la fentre et peut prendre plusieurs valeurs :
Valeurs possibles de la proprit FormBorderStyle Valeur Description

None

Dnit une fentre sans bordure ni barre de titre. Cette valeur est rarement utilise mais elle est pratique pour crer des applications qui doivent tre affiches en plein cran, comme un conomiseur dcran ou une fentre qui doit tre la plus discrte possible. Dnit une fentre avec une bordure de taille xe compose dun seul trait. Dnit une fentre avec une bordure de taille xe, ayant un effet 3D grce lutilisation de plusieurs traits. Dnit une fentre avec une bordure. Cette valeur est couramment utilise pour les botes de dialogue. Dnit une fentre redimensionnable par lutilisateur laide de la souris. Dnit une fentre de taille xe, avec une barre de titre rduite et une bordure ne. Cette valeur est utilise pour les barres doutils ottantes. Dnit une fentre que lutilisateur peut redimensionner, avec une barre de titre rduite. Cette valeur est utilise pour les barres doutils ottantes redimensionnables.

FixedSingle Fixed3D FixedDialog Sizable FixedToolWindow

SizableToolWindow

Vous allez dnir cette proprit FormBorderStyle en lui affectant une valeur gale None. De plus, pour rendre encore plus discrte cette fentre, rduisez fortement sa taille, dnissez une couleur darrire-plan qui passe inaperue, et surtout activez la transparence en modiant la proprit Opacity. Opacity permet de dnir le pourcentage dopacit de la fentre, 0 % correspondant une fentre totalement transparente, et 100 % une fentre totalement opaque. Choisissez une transparence assez forte pour ne pas gner lespace de travail, en loccurrence une valeur de 20 %. Ajoutez ensuite deux contrles ProgressBar. Ils permettront dafficher le pourcentage de CPU occupe ainsi que le pourcentage de mmoire vive occupe.
b Figure 9-7 : Exemple de fentre synthtique

146 Le guide du codeur

Crer une vue synthtique

Pour dnir cette nouvelle fentre en tant que formulaire principal de lapplication, vous devez modier une proprit du projet. Pour cela, cliquez du bouton droit sur votre projet dans lExplorateur de solutions puis slectionnez Proprits. Sous longlet qui saffiche, modiez le formulaire de dmarrage et slectionnez
Monitor.

b Figure 9-8 : Slection du formulaire de dmarrage

Ajoutez prsent un menu contextuel au formulaire Monitor pour permettre lutilisateur de quitter lapplication et dafficher la fentre dinformations dtailles cre en dbut de chapitre. Pour cela, utilisez un contrle ContextMenuStrip et insrez deux lments de menu : un pour afficher la fentre dtaille grce la ligne de code suivante :
My.Forms.Form1.Show()

et un second pour quitter lapplication :


Private Sub QuitterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterToolStripMenuItem.Click Application.Exit() End Sub

Liez prsent ce menu contextuel au formulaire en modiant la proprit ContextMenuStrip et en slectionnant le menu que vous venez de crer.

Dplacement dune fentre sans bordure


La fentre est prsent sans bordure, avec une transparence qui lui permet dtre discrte, mais la suppression de ladite bordure entrane un problme pineux : on ne peut plus dplacer la fentre car la barre de titre est absente. Il est donc ncessaire de coder par programmation les dplacements, qui sopreront, non plus via la barre de titre, mais via la surface de la fentre elle-mme. Il sagira dappuyer sur le bouton gauche de la souris tout en
Le guide du codeur 147

Moniteur de performances

dplaant le pointeur, la manire dun glisser-lcher. Ainsi, les habitudes de lutilisateur ne seront pas troubles. Pour ce faire, vous avez besoin de deux vnements : MouseDown, pour stocker la position originale de la souris au dpart du glisser-lcher, et MouseMove, pour dplacer la fentre en mme temps que la souris. Pour stocker la position de dpart de la souris, dclarez une variable nomme
m_positionDepart de type Point :
Dim m_positionDepart As Point

Dans lvnement MouseDown du formulaire, initialisez cette valeur :


Private Sub Monitor_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown m_positionDepart = e.Location End Sub

Dans lvnement MouseMove, dplacez la fentre en modiant les proprits Left et Top du formulaire :
Private Sub Monitor_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove If e.Button = Windows.Forms.MouseButtons.Left Then Me.Left += e.X - m_positionDepart.X Me.Top += e.Y - m_positionDepart.Y End If End Sub

Enregistrer des paramtres dapplication


Lutilisateur est prsent capable de dplacer la fentre o il le souhaite, dans un endroit o elle est le moins gnante vis--vis de la surface de travail. Le rsultat est satisfaisant. Il reste un problme rgler pour complter cette gestion : la sauvegarde de la position de la fentre. En effet, ds que lon quitte lapplication, la position de la fentre est perdue et lutilisateur doit la replacer manuellement. Ce comportement nest pas celui que lon attend dune application Windows. Vous allez corriger ce problme de manire simple, sans crire une ligne de code, grce une fonctionnalit offerte par Visual Basic 2005 Express : les paramtres dapplication (Application Settings).

148 Le guide du codeur

Check-list

Pour stocker la position de la fentre, slectionnez celle-ci, et dans la fentre des proprits, reprez llment intitul (Application Settings). Dpliez-le pour afficher la proprit Location. Cliquez dans la zone de valeur de cette proprit, puis sur le lien Nouveau pour dnir la valeur, et intitulez-la PositionFenetre. En effectuant cela, vous indiquez quil faut stocker, dans un chier de ressources propre lutilisateur courant, la position de la fentre dans une variable nomme PositionFenetre.

b Figure 9-9 : Sauvegarde de la position de la fentre

prsent, lorsque lon quitte lapplication, la position de la fentre est automatiquement mmorise dans un prol li lutilisateur courant (donc, sil y a plusieurs utilisateurs, les paramtres pourront tre diffrents). Ce prol sera automatiquement charg lors du dmarrage de lapplication.

9.6 Check-list
Dans ce chapitre, vous avez appris :
j

j j j

j j

rcuprer des informations sur le systme grce aux espaces de noms My et System.Management ; tendre lespace de noms My ; utiliser le contrle Timer ; modier les proprits des fentres (suppression de bordure, transparence) ; dplacer une fentre sans bordure ; sauvegarder des paramtres dapplication.

Le guide du codeur 149

Ch apit re

10 Client MSN Messenger avec onglets


Classes et espaces de noms utiliss ............. Conguration ............................................ Interface utilisateur ................................... Ralisation ................................................ Check-list .................................................. 152 152 154 157 167

10

Client MSN Messenger avec onglets

Au cours des chapitres prcdents, vous avez crit plusieurs applications en vous servant des bibliothques de classes de la plateforme .NET et, videmment, du code que vous avez crit vous-mme. Or, comme avec tout langage de programmation, il est possible avec Visual Basic .NET de faire appel des bibliothques crites par des tiers, ventuellement dans dautres langages pris en charge par la plateforme .NET. La bibliothque DotMSN que vous utiliserez dans cette application, par exemple, a t crite en C#. Vous utiliserez cette bibliothque pour crire un client capable de se connecter au service de messagerie MSN. Cette application sera diffrente des autres clients qui existent dj, car elle ne consistera quen une seule fentre dans laquelle vous verrez votre liste de contacts et toutes vos conversations sous la forme donglets. Lapplication que vous obtiendrez la n de ce chapitre vous permettra dchanger des messages avec dautres clients MSN. Toutefois, sachez que le dveloppement dun client de messagerie complet nest pas une tche facile. Le but de ce chapitre est de vous mettre sur la bonne voie pour vos projets futurs.

10.1 Classes et espaces de noms utiliss


Comme pour toute application Windows, la plupart des classes dont vous aurez besoin se trouvent dans lespace de noms System.Windows.Forms. De plus, les classes de la bibliothque DotMSN, dont vous aurez besoin pour interagir avec les serveurs du service de messagerie, se trouvent dans lespace de noms XihSolutions.DotMSN.

10.2 Conguration
Une fois que vous aurez cr un projet de type Application Windows, vous devez le congurer pour pouvoir accder aux classes de la bibliothque DotMSN. Commencez par tlcharger DotMSN sur le site www.xihsolutions.net/DotMSN. La version de la bibliothque utilise dans ce chapitre est la 2.0.1. Bien que le code source de cette bibliothque soit disponible en tlchargement, vous naurez besoin que de la version compile sous forme de chier .dll. Enregistrez ce chier dans le dossier racine de votre projet qui se trouve, par dfaut, dans le rpertoire Mes documents\Visual Studio 2005\Projects.

152 Le guide du codeur

Conguration

10

Dossier racine de votre projet Lorsque vous crez un nouveau projet avec Visual Basic 2005 Express, tous les chiers sont stocks dans un premier temps dans un rpertoire temporaire. Vous devez utiliser la commande Enregistrer tout du menu Fichier, ou le raccourci clavier [Ctrl]+[Maj]+[S], pour enregistrer votre projet son emplacement dnitif.

Malheureusement, le fait denregistrer le chier .dll la racine de votre projet ne suffit pas pour que celui-ci soit pris en compte. Cliquez du bouton droit sur le nom de votre projet dans lExplorateur de solutions et slectionnez la commande Proprits.

b Figure 10-1 : Accder aux proprits dun projet

Dans la fentre qui souvre, slectionnez longlet Rfrences gauche et cliquez sur le bouton Ajouter pour ajouter une rfrence vers la bibliothque DotMSN. Dans la bote de dialogue qui souvre, slectionnez longlet Parcourir. Par dfaut, vous vous retrouvez dans le rpertoire racine de votre application, dans lequel gure le chier .dll correspondant la bibliothque DotMSN. Slectionnez-le et validez (voir Figure 10-2). La rfrence XihSolutions.DotMSN apparat prsent dans la liste de rfrences de votre projet.

Le guide du codeur 153

10

Client MSN Messenger avec onglets

m Figure 10-2 : Ajouter une rfrence un projet

Pour nir, et pour viter de devoir saisir le nom complet de lespace de noms chaque fois que vous souhaitez utiliser une classe de celui-ci, importez-le en cochant la case ct de XihSolutions.DotMSN dans la liste Espaces de noms imports.

m Figure 10-3 : Importer un espace de noms

Fermez longlet de conguration de votre projet pour enregistrer les modications.

10.3 Interface utilisateur


Linterface utilisateur que vous allez crer consiste en un seul formulaire qui contiendra la liste de contacts ainsi que les conversations sous forme donglets.

154 Le guide du codeur

Interface utilisateur

10

m Figure 10-4 : Interface utilisateur termine

Formulaire principal
Le formulaire principal est simple, tout en tant capable de grer plusieurs conversations simultanes avec les contacts MSN. Commencez par glisser un contrle StatusStrip dans votre formulaire. Il viendra se placer, automatiquement, en bas de celui-ci. Insrez dans la barre dtat un contrle de type ToolStripStatusLabel, que vous appellerez Status (en modiant sa proprit (Name)). Videz sa proprit Text an quil naffiche rien.

b Figure 10-5 : Insertion dun ToolStripStatusLabel

Insrez dans votre formulaire un TabControl que vous appellerez Conversations et supprimez tous ses onglets laide de sa balise active. Ce contrle viendra se placer en haut gauche du formulaire. ct du TabControl, glissez un contrle ListView qui sappellera Contacts. Changez ses proprits MultiSelect False, Sorting Ascending et View SmallIcon. De cette manire, vos contacts seront rangs par ordre alphabtique et vous ne pourrez en slectionner quun seul la fois. De plus, le fait dutiliser la vue SmallIcon fait que vous pourrez, lavenir, associer une icne chacun de vos contacts, ce que lon ne fait pas dans cet exemple.
Le guide du codeur 155

10

Client MSN Messenger avec onglets

Ajoutez un contrle TextBox en dessous du TabControl. Appelez-le MonTexte et affectez la valeur True sa proprit Multiline pour pouvoir le redimensionner en hauteur et y crire des messages qui stendent sur plusieurs lignes. ct de ce champ de texte, insrez un contrle Button que vous appellerez Envoyer et modiez sa proprit Text an quil affiche cette mme valeur. Enn, insrez deux contrles TextBox et un contrle Button que vous appellerez respectivement Adresse, MotDePasse et Connexion. Vous pouvez aussi insrer des contrles Label pour identier les champs de texte si vous le souhaitez. Modiez la proprit Text du bouton an quil affiche OK et changez la valeur de la proprit UseSystemPasswordChar du champ MotDePasse True an que le texte saisi ne soit pas visible. Votre interface graphique est maintenant termine, lexception dun dtail : vous avez peut-tre remarqu quil ny a pas de champ de texte prvu pour laffichage des conversations.

Contrle Dialogue
Vous devez crer un contrle utilisateur pour afficher vos conversations avec vos contacts MSN. Pour cela, cliquez du bouton droit sur le nom de votre projet dans lExplorateur de solutions, et choisissez la commande Contrle utilisateur du sous-menu Ajouter. Appelez votre contrle Dialogue. Dans votre nouveau contrle, insrez une TextBox. Modiez ses proprits Multiline et ReadOnly True et sa proprit Dock Fill. Ainsi, votre champ de texte occupera tout le contrle et il ne pourra pas tre modi par lutilisateur. En revanche, son texte sera toujours accessible grce sa proprit Text. Pour nir, changez sa couleur de fond en modiant sa proprit BackColor et en lui attribuant la valeur Window.

b Figure 10-6 : Slectionner une couleur systme pour le fond dun contrle

156 Le guide du codeur

Ralisation

10

Votre contrle utilisateur fera beaucoup plus quafficher un simple champ de texte, mais les fonctionnalits supplmentaires devront tre ajoutes par la suite via du code.

10.4 Ralisation
Maintenant que votre interface graphique est prte se connecter au service de messagerie MSN pour envoyer et recevoir des messages, vous pouvez commencer crire le code qui utilise les classes de la bibliothque DotMSN.

Connexion au service de messagerie


Vous allez commencer par congurer votre application an quelle se connecte au service de messagerie MSN. Pour cela, vous devez afficher le code source de votre formulaire principal en appuyant sur la touche [F7] de votre clavier.
Public Class Form1 Private Delegate Sub _ UpdateControlTextDelegate(ByVal text As String) Private Delegate Sub UpdateControlDelegate() Private Delegate Sub _ CreateConversationTabDelegate( _ ByVal conversation As Conversation) Friend Messenger As Messenger Public Sub New() Cet appel est requis par le Concepteur InitializeComponent() Messenger = New Messenger() Imiter MSN Messenger Messenger.Credentials.ClientID = "msmsgs@msnmsgr.com" Messenger.Credentials.ClientCode = "Q1P7W2E4J9R8U3S5" AddHandler _ Messenger.NameserverProcessor.ConnectionEstablished, _ AddressOf NameserverProcessor_ConnectionEstablished AddHandler Messenger.Nameserver.SignedIn, _ AddressOf Nameserver_SignedIn AddHandler Messenger.Nameserver.SignedOff, _ AddressOf Nameserver_SignedOff AddHandler Messenger.Nameserver.AuthenticationError, _

Le guide du codeur 157

10

Client MSN Messenger avec onglets

AddressOf Nameserver_AuthenticationError AddHandler Messenger.ConversationCreated, _ AddressOf Messenger_ConversationCreated End Sub End Class
m Nouveau constructeur du formulaire principal

On commence par crer trois dlgus. Ils serviront appeler des mthodes travers diffrents threads pour mettre jour linterface graphique de lapplication. Ensuite on cre un objet appel Messenger de type XihSolutions.DotMSN .Messenger, qui assurera la communication avec le service de messagerie. On cre aussi un constructeur pour le formulaire an dinitialiser lobjet Messenger. Il faut congurer les paramtres avec lesquels le client va se prsenter auprs du service de messagerie. Ces paramtres permettent didentier lapplication, et non pas lutilisateur qui veut se connecter au service. Dans cet exemple, on personnie le client MSN Messenger de Microsoft. Si vous souhaitez dployer une application qui se connecte au service de messagerie MSN, vous devrez vous procurer vos propres identiants auprs de MSN. Enn, on associe des mthodes certains vnements qui peuvent tre dclenchs par le nouveau client. Vous allez crire des gestionnaires pour les vnements de base (il ne sagit pas dune liste exhaustive).

Gestion des vnements du service de messagerie


Le premier vnement que vous allez grer est ConnectionEstablished. Ce nest pas un vnement de lobjet Messenger, mais de la proprit NameserverProcessor de celui-ci.
Private Sub NameserverProcessor_ConnectionEstablished( _ ByVal sender As Object, ByVal e As EventArgs) Update_Status("Connect au serveur") End Sub
m Gestionnaire de lvnement ConnectionEstablished

Cet vnement ne semble pas intressant, car il est seulement dclench lors de la connexion initiale au serveur du service de messagerie et tout ce quil fait est de mettre jour le texte de la barre dtat pour informer lutilisateur. Or, cette opration est loin dtre anodine. En effet, lorsque vous dmarrez la connexion au service, la bibliothque DotMSN cre un nouveau thread pour ne
158 Le guide du codeur

Ralisation

10

pas bloquer lapplication. Le gestionnaire tant appel partir de ce nouveau thread, diffrent de celui dans lequel ont t crs les lments de linterface graphique, la mise jour de ces derniers ne peut pas se faire directement partir de celui-ci. Vous allez donc crer deux mthodes dans votre classe : Update_Status et Update_Status_Synchro.
Private Sub Update_Status(ByVal status As String) Invoke(New UpdateControlTextDelegate( _ AddressOf Update_Status_Synchro), New Object() {status}) End Sub Private Sub Update_Status_Synchro(ByVal status As String) Me.Status.Text = status End Sub
m Mise jour dun lment de linterface graphique travers diffrents threads

La deuxime mthode sert mettre jour la proprit Text du contrle appel Status et ne requiert pas dexplication supplmentaire. La premire mthode sassurera que la mise jour du contrle se fera dans le thread appropri. Pour cela, elle fait appel la mthode Invoke en lui passant un dlgu et un tableau de paramtres. Le dlgu a t prpar lors des premires modications de la classe du formulaire principal. Il permet lappel indirect une mthode qui prend une chane de caractres en paramtre. Dans ce cas prcis, il sagit de la mthode Update_Status_Synchro. La chane de caractres passer sera insre dans dun tableau dobjets an que la mthode Invoke la transmette la mthode appele. Le mme modle de code sera utilis tout au long du dveloppement de lapplication pour mettre jour les lments de linterface graphique travers diffrents threads. Vous allez maintenant grer les vnements SignedIn et SignedOff, dclenchs respectivement lorsque le client a authenti lutilisateur auprs des serveurs de messagerie et lorsque lutilisateur sest dconnect. Ils appartiennent la proprit Nameserver de Messenger.
Private Sub Nameserver_SignedIn(ByVal sender As Object, _ ByVal e As EventArgs) Messenger.Owner.Status = PresenceStatus.Online Update_Contacts() Update_Status(Messenger.Owner.Name & " connect") Update_Bouton("Dco") End Sub Private Sub Nameserver_SignedOff(ByVal sender As Object, _
Le guide du codeur 159

10

Client MSN Messenger avec onglets

ByVal e As SignedOffEventArgs) Messenger.Disconnect() CloseAllTabs() Update_Contacts() Update_Status("Dconnect") Update_Bouton("OK") End Sub


m Gestion des vnements SignedIn et SignedOff

Dans le premier gestionnaire, on indique que le statut de lutilisateur authenti est "en ligne", via la proprit Owner de Messenger. Ensuite, on fait appel des mthodes auxiliaires, telles que Update_Status, pour mettre jour linterface graphique. Dans le deuxime gestionnaire, on fait de mme, sauf que lon dconnecte lobjet Messenger au lieu de changer le statut de lutilisateur. Voici le code des mthodes auxiliaires ncessaires :
Private Sub Update_Bouton(ByVal text As String) Invoke(New UpdateControlTextDelegate( _ AddressOf Update_Bouton_Synchro), New Object() {text}) End Sub Private Sub Update_Bouton_Synchro(ByVal text As String) Connexion.Text = text End Sub Private Sub Update_Contacts() Invoke(New UpdateControlDelegate( _ AddressOf Update_Contacts_Synchro)) End Sub Private Sub Update_Contacts_Synchro() Contacts.SuspendLayout() Contacts.Items.Clear() If Messenger.Connected Then For Each Contact As Contact In Messenger.ContactList.All Dim item As New ListViewItem item.Text = Contact.Name item.Tag = Contact Contacts.Items.Add(item) Next End If Contacts.ResumeLayout() End Sub Private Sub CloseAllTabs() Invoke(New UpdateControlDelegate( _ AddressOf CloseAllTabs_Synchro)) End Sub

160 Le guide du codeur

Ralisation

10

Private Sub CloseAllTabs_Synchro() For Each tab As TabPage In Conversations.TabPages Conversations.TabPages.Remove(tab) Next End Sub
m Mthodes auxiliaires pour la mise jour de linterface graphique

La mthode Update_Bouton est presque identique Update_Status, sauf quelle met jour le texte du bouton appel Connexion. La mthode Update_Contacts vide la liste Contacts et la remplit, seulement si lobjet Messenger est connect, avec la liste dutilisateurs contenue dans la proprit ContactList de Messenger. Aucune vrication du statut de lutilisateur nest faite. On peut la faire en testant la valeur de Contact.Status. Comme les contacts sont stocks un un dans la proprit Tag de chaque lment de la liste, on peut rcuprer lobjet Contact, et pas seulement son nom, lorsque lon voudra initier une conversation avec celui-ci. On appelle la dernire mthode lorsque lutilisateur est dconnect pour itrer dans la liste des onglets de conversation ouverts et les supprimer. Le dernier vnement li la connexion que lon va grer est celui qui est dclench lorsque les paramtres dauthentication sont incorrects :
Private Sub Nameserver_AuthenticationError( _ ByVal sender As Object, ByVal e As ExceptionEventArgs) MessageBox.Show( _ "Vrifiez votre adresse e-mail et votre mot de passe.", _ "Erreur dauthentification") Messenger.Disconnect() End Sub
m Gestion de lvnement AuthenticationError

Il suffit dafficher un message dalerte et de dconnecter lobjet Messenger. Enn, on gre lvnement dclench lorsquune conversation est cre :
Private Sub Messenger_ConversationCreated( _ ByVal sender As Object, _ ByVal e As ConversationCreatedEventArgs) If e.Initiator Is Nothing Then Invoke(New CreateConversationTabDelegate( _ AddressOf CreateConversationTab), _ New Object() {e.Conversation}) End If End Sub
m Gestion des nouvelles conversations

Le guide du codeur 161

10

Client MSN Messenger avec onglets

Cette mthode teste sil sagit dune nouvelle conversation en vriant la proprit Initator, qui est diffrente de Nothing si la conversation est dj ouverte. Si cest le cas, la mthode qui cre les onglets de conversation est appele. Une fois de plus, on doit utiliser Invoke ici car CreateConversationTab modie des lments de linterface graphique.
Private Sub CreateConversationTab( _ ByVal conversation As Conversation) Dim newTabPage As New TabPage Dim newDialogue As New Dialogue(conversation) If conversation.SwitchboardProcessor Is Nothing OrElse _ Not conversation.SwitchboardProcessor.Connected Then conversation.Messenger.Nameserver.RequestSwitchboard( _ conversation.Switchboard, conversation.Messenger) Threading.Thread.Sleep(1000) End If Dim contacts As New System.Text.StringBuilder For Each contact As DictionaryEntry In _ conversation.Switchboard.Contacts contacts.AppendFormat("{0}, ", _ CType(contact.Value, Contact).Name) Next If (contacts.Length > 2) Then contacts.Remove(contacts.Length - 2, 2) End If newTabPage.Text = contacts.ToString newDialogue.Dock = DockStyle.Fill newTabPage.Controls.Add(newDialogue) Conversations.TabPages.Add(newTabPage) Conversations.SelectTab(newTabPage) End Sub
m Cration de nouveaux onglets de conversation

On cre un nouvel objet TabPage, qui correspond longlet que lon va insrer dans le contrle Conversations, ainsi quun objet Dialogue, le contrle utilisateur. Le constructeur du contrle utilisateur prend une conversation en paramtre. Vous crirez ce constructeur dans la section suivante.

162 Le guide du codeur

Ralisation

10

Ensuite, on vrie lexistence dun SwitchboardProcessor dans la conversation. Cet objet "route" la conversation vers le bon destinataire. Sil nexiste pas, on le cre puis on attend 1 seconde avant de sassurer quil a t initialis correctement. On peut maintenant itrer dans la liste de contacts associs la conversation pour utiliser leurs noms comme titre de longlet grce la proprit Text de ce dernier. Il ne reste plus qu attribuer la valeur Fill la proprit Dock du contrle Dialogue an quil occupe tout longlet une fois ajout dans celui-ci. On procde cet ajout juste avant dajouter longlet dans le contrle Conversations.

Contrle Dialogue
Le contrle utilisateur Dialogue doit tre modi pour tre utilis avec lapplication. En effet, vous allez crire du code qui ressemble beaucoup celui que vous avez crit pour la classe de la fentre principale. Voici le code complet de la classe Dialogue :
Public Class Dialogue Private Delegate Sub UpdateConversationText( _ ByVal text As String) Private m_conversation As Conversation Public Sub New(ByVal conversation As Conversation) Cet appel est requis par le Concepteur InitializeComponent() m_conversation = conversation AddHandler _ conversation.Switchboard.TextMessageReceived, _ AddressOf Switchboard_TextMessageReceived End Sub Public ReadOnly Property Conversation() As Conversation Get Return m_conversation End Get End Property Public Sub AppendText(ByVal text As String) Invoke(New UpdateConversationText( _ AddressOf AppendText_Synch), New Object() {text}) End Sub

Le guide du codeur 163

10

Client MSN Messenger avec onglets

Private Sub AppendText_Synch(ByVal text As String) TextBox1.AppendText(text) End Sub Private Sub Switchboard_TextMessageReceived( _ ByVal sender As Object, ByVal e As TextMessageEventArgs) AppendText(String.Format("{0} : {1}{2}", _ e.Sender.Name, e.Message.Text, vbCrLf)) End Sub End Class
m Classe Dialogue

On cre, dans cette classe aussi, un dlgu qui facilitera les mises jour de linterface graphique entre les threads. On ne stocke pas de Messenger dans le contrle, mais seulement une Conversation, que lon initialise dans le constructeur et que lon rend accessible grce une proprit en lecture seule. Cette classe propose aussi deux mthodes auxiliaires, qui servent faire les modications de linterface graphique, la premire appelant la seconde laide de la mthode Invoke et du dlgu. Finalement, on crit le gestionnaire dvnements TextMessageReceived de lobjet Conversation stock dans la classe. On utilise les mthodes auxiliaires pour ajouter dans la TextBox du contrle utilisateur les messages reus. Maintenant que le contrle utilisateur est capable de grer des conversations, il ne reste plus qu utiliser des mthodes de lobjet Messenger partir des contrles de la fentre principale pour commencer dialoguer avec les contacts MSN.

Gestion des vnements de la fentre principale


Bien que votre application sache ragir lorsquelle est connecte au service de messagerie, elle ne sait pas encore sy connecter. Vous allez donc implmenter le gestionnaire dvnements Click du bouton Connexion pour utiliser les valeurs des champs Adresse et MotDePasse en vue de lauthentication auprs du service.
Private Sub Connexion_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Connexion.Click If Not Messenger.Connected Then If Adresse.Text.Length > 0 Then Messenger.Credentials.Account = Adresse.Text Messenger.Credentials.Password = MotDePasse.Text Messenger.Connect()

164 Le guide du codeur

Ralisation

10

Update_Status("Connexion") End If Else Messenger.Disconnect() End If End Sub


m Connexion au service de messagerie

Ce bouton a deux fonctions : si, lorsque lutilisateur clique dessus, lobjet Messenger nest pas connect au service, il est congur avec ladresse e-mail et le mot de passe fournis, et connect ; sinon, il est dconnect. Maintenant que vous tes connect au rseau, vous voudrez srement initier des conversations avec vos contacts. Pour cela, vous double-cliquerez sur un contact dans la liste et le gestionnaire dvnements crera longlet appropri :
Private Sub Contacts_DoubleClick(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Contacts.DoubleClick If Contacts.SelectedItems.Count = 1 Then Dim contactSelectionne As Contact = _ CType(Contacts.SelectedItems(0).Tag, Contact) If contactSelectionne IsNot Nothing AndAlso _ contactSelectionne.Online Then Dim conversation As Conversation = _ Messenger.CreateConversation() conversation.Invite(contactSelectionne) CreateConversationTab(conversation) End If End If End Sub
m Ouverture dun onglet de conversation

On vrie quun lment du ListView Contacts est bien slectionn et on rcupre lobjet Contact stock dans sa proprit Tag. Aprs avoir vri que le contact est en ligne, on demande lobjet Messenger de crer une conversation grce la mthode CreateConversation, et on invite le contact grce la mthode Invite. Enn, on appelle la mthode CreateConversationTab pour crer longlet correspondant la conversation. Vous avez prvu un champ de texte et un bouton pour envoyer des messages vos contacts. Vous allez donc grer lvnement Click du bouton Envoyer pour envoyer le message au sein de la conversation de longlet slectionn. De plus, vous allez grer lvnement KeyDown du contrle MonTexte an que la touche [Entre] serve aussi envoyer le message.

Le guide du codeur 165

10

Client MSN Messenger avec onglets

Private Sub Envoyer_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Envoyer.Click If Conversations.SelectedTab IsNot Nothing And _ MonTexte.Text.Length > 0 Then Dim dialogue As Dialogue = _ Conversations.SelectedTab.Controls(0) Dim conversation As Conversation = _ dialogue.Conversation If Not conversation.SwitchboardProcessor.Connected Then conversation.Messenger.Nameserver.RequestSwitchboard( _ conversation.Switchboard, Messenger) End If Dim message As New TextMessage(MonTexte.Text) conversation.Switchboard.SendTextMessage(message) MonTexte.Clear() dialogue.AppendText("Moi : " & message.Text & vbCrLf) End If End Sub Private Sub MonTexte_KeyDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyEventArgs) _ Handles MonTexte.KeyDown If e.KeyCode = Keys.Enter Then Envoyer.PerformClick() e.SuppressKeyPress = True End If End Sub
m Gestionnaires chargs de lenvoi des messages dans la conversation courante

Lorsque lutilisateur clique sur bouton Envoyer, on vrie quil y a bien un onglet slectionn et que du texte a t saisi dans le champ MonTexte. Si cest le cas, on rcupre le contrle Dialogue courant en utilisant la proprit Controls de longlet slectionn, ainsi que la conversation courante en utilisant la proprit de mme nom du contrle Dialogue courant. On recourt ensuite la mthode SendTextMessage de la proprit Switchboard de la conversation pour envoyer le message et lon met jour le contrle Dialogue avec sa mthode AppendText. Pour permettre lenvoi des messages avec la touche [Entre], on teste simplement si la touche a t utilise en vriant la valeur de la proprit KeyCode. Si cest le cas, on fait appel la mthode PerformClick du bouton Envoyer pour simuler un clic et lon supprime le retour la ligne en utilisant la proprit SuppressKeyPress. Finalement, vous fermerez les conversations que vous ne dsirez plus en grant lvnement DoubleClick du TabControl :
166 Le guide du codeur

Check-list

10

Private Sub Conversations_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Conversations.DoubleClick Conversations.TabPages.Remove(Conversations.SelectedTab) End Sub
m Fermeture des onglets

Il suffit dutiliser la mthode Remove de la collection TabPages pour supprimer longlet courant, que lon retrouve grce la proprit SelectedTab. Vous disposez dsormais dune application basique vous permettant de dialoguer avec vos contacts MSN.

10.5 Check-list
Dans ce chapitre, vous avez appris :
j j

vous connecter au service de messagerie MSN ; utiliser des classes dune bibliothque tierce crite dans un autre langage .NET ; mettre jour des lments de linterface graphique travers diffrents threads ; instancier et ajouter dynamiquement des contrles utilisateurs votre interface graphique.

Le guide du codeur 167

Ch apit re

11 Explorateur de disques
Classes et espaces de noms utiliss ............. Lister les lecteurs de lordinateur ................. Lister les dossiers ..................................... Afficher des informations sur les dossiers ..... Composant BackgroundWorker ................... Check-list .................................................. 170 170 175 176 178 181

11

Explorateur de disques

Vous allez crer dans ce chapitre un Explorateur de disques. Cet outil vous permettra de connatre, dun coup dil, les informations concernant vos lecteurs de disque, quils sagissent de lecteur de disque dur, de lecteur CD, de lecteur DVD ou encore de lecteur rseau. Ce chapitre sera loccasion de dcouvrir tout ce qui concerne la manipulation du systme de chiers avec Visual Basic 2005.

11.1 Classes et espaces de noms utiliss


Vous allez utiliser plusieurs espaces de noms importants. Lespace de noms My permet la manipulation du systme de chiers. Pour en savoir plus sur My, lisez le chapitre Moniteur
Renvoi de performances.

System.IO propose un grand nombre de classes destines la manipulation de dossiers et de chiers.

Vous allez crer une application Windows et forcment utiliser lespace de noms System.Windows.Forms. Il contient toutes les classes et structures ncessaires la cration dinterfaces Windows grce des fentres et lutilisation de contrles.

11.2 Lister les lecteurs de lordinateur


Commencez par rcuprer la liste des lecteurs prsents sur votre ordinateur. Avant de dbuter, crez un nouveau projet dans Visual Basic 2005 Express Edition, et slectionnez le type de projet intitul Application Windows (voir Figure 11-1). Vous arrivez alors sur votre surface de travail avec le Concepteur de formulaires Windows ouvert sur le formulaire par dfaut. Listez les lecteurs de votre ordinateur dans un contrle ListView. Ce contrle est exactement le mme que celui utilis par lExplorateur de chiers de Windows pour afficher la liste des dossiers et chiers prsents dans un dossier spcique. ListView permet dafficher des lments dans plusieurs vues, entre autres une vue "grandes icnes", une vue "petites icnes", une vue "dtail" (voir Figure 11-2).

170 Le guide du codeur

Lister les lecteurs de lordinateur

11

m Figure 11-1 : Cration dapplication Windows

b Figure 11-2 : Contrle ListView dans la bote outils

Placez un contrle ListView sur votre fentre principale et changez la proprit View pour dnir son style de vue SmallIcon. Le contrle ListView a la particularit de pouvoir tre li un contrle ImageList. ImageList est un contrle non visuel, qui permet de stocker une liste dimages, par exemple une liste dicnes. Utilis conjointement avec un contrle ListView ou un contrle TreeView, ImageList permet de dnir limage afficher pour un lment prcis contenu dans lun de ces contrles. Dans cet exemple, ImageList va permettre de stocker une icne de disque dur et une icne de lecteur CD, qui seront utilises lorsque le lecteur correspondra lun de ces types de supports.

Le guide du codeur 171

11

Explorateur de disques

Placez donc un contrle ImageList sur votre formulaire. Il apparat alors dans la zone des contrles non visuels. Affichez le smart tag de ce contrle grce au petit triangle prsent en haut droite de celui-ci, pour dnir les proprits des diffrentes images insres dans ImageList (taille, rsolution) et ajouter les icnes correspondant aux lecteurs.

Icnes Si vous ne possdez pas de telles icnes, allez sur Internet : de nombreux sites, comme www.icomania.com, en proposent gratuitement.

Une fois les images ajoutes au contrle ImageList, il ne reste plus qu lier celui-ci au contrle ListView prcdemment insr sur le formulaire. Pour cela, modiez la proprit SmallImageList du contrle ListView et slectionnez le contrle ImageList. prsent, listez la liste des lecteurs. Pour cela, utilisez lespace de noms My, et plus particulirement la proprit FileSystem de lobjet Computer. En effet, lobjet FileSystem permet de rcuprer des informations sur le systme de chiers, et notamment la liste des lecteurs prsents sur lordinateur. Cette liste inclut les diffrents disques durs de votre machine, les lecteurs CD/DVD, les lecteurs rseau, ou encore tous les lecteurs connects occasionnellement, tels que les cls USB ou encore les cartes Compact Flash, SD ou MemoryStick. La proprit Drives de lobjet FileSystem permet de rcuprer la liste des lecteurs du systme. Elle renvoie une liste dobjets DriveInfo, qui permettent de rcuprer les proprits des lecteurs, telles que leur lettre, le nom du volume, leur taille, leur type, etc. Vous devez crire une boucle pour lister les lecteurs. Une boucle For Each est idale : elle permet deffectuer une numration dobjets dans un tableau ou une liste, sans risque de boucle innie :
For Each drive As DriveInfo In _ My.Computer.FileSystem.Drives Dim imageindex As Integer = 2 Select Case drive.DriveType Case DriveType.CDRom imageindex = 1 Case DriveType.Fixed imageindex = 0 End Select If drive.IsReady Then lstDrives.Items.Add(drive.Name & _ " [" & drive.VolumeLabel & "]", imageindex)

172 Le guide du codeur

Lister les lecteurs de lordinateur

11

Else lstDrives.Items.Add(drive.Name, imageindex) End If Next

Dans cette boucle, on slectionne lindex de limage prsente dans le contrle ImageList en fonction du type de lecteur dni grce la proprit DriveType, puis on ajoute le lecteur trouv dans la liste des lments du contrle ListView en affichant la lettre du lecteur ainsi que le nom du volume entre crochets. Placez-ce code dans lvnement Load du formulaire.

b Figure 11-3 : Liste des lecteurs

Les diffrents lecteurs sont prsents lister dans le contrle ListView. Vous allez afficher les informations dtailles concernant le lecteur slectionn dans ListView. Pour cela, ajoutez un contrle GroupBox, qui permettra de regrouper tous les contrles daffichage de donnes lies aux disques, puis sept contrles Label qui permettront dafficher la lettre du lecteur, lespace libre la disposition de lutilisateur courant, lespace libre total, la taille totale du disque, le nom de volumes du disque, le format de disque et ltat du lecteur (prt ou non). Nommez-les en modiant leur proprit Name et en affectant respectivement les valeurs suivantes : lblLettreLecteur, lblEspaceLibre, lblEspaceLibreTotal, lblNomLecteur, lblFormatLecteur, lblLecteurPret. Crez sept autres contrles Label permettant dindiquer lutilisateur les donnes affiches par les champs prcdemment crs. Puis, pour nir, ajoutez un contrle ProgressBar, qui permettra dafficher le pourcentage despace occup sur le disque. Nommez ce contrle prgEspaceOccupe en changeant sa proprit Name. Pour afficher les informations lies au disque slectionn, il est ncessaire de rcuprer le bon objet DriveInfo renvoy par la proprit Drives de lobjet FileSystem. Cela est relativement simple : il suffit de rcuprer lindice de llment slectionn dans la ListView et de lutiliser comme index dans la collection retourne par la proprit Drives pour rcuprer la bonne instance :
My.Computer.FileSystem.Drives(lstDrives.SelectedIndices(0))

Le guide du codeur 173

11

Explorateur de disques

Il ne reste plus qu crire le code daffichage de donnes dans lvnement SelectedIndexChanged du contrle ListView pour arriver au comportement souhait :
Dim espaceLibre As Integer = 0 Dim espaceLibreTotal As Integer = 0 Dim espaceTotal As Integer = 0 If lstDrives.SelectedIndices.Count = 0 Then Exit Sub With My.Computer.FileSystem.Drives( _ lstDrives.SelectedIndices(0)) espaceLibre = Math.Round( _ .AvailableFreeSpace / (1024 * 1024), 0) espaceLibreTotal = Math.Round( _ .TotalFreeSpace / (1024 * 1024), 0) espaceTotal = Math.Round( _ .TotalSize / (1024 * 1024), 0) lblEspaceLibre.Text = espaceLibre & " Mo" lblEspaceLibreTotal.Text = espaceLibreTotal & " Mo" lblFormatlecteur.Text = .DriveFormat lblLecteurPret.Text = .IsReady lblLettreLecteur.Text = .Name lblTailleTotale.Text = espaceTotal & " Mo" lblNomLecteur.Text = .VolumeLabel prgEspaceOccupe.Value = _ 100 - (espaceLibreTotal / espaceTotal) * 100 End With

Aprs stre assur quun lment est bien slectionn en vriant que la proprit SelectedIndices.Count de la ListView est diffrente de 0, on affiche les donnes en modiant la proprit Text des diffrents contrles Label prcdemment crs. Les diffrentes tailles tant dnies en octets, il faut les diviser par 1 024 au carr pour avoir un rsultat en mgaoctets. Un petit arrondi est ncessaire pour ne pas avoir de dcimales. On recourt en ce sens la mthode Round de la classe Math. Enn, pour afficher le pourcentage de disque occup, on calcule le pourcentage despace libre que lon retranche 100.

b Figure 11-4 : Affichage des informations sur le lecteur slectionn

174 Le guide du codeur

Lister les dossiers

11

11.3 Lister les dossiers


Vous allez prsent lister les dossiers du lecteur slectionn. Commencez par crer un contrle ListBox qui contiendra la liste des diffrents dossiers inclus dans la racine du lecteur slectionn. Nommez ce contrle lstFolders et placez-le en dessous des contrles que vous avez auparavant crs pour afficher la liste des lecteurs et les informations affrentes. Utilisez ensuite lespace de noms My comme prcdemment. Mais au lieu dexploiter la proprit Drives, qui permet de rcuprer la liste des lecteurs, employez la mthode GetDirectories, qui renvoie une collection de String. Il faut donc crire quelques lignes de code dans lvnement SelectedIndexChanged du contrle ListView, qui liste les lecteurs, pour modier la liste des dossiers ds que lutilisateur slectionne un autre lecteur :
Dim cu_drive As DriveInfo cu_drive = _ My.Computer.FileSystem.Drives(lstDrives.SelectedIndices(0)) lstFolders.Items.Clear() For Each directory As String In My.Computer.FileSystem.GetDirectories(cu_drive.Name) Dim dirinfo As New DirectoryInfo(directory) lstFolders.Items.Add(dirinfo.FullName) Next

On numre la liste des diffrents dossiers grce une boucle for each. Puis, pour chaque dossier trouv, on ajoute son nom complet dans le contrle ListBox en utilisant la mthode Add de la collection Items, qui contient la liste des diffrents lments affichs, aprs avoir supprim tous les lments de la liste en appelant la mthode Clear.

b Figure 11-5 : Affichage de la liste des dossiers

Le guide du codeur 175

11

Explorateur de disques

11.4 Afficher des informations sur les dossiers


Vous allez prsent afficher des informations sur le dossier slectionn. Vous rcuprerez le nombre de chiers prsents dans le dossier (sous-dossiers inclus), la taille du dossier en cumulant la taille de tous les chiers quil contient. Vous afficherez la taille en mgaoctets dans un contrle Label et le pourcentage despace occup par le dossier par rapport la taille totale du disque slectionn grce un contrle ProgressBar. Commencez par ajouter un contrle GroupBox, qui permettra de regrouper les informations lies au dossier slectionn. Ajoutez deux contrles Label, le premier nomm lblFilesCount, pour afficher le nombre de chiers inclus dans le dossier, et le second nomm lblSizeFolder, pour afficher la taille du dossier. Ajoutez ensuite un contrle ProgressBar nomm prgFolderSize, pour afficher le taux doccupation.

m Figure 11-6 : Interface de lapplication

Lister les diffrents chiers prsents dans un dossier et dans ses sous-dossiers nest habituellement pas une tche vidente : il est en effet ncessaire dcrire une fonction rcursive pour parcourir toute larborescence. Bien heureusement et encore une fois, Visual Basic 2005 vous vient en aide. Un simple appel de la mthode GetFiles permet deffectuer la recherche :

176 Le guide du codeur

Afficher des informations sur les dossiers

11

Dim files As ReadOnlyCollection(Of String) files = My.Computer.FileSystem.GetFiles( _ e.Argument.ToString, _ FileIO.SearchOption.SearchAllSubDirectories, "*.*")

Il ne reste plus qu parcourir ce tableau pour cumuler les tailles des chiers et calculer le nombre de ces chiers :
For Each file As String In files m_cuPathSize += _ My.Computer.FileSystem.GetFileInfo(file).Length m_cuPathFilesCount += 1 Next

Pour afficher convenablement la taille totale des chiers, il est prfrable de convertir la taille trouve, qui est en octets, en mgaoctets, voire en gigaoctets si cela est possible. 1 Ko tant gal 1 024 octets, un petit calcul suffit pour afficher le volume total :
m_cuPathSize = _ Math.Round(m_cuPathSize / (1024 * 1024), 0) Dim driveSize As Double driveSize = My.Computer.FileSystem.Drives( _ lstDrives.SelectedIndices(0)).TotalSize / (1024 * 1024) prgFolderSize.Value = _ m_cuPathSize / driveSize * 100 If m_cuPathSize / 1024 > 1 Then m_cuPathSize = m_cuPathSize / 1024 lblSizeFolder.Text = _ Math.Round(m_cuPathSize, 1) & " Go" Else lblSizeFolder.Text = m_cuPathSize & " Mo" End If

Cela donne au nal :


Private Sub lstFolders_SelectedIndexChanged( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles lstFolders.SelectedIndexChanged Me.Cursor = Cursors.WaitCursor Dim files As ReadOnlyCollection(Of String) files = My.Computer.FileSystem.GetFiles( _ e.Argument.ToString, _ FileIO.SearchOption.SearchAllSubDirectories, "*.*") For Each file As String In files m_cuPathSize += _

Le guide du codeur 177

11

Explorateur de disques

My.Computer.FileSystem.GetFileInfo(file).Length m_cuPathFilesCount += 1 Next m_cuPathSize = _ Math.Round(m_cuPathSize / (1024 * 1024), 0) Dim driveSize As Double driveSize = My.Computer.FileSystem.Drives( _ lstDrives.SelectedIndices(0)).TotalSize / (1024 * 1024) prgFolderSize.Value = m_cuPathSize / driveSize * 100 If m_cuPathSize / 1024 > 1 Then m_cuPathSize = m_cuPathSize / 1024 lblSizeFolder.Text = Math.Round(m_cuPathSize, 1) & " Go" Else lblSizeFolder.Text = m_cuPathSize & " Mo" End If lblFilesCount.Text = m_cuPathFilesCount lstFolders.Enabled = True Me.Cursor = Cursors.Default m_cuPathSize = 0 m_cuPathFilesCount = 0 End Sub

Si vous testez prsent lapplication, vous vous rendez compte que tout fonctionne une exception prs : durant le parcours dun dossier consquent, linterface est ge. Vous vous en apercevez si vous tentez de dplacer la fentre. Cela est normal : le traitement est effectu dans le mme thread que celui utilis par linterface graphique ; durant lexcution dune procdure qui prend du temps, le thread est occup et ne peut donc plus rpondre aux actions de lutilisateur.

11.5 Composant BackgroundWorker


La solution de ce problme est relativement simple : il suffit de crer un autre thread pour lancer le traitement. La mise en uvre dun thread supplmentaire est aise. Mais Visual Basic 2005 propose un composant qui simplie encore plus la manipulation : BackgroundWorker (voir Figure 11-7). Le composant BackgroundWorker est un contrle non visuel, qui permet de lancer un traitement dans un thread spar. Le code excut dans ce nouveau thread devra tre plac dans lvnement DoWork du composant, le code de nalisation pouvant tre crit dans lvnement RunWorkerCompleted

178 Le guide du codeur

Composant BackgroundWorker

11

b Figure 11-7 : Composant BackgroundWorker dans la bote outils

Pour modier les proprits des contrles de la fentre Le traitement prsent dans lvnement DoWork tant effectu dans un thread diffrent de celui utilis pour le dessin de linterface graphique, il est impossible daccder directement aux diffrents contrles de la fentre pour en modier les proprits. Vous devrez adapter votre code pour faire appel votre interface graphique depuis lvnement RunWorkerCompleted, ou alors vous devrez utiliser les dlgus.

En accord avec la prcdente remarque, le code rorganis prsent dans lvnement DoWork correspond ceci :
Private Sub BackgroundWorker1_DoWork( _ ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) _ Handles BackgroundWorker1.DoWork Dim files As ReadOnlyCollection(Of String) files = My.Computer.FileSystem.GetFiles( _ e.Argument.ToString, _ FileIO.SearchOption.SearchAllSubDirectories, "*.*") For Each file As String In files m_cuPathSize += _ My.Computer.FileSystem.GetFileInfo(file).Length m_cuPathFilesCount += 1 Next

Le guide du codeur 179

11

Explorateur de disques

m_cuPathSize = _ Math.Round(m_cuPathSize / (1024 * 1024), 0) End Sub

Voici le code daccs linterface graphique prsent dans lvnement RunWorkerCompleted :


Private Sub BackgroundWorker1_RunWorkerCompleted( _ ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted Dim driveSize As Double driveSize = My.Computer.FileSystem.Drives( _ lstDrives.SelectedIndices(0)).TotalSize / (1024 * 1024) prgFolderSize.Value = m_cuPathSize / driveSize * 100 If m_cuPathSize / 1024 > 1 Then m_cuPathSize = m_cuPathSize / 1024 lblSizeFolder.Text = Math.Round(m_cuPathSize, 1) & " Go" Else lblSizeFolder.Text = m_cuPathSize & " Mo" End If lblFilesCount.Text = m_cuPathFilesCount lstFolders.Enabled = True Me.Cursor = Cursors.Default m_cuPathSize = 0 m_cuPathFilesCount = 0 End Sub

Lapplication est prsent fonctionnelle et linterface graphique ne se ge plus lors de longs traitements.

180 Le guide du codeur

Check-list

11

m Figure 11-8 : Rsultat nal de lapplication

11.6 Check-list
Dans ce chapitre vous avez appris :
j j

manipuler les lecteurs, dossiers et chiers ; utiliser le composant BackgroundWorker pour effectuer des traitements dans un thread spar ; utiliser le contrle Listview et le lier un contrle ImageList.

Le guide du codeur 181

Ch apit re

12 Navigateur Internet

Classes et espaces de noms utiliss ............. Conguration ............................................ Interface utilisateur ................................... Ralisation ................................................ Check list .................................................

184 184 185 186 198

12

Navigateur Internet

Vous allez prsent crer votre propre navigateur Internet. Cela est pratique si vous souhaitez disposer de votre propre outil personnalis, qui sera plus adapt votre utilisation ou celle de votre entourage. Vous allez donc crer les bases dun navigateur pleinement fonctionnel bien que simpli, qui aura pour originalit de proposer la navigation par onglet. Vous allez galement implmenter quelques fonctionnalits bien utiles si vous souhaitez mettre en place un contrle parental : le stockage des sites visits dans une base de donnes, ainsi que le blocage de certaines URL, qui seront donc inaccessibles aux utilisateurs du navigateur.

12.1 Classes et espaces de noms utiliss


Vous allez devoir utiliser principalement trois diffrents espaces de noms :
j

System.Windows.Forms, pour la manipulation des formulaires et des

contrles ; System.Data, pour la gestion de donnes stockes dans la base de donnes ; System.IO, pour la manipulation de chiers.

12.2 Conguration
En plus dutiliser Visual Basic 2005 Express Edition, vous allez exploiter SQL Server 2005 Express Edition. Cet outil est un systme de gestion de bases de donnes (SGBD) gratuit propos par Microsoft. Il sagit en fait du moteur du SGBD phare du gant de Redmond avec quelques limitations au niveau de la taille des bases de donnes, de la mmoire utilise, du nombre de processeurs pris en charge, etc. Vous pouvez tlcharger cet outil en version franaise ladresse suivante : www.microsoft.com/france/msdn/vstudio/express/sqlexpress.mspx. Il ne sagit que du moteur de gestion de bases de donnes. Il nest donc livr avec aucun outil dadministration permettant de crer et de modier les diffrentes bases de donnes que vous souhaitez grer. Vous avez cependant deux solutions pour grer vos bases de donnes. La premire est de recourir aux fonctionnalits offertes par Visual Basic 2005 Express Edition an deffectuer toutes vos oprations courantes, et la seconde est de tlcharger un outil additionnel appel SQL Server Management Studio Express, disponible gratuitement mais uniquement en anglais ladresse http://go.microsoft.com/fwlink/?LinkId=65110.
184 Le guide du codeur

Interface utilisateur

12

12.3 Interface utilisateur


Linterface de votre navigateur Internet est relativement simple. An de la raliser, vous allez vous inspirer de celle propose par Microsoft Internet Explorer, tout en lui ajoutant les fonctionnalits cites prcdemment. Le formulaire se compose principalement de deux barres doutils (la premire pour les boutons de navigation, et la seconde pour la barre dadresse). An de crer ces deux barres doutils, il faut ajouter deux contrles ToolStrip. Lorsque vous les placez sur votre formulaire, vous pouvez constater quelles sont automatiquement disposes en haut de la fentre. Il suffit alors de cliquer sur ces barres doutils an dy ajouter diffrents contrles tels que des boutons (le plus courant), des sparateurs de groupe, des labels, ou encore des TextBox.

b Figure 12-1 : Contrles ToolStrip dans la bote outils

La premire barre doutils propose diffrentes possibilits de navigation lutilisateur. Placez-y donc, pour dbuter, cinq boutons correspondant aux actions Prcdent, Suivant, Arrter, Actualiser et Page de dmarrage. Introduisez ensuite un sparateur de groupe suivi dun bouton pour afficher lhistorique, lui-mme suivi dun autre sparateur de groupe. Proposez prsent lutilisateur dimprimer la page courante grce un bouton Imprimer. Pour complter cette premire barre doutils, vous allez ajouter une fonctionnalit absente du navigateur de Microsoft : la recherche rapide. Ajoutez une Textbox ainsi quun SplitButton et modiez la proprit Alignment de ces deux contrles an de dnir sa valeur gale Right. Ajoutez prsent deux lments de menu au SplitButton que vous avez ajout et dnissez leur proprit Text Google et MSN. Modiez galement la proprit CheckOnClick de ces deux lments : cela permettra de grer automatiquement ltat coch ou non des lments sans crire aucune ligne de code.

m Figure 12-2 : Barre doutils du navigateur

Le guide du codeur 185

12

Navigateur Internet

Ajoutez prsent les contrles au second ToolStrip. Pour cela, introduisez un contrle ToolStripTextBox qui servira de barre dadresse, un contrle ToolStripSplitButton qui permettra lutilisateur dafficher le site web correspondant ladresse saisie sous longlet courant ou sous un nouvel onglet. Terminez ensuite par deux ToolStripButton, le premier pour crer un nouvel onglet et le second pour fermer, supprimer longlet courant. Il ne reste plus qu ajouter un seul et unique contrle pour terminer linterface de lapplication : un TabControl. Lorsque vous linsrez sur le formulaire, le designer de Visual Basic 2005 Express Edition cre automatiquement deux onglets, qui sont des contrles TabPage. Supprimez-les en modiant la proprit TabPages du contrle TabControl ou en cliquant sur le lien Supprimer longlet dans la fentre des proprits. Il est en effet inutile de garder des onglets sur le contrle TabControl puisque vous allez implmenter une gestion dynamique qui va permettre lutilisateur de grer lui-mme les onglets comme il le souhaite. Linterface est prsent termine.

m Figure 12-3 : Interface nale de lapplication

12.4 Ralisation
Passons prsent au dveloppement de lapplication. Vous allez apprendre dans la suite de ce chapitre grer des onglets dynamiquement et accder une base de donnes SQL Server 2005 Express.

186 Le guide du codeur

Ralisation

12

Gestion dynamique des onglets


Pour ajouter des onglets contenant un contrle WebBrowser ncessaire laffichage dune page web, vous devez crer dynamiquement des contrles et les ajouter au contrle TabControl de votre formulaire. Cette gestion dynamique est assez simple mettre en place mme si elle introduit quelques complexits que nous aborderons par la suite. La cl pour crer dynamiquement des contrles est de les ajouter aux contrles parents existants (un formulaire, un TabControl) an de les inclure dans larborescence des contrles de la fentre et de pouvoir les grer correctement. Cet ajout se fait gnralement grce la proprit Controls dun contrle. Dans le cas dun contrle TabControl, il faut utiliser la proprit TabPages, qui permet daccder directement la collection des onglets dun TabControl. La cration dynamique donglets incluant un contrle WebBrowser peut donc se faire via ce code :
Private Sub CreerOnglet(ByVal url As String) Dim newTabPage As New TabPage Dim newWebBrowser As New WebBrowser newWebBrowser.Dock = DockStyle.Fill AddHandler newWebBrowser.Navigated, _ AddressOf Browser_Navigated newWebBrowser.Navigate(url) newTabPage.Controls.Add(newWebBrowser) TabControl1.TabPages.Add(newTabPage) TabControl1.SelectTab(newTabPage) End Sub

La procdure CreerOnglet permet de crer un onglet affichant le site web correspondant lURL passe en paramtre de cette procdure. La premire ligne de ce code permet dinstancier un contrle TabPage reprsentant un onglet. On cr ensuite un contrle WebBrowser et on modie sa proprit Dock an dadapter la taille du contrle navigateur dynamiquement en fonction de la taille de la fentre. La quatrime ligne de cette procdure permet de grer dynamiquement lvnement Navigated du contrle WebBrowser cr dynamiquement. En effet, comme vous crez vous-mme vos contrles durant lexcution du programme, il est impossible de modier leurs proprits grce la fentre de proprits de Visual Basic 2005 Express Edition et de grer les vnements automatiquement comme on peut le faire dhabitude. Il faut donc par programmation refaire tout ce que lenvironnement de dveloppement permet de raliser de manire "visuelle". La gestion des vnements peut se faire grce au mot-cl AddHandler. Il permet de lier un vnement, dans ce cas lvnement Navigated qui est dclench lorsque le chargement dune page est termin, une fonction, dans cet exemple Browser_Navigated. On dnit ce lien en crant un pointeur de fonction grce au mot-cl AddressOf.
Le guide du codeur 187

12

Navigateur Internet

Cet vnement est donc gr grce une mthode appele Browser_Navigated, qui permet de modier le titre de longlet en fonction du titre de la page charge.
Private Sub Browser_Navigated( _ ByVal sender As System.Object, _ ByVal e As _ System.Windows.Forms.WebBrowserNavigatedEventArgs) Dim cu_browser As WebBrowser cu_browser = sender cu_browser.Parent.Text = cu_browser.DocumentTitle End Sub

On rcupre simplement le contrle Browser qui a dclench lvnement grce au paramtre sender de la fonction. On change la proprit Text du contrle parent du contrle Browser qui, dans cette application, est forcment un contrle TabPage correspondant un onglet, en lui affectant la proprit DocumentTitle du contrle WebBrowser. Cette proprit retourne le titre du document charg, cest--dire le titre de la page web charge par le contrle. La suite de la procdure est assez simple comprendre. On appelle la mthode Navigate du contrle WebBrowser an de charger lURL choisie et lon ajoute les diffrents contrles aux contrles parents an que larborescence soit correcte et que tout fonctionne parfaitement. Pour tester ce code, il ne reste plus qu lappeler dans lvnement Load du formulaire :
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load CreerOnglet("about:home") End Sub

Ces lignes crent un premier onglet qui affiche la page de dmarrage de votre navigateur ds le chargement de la fentre (et donc de lapplication). An de complter cette gestion donglets, vous pouvez ajouter du code dans lvnement click des deux derniers boutons de la deuxime barre doutils. Ces boutons servent respectivement ajouter un onglet et supprimer longlet courant. Le code correspondant est relativement simple :
Private Sub ToolStripNouvelOnglet_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ToolStripNouvelOnglet.Click CreerOnglet("about:home") End Sub

188 Le guide du codeur

Ralisation

12

Private Sub ToolStripButtonSupprOnglet_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ToolStripButtonSupprOnglet.Click If TabControl1.SelectedTab IsNot Nothing And _ TabControl1.TabPages.Count > 1 Then TabControl1.TabPages.Remove( _ TabControl1.SelectedTab) End If End Sub

Le seul point dexplication ncessaire concerne le code correspondant au bouton de suppression de longlet courant. On teste lexistence dun onglet slectionn et lon vrie que lon a bien plus dun onglet prsent dans le contrle TabControl. On supprime ensuite simplement longlet slectionn grce la mthode Remove de la collection de TabPages du TabControl. Il faut prsent tre capable de manipuler le contrle Browser courant an de pouvoir fournir les fonctionnalits de navigation. Crer une fonction permettant de rcuprer ce contrle courant est donc une solution pertinente et le code ncessaire pour raliser cela est assez simple :
Private Function GetActiveBrowser() As WebBrowser Return TabControl1.SelectedTab.Controls(0) End Function

Cette fonction rcupre le premier contrle enfant de longlet slectionn. Comme dans cette application chaque onglet ne contient quun contrle WebBrowser, cette fonction renvoie le contrle WebBrowser de longlet slectionn. Vous pouvez donc prsent manipuler le contrle WebBrowser de manire simple et effectuer toutes les oprations de navigation ncessaires grce aux mthodes GoBack, GoForward, Stop, Refresh, GoHome, ShowPrintDialog.
Private Sub ToolStripButtonBack_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ToolStripButtonBack.Click GetActiveBrowser.GoBack() End Sub Private Sub ToolStripButtonPrevious_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ToolStripButtonForward.Click GetActiveBrowser.GoForward() End Sub

Le guide du codeur 189

12

Navigateur Internet

Private Sub ToolStripButtonStop_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ToolStripButtonStop.Click GetActiveBrowser.Stop() End Sub Private Sub ToolStripButtonRefresh_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ToolStripButtonRefresh.Click GetActiveBrowser.Refresh() End Sub Private Sub ToolStripButtonHome_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ToolStripButtonHome.Click GetActiveBrowser.GoHome() End Sub Private Sub ToolStripButtonPrint_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ToolStripButtonPrint.Click GetActiveBrowser.ShowPrintDialog() End Sub

De plus, an davoir une meilleure ergonomie, il serait pertinent dactiver ou non les boutons Prcdent et Suivant si la ralisation de ces actions est possible. Pour ce faire, vous pouvez ajouter deux lignes de code dans lvnement SelectedIndexChanged :
Private Sub TabControl1_SelectedIndexChanged(_ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles TabControl1.SelectedIndexChanged ToolStripButtonBack.Enabled = _ GetActiveBrowser.CanGoBack ToolStripButtonForward.Enabled = _ GetActiveBrowser.CanGoForward End Sub

Le fonctionnement de base de votre navigateur est prsent dni.

190 Le guide du codeur

Ralisation

12

Recherche
Voyons maintenant comment grer la fonctionnalit de recherche. Vous allez proposer lutilisateur de rechercher simultanment dans plusieurs moteurs de recherche. Cette fonctionnalit nexiste dans aucun autre navigateur. Elle va tre mise en place simplement. Vous avez prcdemment cr un ToolStrip SplitButton permettant de slectionner le ou les moteurs de recherche que souhaite utiliser lutilisateur. Il suffit donc prsent de rechercher quels lments sont slectionns et de crer de nouveaux onglets pour chaque recherche an de permettre lutilisateur de rechercher simultanment dans plusieurs moteurs (dans cet exemple Google et MSN).
Private Sub ToolStripSplitButtonSearch_ButtonClick(_ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ToolStripSplitButtonSearch.ButtonClick If GoogleToolStripMenuItem.Checked Then CreerOnglet("http://www.google.com" + _ "/search?q=" + ToolStripTextBoxSearch.Text) End If If MSNToolStripMenuItem.Checked Then CreerOnglet("http://search.msn.fr" + _ "/results.aspx?q=" + _ ToolStripTextBoxSearch.Text) End If End Sub

m Figure 12-4 : Recherche multimoteur

Le guide du codeur 191

12

Navigateur Internet

Gestion des raccourcis clavier


An damliorer lergonomie de lapplication, il est prfrable de proposer diffrents raccourcis clavier lutilisateur. Le plus simple pour implmenter manuellement des raccourcis clavier simples, comme la validation avec la touche [Entre], est dcrire du code dans lvnement KeyDown des contrles. Par exemple, la procdure suivante lance la recherche lorsque lutilisateur appuie sur [Entre] dans la zone de texte correspondant la recherche situe dans la premire barre doutils.
Private Sub ToolStripTextBoxSearch_KeyDown( _ ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.KeyEventArgs) _ Handles ToolStripTextBoxSearch.KeyDown If e.KeyCode = Keys.Enter Then ToolStripSplitButtonSearch_ButtonClick _ (sender, Nothing) End If End Sub

Lexemple suivant permet de faire de mme avec la barre dadresse et douvrir un nouvel onglet si lutilisateur appuie sur la combinaison de touches [Ctrl]+[T].
Private Sub ToolStripTxtUrl_KeyDown( _ ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.KeyEventArgs) _ Handles ToolStripTxtUrl.KeyDown If e.KeyCode = Keys.Enter Then ToolStripSplitButtonGo_ButtonClick _ (sender, Nothing) End If If e.KeyCode = Keys.T And e.Control Then CreerOnglet(ToolStripTxtUrl.Text) End If End Sub

Contrle parental
Voyons prsent comment ajouter des fonctionnalits de contrle parental. Pour commencer, vous allez stocker tout lhistorique des visites dans la table dhistorique. Cette table comprend trois champs : id_url, de type BigInt et auto-incrment, url, de type VarChar et qui a une longueur de 255 caractres, et date_visite, de type DateTime.

192 Le guide du codeur

Ralisation

12

Voici le script SQL qui cre la base de donnes ainsi que la table :
USE [master] GO /****** Object: Database [Navigateur] Script Date: 06/26/2006 06:12:11 ******/ CREATE DATABASE [Navigateur] ON PRIMARY ( NAME = NNavigateur, FILENAME = NC:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Navigateur.mdf , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = NNavigateur_log, FILENAME = NC:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Navigateur_log.ldf , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) COLLATE French_CI_AS GO EXEC dbo.sp_dbcmptlevel @dbname=NNavigateur, @new_cmptlevel=90 GO IF (1 = FULLTEXTSERVICEPROPERTY(IsFullTextInstalled)) begin EXEC [Navigateur].[dbo].[sp_fulltext_database] @action = enable end GO ALTER DATABASE [Navigateur] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [Navigateur] SET ANSI_NULLS OFF GO ALTER DATABASE [Navigateur] SET ANSI_PADDING OFF GO ALTER DATABASE [Navigateur] SET ANSI_WARNINGS OFF GO ALTER DATABASE [Navigateur] SET ARITHABORT OFF GO ALTER DATABASE [Navigateur] SET AUTO_CLOSE OFF GO ALTER DATABASE [Navigateur] SET AUTO_CREATE_STATISTICS ON GO ALTER DATABASE [Navigateur] SET AUTO_SHRINK OFF GO ALTER DATABASE [Navigateur] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [Navigateur] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [Navigateur] SET CURSOR_DEFAULT GLOBAL GO
Le guide du codeur 193

12

Navigateur Internet

ALTER DATABASE [Navigateur] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [Navigateur] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [Navigateur] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [Navigateur] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [Navigateur] SET ENABLE_BROKER GO ALTER DATABASE [Navigateur] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [Navigateur] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [Navigateur] SET TRUSTWORTHY OFF GO ALTER DATABASE [Navigateur] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [Navigateur] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [Navigateur] SET READ_WRITE GO ALTER DATABASE [Navigateur] SET RECOVERY SIMPLE GO ALTER DATABASE [Navigateur] SET MULTI_USER GO ALTER DATABASE [Navigateur] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [Navigateur] SET DB_CHAINING OFF USE [Navigateur] GO /****** Object: Table [dbo].[Historique] Script Date: 06/26/2006 06:12:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Historique]( [id_url] [bigint] IDENTITY(1,1) NOT NULL, [url] [nvarchar](255) COLLATE French_CI_AS NOT NULL, [date_visite] [datetime] NOT NULL, CONSTRAINT [PK_Historique] PRIMARY KEY CLUSTERED ( [id_url] ASC )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]
194 Le guide du codeur

Ralisation

12

An dexcuter ce script, dmarrez SQL Server Management Express, connectez-vous en cliquant sur le bouton Connect dans la bote de dialogue qui souvre. Cliquez ensuite sur le bouton New Query et recopiez le script SQL prcdent. Validez en cliquant sur le bouton Execute pour que la base de donnes ainsi que la table dhistorique soient cres.

m Figure 12-5 : SQL Server Management Studio Express

Il est maintenant ncessaire dcrire le code qui permet de se connecter la base de donnes et dinsrer les URL saisies dans la barre dadresse. An de crer la couche daccs aux donnes, vous aller dnir une classe intitule HistoriqueDAO. Elle contiendra une mthode statique nomme InsertIntoHistorique, qui prendra en paramtre une chane contenant lURL qui sera insre dans lhistorique. La connexion une base de donnes se fait laide dune brique du Framework .NET nomme ADO .NET. ADO .NET propose diffrentes classes permettant de manipuler des donnes. Plusieurs dentre elles sont spciques au systme de gestion de bases de donnes. Dans ce cas, vous allez utiliser une base SQL Server. Vous devez donc exploiter les classes prsentes dans le namespace System.Data.SqlClient. La manipulation de bases de donnes peut paratre complique au premier abord, mais nous allons procder par tapes.

Le guide du codeur 195

12

Navigateur Internet

Pour manipuler des donnes prsentes dans une base de donnes, il faut commencer par crer une connexion cette base. Pour ce faire, ADO .NET propose la classe SqlConnection. Elle permet dtablir des connexions des serveurs et des bases SQL Server. Cette classe SqlConnection a deux proprits importantes : la proprit ConnectionString, qui permet de dnir la chane de connexion utiliser an de se connecter une base de donnes, et la proprit State, qui permet de connatre ltat de la connexion ( savoir ouverte, ferme). La chane de connexion est primordiale. Toute erreur dans la cration de celle-ci empchera le code de fonctionner. Les chanes de connexion permettant de se connecter une base de donnes SQL Server 2005 Express peuvent scrire de diffrentes manires. Dans ce cas, on dnit trois paramtres :
j

Data Source : permet de dnir le serveur SQL Server 2005 Express qui

hberge la base de donnes. Dans ce cas, on spcie la machine locale grce loprateur ., et linstance de la base qui, par dfaut, se nomme SQLEXPRESS. Initial Catalog : permet de dnir la base de donnes qui sera utilise par la connexion. Integrated Security : permet de dnir le fait que lon souhaite utiliser une authentication Windows, et non SQL.

La classe SqlConnection a galement deux mthodes importantes : Open, qui permet douvrir la connexion, et Close, qui permet de la fermer. Ainsi, louverture dune connexion une base SQL Server 2005 Express peut se faire ainsi :
Dim myconnection As New SqlConnection myconnection.ConnectionString = _ "Data Source=.\SQLEXPRESS;Initial Catalog=" _ "Navigateur;Integrated Security=True;" myconnection.Open()

Bien videmment, ce code est susceptible de lever une exception puisque louverture de la connexion peut chouer. Vous devez donc utiliser un bloc TryCatch an de crer vos connexions. Maintenant que vous savez crer une connexion une base, vous devez tre capable dexcuter des requtes SQL. En ce sens, ADO .NET propose une classe nomme SqlCommand. Elle permet dexcuter des requtes SQL pour insrer des donnes dans une table, les modier, les supprimer et les rcuprer. La premire manipulation faire lorsque lon souhaite utiliser un objet
SqlCommand est dattacher cet objet une connexion existante. Il faut en effet

que la requte SQL soit excute sur une connexion, et non "dans le vide". Vous
196 Le guide du codeur

Ralisation

12

devez donc modier sa proprit Connection an de slectionner une connexion valide et ouverte. Vous devez en outre modier la proprit CommandText an de dnir la requte SQL excuter : Select, Insert, Update ou Delete. Il sagit simplement dcrire une requte SQL valide. Si vous souhaitez passer des paramtres dans votre requte, comme dans cet exemple, vous devez ajouter le prxe @ vos paramtres. Lutilisation de la mthode AddWithValue de la proprit Parameters permet ensuite dajouter les valeurs de ces paramtres assez facilement : il suffit dindiquer le nom du paramtre dont il faut modier la valeur et ladite valeur. Aprs avoir initialis toutes ces donnes importantes, il ne reste plus qu excuter la requte laide de la mthode ExecuteNonQuery. Le code dinsertion dURL dans lhistorique est le suivant :
Imports System.Data Imports System.Data.SqlClient Public Class HistoriqueDAO Public Shared Sub InsertIntoHistorique(_ ByVal url As String) Dim myconnection As New SqlConnection myconnection.ConnectionString = _ "Data Source=.\SQLEXPRESS;Initial Catalog=" _ "Navigateur;Integrated Security=True;" Try myconnection.Open() Dim cmdInsert As New SqlCommand cmdInsert.Connection = myconnection cmdInsert.CommandText = "insert into " _ "Historique (url, date_visite) " _ "values (@url,@date_visite)" cmdInsert.Parameters.AddWithValue _ ("@url", url) cmdInsert.Parameters.AddWithValue _ ("@date_visite", Date.Now) cmdInsert.ExecuteNonQuery() Catch sqlex As SqlException MsgBox("Impossible de stocker lurl " _ "dans la base de donnes", _ MsgBoxStyle.Exclamation, "Erreur") Catch ex As Exception MsgBox("Une erreur non gre est survenue " + _ ex.Message, MsgBoxStyle.Exclamation, _ "Erreur") Finally If myconnection.State = ConnectionState.Open _
Le guide du codeur 197

12

Navigateur Internet

Then myconnection.Close() End If End Try End Sub End Class

Votre application est prsent termine et fonctionnelle.

12.5 Check list


Voici les concepts et les fonctionnalits prsents dans ce chapitre :
j j

j j

crer et grer dynamiquement des contrles ; se connecter et rcuprer des informations dune base de donnes SQL Server ; utiliser le contrle WebBrowser ; crer des barres doutils dans des applications Windows.

198 Le guide du codeur

Ch apit re

13 Aggrgateur RSS

Ralisation ................................................ 202 Check-list .................................................. 209

13

Aggrgateur RSS

Vous allez dcouvrir dans ce chapitre ce quest RSS et comment crer des pages web permettant de consulter des ux RSS de manire simple.

Flux RSS Les ux RSS (Really Simple Syndication) sont une nouvelle manire de consulter les sites web de faon rapide. Ils existent depuis quelques annes et sont incontournables.

Plus besoin dutiliser votre navigateur prfr et de charger les sites web que vous aimez un par un : vous avez prsent la possibilit de tlcharger le contenu de ces sites web (news, articles) et de les consulter en local sils proposent des ux RSS.

b Figure 13-1 : Icne RSS affiche sur les pages web proposant des ux

Un ux RSS est un document XML qui regroupent les informations importantes proposes par un site web pour lister des news, des articles, etc. Voici un exemple de ux RSS raccourci an que vous compreniez la logique.
<?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet type="text/xsl" href="http://blogs.developpeur.org/rss.xsl" media="screen"?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"> <channel> <title>Patrice Lamarche</title> <link>http://blogs.developpeur.org/patrice/default.aspx </link> <description>Des infos sur WinFX, .net 2, etc. </description> <dc:language>fr-FR</dc:language> <generator>CommunityServer 2.0 (Build: 60217.2664) </generator> <item> <title>Et un de plus !</title> <link>http://blogs.developpeur.org/patrice/archive/ 2006/07/02/nomination_mvp.aspx</link> <pubDate>Sun, 02 Jul 2006 17:15:00 GMT</pubDate> <guid isPermaLink="false">7d6e5d3c-61cc-4264-bc3a-a336023fcec4:22073</guid> <dc:creator>patrice</dc:creator>

200 Le guide du codeur

13

<slash:comments>13</slash:comments> <comments> http://blogs.developpeur.org/patrice/comments/22073.aspx </comments> <wfw:commentRss> http://blogs.developpeur.org/patrice/ commentrss.aspx?PostID=22073</wfw:commentRss> <description> Lt commence bien ! </description> <category domain="http://blogs.developpeur.org/patrice/ archive/category/1235.aspx">Perso</category> </item> <item> <title>[Session] D&#233;veloppement avec Windows Presentation Foundation</title> <link>http://blogs.developpeur.org/patrice/archive/ 2006/06/21/wpf_windows_vista_evenement_asp_php _codes_sources.aspx</link> <pubDate>Wed, 21 Jun 2006 11:50:00 GMT</pubDate> <guid isPermaLink="false">7d6e5d3c-61cc-4264-bc3a-a336023fcec4:21766</guid> <dc:creator>patrice</dc:creator> <slash:comments>0</slash:comments> <comments> http://blogs.developpeur.org/patrice/comments/21766.aspx </comments> <wfw:commentRss>http://blogs.developpeur.org/ patrice/commentrss.aspx?PostID=21766</wfw:commentRss> <description> Je vous en ai parl lors de mon prcdent post, jai eu loccasion de donner une prsentation du dveloppement sur Windows Vista&nbsp;avec Windows Presentation Foundation lors de lvnement CodeS-SourceS/ASP-PHP.net. Je viens duploader les slides en ve<img src= "http://blogs.developpeur.org/aggbug.aspx?PostID=21766 width="1" height="1"> </description> <category domain="http://blogs.developpeur.org/ patrice/archive/category/1189.aspx">Mes Sessions </category> </item> </channel> </rss>

Un ux RSS est donc bien un document XML regroupant des informations dans des balises item.

Le guide du codeur 201

13

Aggrgateur RSS

Chaque lment du ux est reprsent par une balise item, elle-mme incluse dans une balise channel qui reprsente lensemble du ux. Chaque balise item contient un ensemble de balises dnissant linformation grce plusieurs caractristiques.
Balises les plus importantes Nom de balise Description

title

Contient le titre de linformation. Il sagit en gnral dune chane de caractres ne contenant pas dinformation de formatage. Dnit le lien de la page contenant linformation. Il sagit donc du lien quil faudra suivre si lon souhaite avoir plus de dtails dans le cas o lauteur ne syndique que le rsum. Dnit la date de publication de linformation. Dnit de manire unique linformation. Lien pointant vers la page contenant les proprits. Balise contenant linformation elle-mme. Contient souvent des balises HTML encodes an de formater linformation, dy placer des liens, etc. Dnit la ou les catgories auxquelles est rattache linformation.

link

pubDate guid comments description

category

13.1 Ralisation
An de crer une page web capable de proposer ce genre de ux et donc dafficher de manire intuitive un document XML, vous devez commencer par crer une source de donnes, puis utiliser un contrle daffichage pour afficher les donnes fournies. Cette opration est appele "databinding". ASP .NET 2 propose plusieurs types de sources de donnes :
j

SqlDataSource permet de fournir des donnes en provenance de bases de

donnes SQL relationnelles comme des bases de donnes SQL Server, Oracle, DB2, etc. AccessDataSource permet de rcuprer des donnes issues de bases de donnes Microsoft Access. ObjectDataSource permet de fournir des donnes disponibles sous forme dobjets. XmlDataSource permet de fournir des donnes disponibles sous forme de document XML.

202 Le guide du codeur

Ralisation

13

SiteMapDataSource permet de fournir des donnes reprsentant larborescence du site web.

b Figure 13-2 : Contrles Sources de donnes dans la bote outils

Vous allez devoir utiliser un contrle XmlDataSource an de rcuprer des donnes issues dun ux RSS, puisquun ux RSS est un document XML. Pour cela, rendez-vous dans la bote outils, affichez la catgorie Donnes et insrez un contrle XmlDataSource sur votre surface de travail. Lorsque vous linsrez sur le formulaire web, cliquez sur le smart tag du contrle (le petit triangle en haut droit du cadre gris) pour ouvrir une bote de dialogue permettant de dnir ses diffrentes proprits.

m Figure 13-3 : Saisie des proprits du contrle XmlDataSource

Cette bote de dialogue permet de dnir le chier de donnes utiliser, cest--dire le document XML qui va servir de source de donnes. Ce document peut tre un chier prsent sur votre disque dur, ou disponible sur Internet et accessible via une simple URL. Dans ce dernier cas, ASP .NET va automatiLe guide du codeur 203

13

Aggrgateur RSS

quement tlcharger le document pour que vous puissiez le manipuler grce au contrle XmlDataSource. Cest donc cette option que vous allez choisir. Pour dbuter et des ns de test, vous pouvez utiliser un ux RSS propos par la version franaise du site www.asp.net dvelopp par Microsoft, et qui numre les diffrents articles techniques en franais traitant dASP .NET : www.asp.net/modules/ articleRss.aspx?count=5&mid=66. Vous pouvez galement dnir un chier de transformation. XML est en effet un standard qui est accompagn dautres standards indissociables :
j

XSD permet de dnir des schmas pour dnir la structure dun document XML XSL permet de transformer un document XML en un autre document XML respectant un autre schma. XPath est un langage de requte qui permet de naviguer au sein dun document XML.

Le chier de transformation attendu est donc un chier XSL. Il peut servir transformer un document XML en un document XHTML, lisible par des navigateurs. Ce paramtre tant facultatif, vous allez vous en passer et dnir la mise en forme et la mise en page directement au sein du contrle daffichage des donnes. Vous pouvez galement dnir une expression XPath. Cette requte va tre excute par le contrle XmlDataSource pour rcuprer le document XML. Ici, vous souhaitez uniquement afficher les diffrents posts du ux RSS et vous allez donc rcuprer uniquement le contenu des diffrentes balises item. Pour ce faire, vous devez dnir une requte XPath de la forme rss/channel/item. Le code gnr par le designer de Visual Basic 2005 Express Edition doit donc ressembler cela :
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile= "http://www.asp.net/modules/articleRss.aspx?count=5&mid=66" XPath="rss/channel/item"></asp:XmlDataSource>

Vous devez prsent utiliser un contrle daffichage de donnes an dafficher les donnes fournies par ce contrle XmlDataSource. Vous pouvez par exemple utiliser un contrle RepeaterXE Repeater. Ce contrle permet dafficher une liste dlments et de dnir la manire de lafficher.

204 Le guide du codeur

Ralisation

13

b Figure 13-4 : Contrle Repeater dans la bote outils

Placez-donc un contrle Repeater sur votre formulaire et dnissez la source de donnes utilise par ce contrle laide du smart tag du contrle.

b Figure 13-5 : Dnition de la source de donnes du contrle Repeater

Pour dnir la manire dafficher les donnes, vous devez vous rendre dans la source HTML de la page et personnaliser manuellement le contrle Repeater. Le Repeater offre la possibilit de dnir des templates. Ces templates peuvent contenir du code HTML ainsi que du code ASP .NET "inline". Lexemple suivant utilise trois types diffrents de templates :
j

Un HeaderTemplateXE HeaderTemplate permet de dnir ce qui va tre affich en en-tte de liste. Un ItemTemplateXE ItemTemplate permet de dnir ce qui va tre affich pour chaque lment. Un FooterTemplateXE FooterTemplate permet de dnir ce qui va tre affich en pied de liste.

Il est donc possible de personnaliser loisir laffichage des donnes, en crant, comme dans cet exemple, un tableau contenant les diffrents posts du ux RSS.
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="XmlDataSource1"> <HeaderTemplate><table border="1"> </HeaderTemplate> <ItemTemplate>

Le guide du codeur 205

13

Aggrgateur RSS

<tr><td style="background-color:#ffff99"> <strong> <a href="<%#XPath("link")%>"><%#XPath("title")%></a> </strong><br /> <font face="Verdana" size="2"><i><%#XPath("description") %></i> </font> </td></tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater>

b Figure 13-6 : Rendu du contrle Repeater en mode Design

Lorsque vous excutez votre page web, elle doit afficher le ux RSS de la version franaise du site ASP .NET.

m Figure 13-7 : Rendu de la page web

206 Le guide du codeur

Ralisation

13

Charger un ux RSS manuellement


Le ux RSS est pour le moment dni de manire statique puisque vous avez indiqu en mode Design lURL du ux RSS charger. Il est bien videmment prfrable de laisser lutilisateur slectionner le ux quil souhaite consulter. En ce sens, vous avez le choix entre deux manires de procder. Pour dbuter, vous allez proposer lutilisateur de saisir dans une zone de texte lURL du ux RSS quil souhaite visualiser. Pour cela, ajoutez une TextBoxXE TextBox nomm txtUrl ainsi quun bouton permettant de charger le ux saisi :
Protected Sub btnLoadUrl_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnLoadUrl.Click XmlDataSource1.DataFile = txtUrl.Text End Sub

Vous allez prsent permettre lutilisateur de stocker ses ux RSS favoris dans un chier XML. Ce chier XML sera ensuite charg dans un contrle DropDownListXE DropDownList grce un contrle XmlDataSource de la mme manire que prcdemment.
b Figure 13-8 : Interface de chargement manuel

Le chier XML est cr de la manire suivante. Libre lutilisateur dajouter autant de ux RSS quil souhaite. Pour crer un nouveau chier XML, cliquez du bouton droit sur votre projet web et slectionnez la commande Ajouter un nouvel lment. Dans la bote de dialogue qui saffiche, slectionnez licne Fichier XMLXE Fichier XML et nommez votre chier Abonnements.xml.

m Figure 13-9 : Cration du chier XML Le guide du codeur 207

13

Aggrgateur RSS

<?xml version="1.0" encoding="utf-8" ?> <abonnements> <flux url=http://blogs.developpeur.org/patrice/rss.aspx titre="Blog Patrice Lamarche Member of Wygteam"> </flux> <flux url=http://blogs.developpeur.org/tonio/rss.aspx titre="Blog Antoine Griffard Member of Wygteam"> </flux> <flux url=http://blog.developpez.com/xmlsrv/rss2.php?blog=26 titre="Blog Jean Marc Rabillou"> </flux> <flux url=http://blog.madd0.com/feed/ titre="Blog Mauricio Diaz Orlich" ></flux> </abonnements>

Pour charger ce chier XML dans le contrle DropDownList, il suffit de procder comme prcdemment, en utilisant un contrle XmlDataSource.
<asp:XmlDataSource ID="XmlDataSource2" runat="server" DataFile="~/Abonnements.xml" XPath="abonnements/flux"> </asp:XmlDataSource> <asp:DropDownList ID="ddlAbonnements" runat="server" AutoPostBack="True" DataSourceID="XmlDataSource2" DataTextField="titre" DataValueField="url"></asp:DropDownList><br />

Il ne reste plus qu charger le ux RSS slectionn :


Protected Sub ddlAbonnements_SelectedIndexChanged( _ ByVal sender As Object, ByVal e As System.EventArgs) _ Handles ddlAbonnements.SelectedIndexChanged XmlDataSource1.DataFile = ddlAbonnements.SelectedValue End Sub

Votre aggrgateur de ux RSS est termin.

m Figure 13-10 : Rendu nal

208 Le guide du codeur

Check-list

13

13.2 Check-list
Dans ce chapitre, vous avez appris :
j

ce quest le format RSS, le lire manuellement et comprendre son intrt ; intgrer des informations provenant dautres sites web directement dans vos pages ; utiliser des ux XML comme source de donnes grce au contrle XmlDataSource ; utiliser les contrles Repeater et DropDownList.

Le guide du codeur 209

Ch apit re

14 Cration dun gadget Live.com


Conguration du systme ............................ Composition dun gadget ............................. Crer un gadget de manire rapide et simple . Intgration dune iframe .............................. Cration de la page ASP .NET ..................... Interface de gestion des contacts ................ Affichage des contacts ............................... Check-list .................................................. 212 215 216 217 218 220 221 222

14

Cration dun gadget Live.com

Internet a pris rcemment une nouvelle tournure avec lavnement du Web 2.0. Le Web 2.0 est un terme marketing dsignant une nouvelle vague de sites web. Ces derniers possdent plus de dynamisme que les sites traditionnels grce la technologie Ajax, mise la mode par Google, et sadaptent mieux lutilisateur en lui permettant de personnaliser linterface, dincorporer les services quils offrent dans dautres sites web, etc. Microsoft a bien entendu pris la vague du Web 2.0 en proposant une gamme de services Live disponibles partir de nimporte quel type de priphrique, que lon soit connect Internet ou non. Un des premiers services Live lancs par Microsoft est le portail Live.com, qui permet lutilisateur de crer son propre portail en personnalisant tous les lments affichs sur la page. On peut en effet, ajouter, dplacer, supprimer tous les lments affichs de manire intuitive grce la souris. Ainsi, ajouter un lment affichant la mto, les dernires sorties au cinma, le contenu dune bote de-mails, ou encore les dernires informations dun site rcupres via un ux RSS est un jeu denfant. En plus de tous les lments proposs par dfaut dans Live.com, il est possible de dvelopper ses propres lments appels "gadgets", qui, une fois publis sur Internet, pourront tre exploits par les utilisateurs de Live.com du monde entier. Vous allez apprendre, dans ce chapitre, crer un gadget simple, qui permet dafficher le statut dun contact Skype grce Visual Web Developer Express et Visual Basic 2005.

14.1 Conguration du systme


Vous devez appliquer quelques changements votre systme pour dvelopper des gadgets qui pourront tre publis sur le site Live.com. Vous devez en effet congurer Internet Explorer pour tre capable de tester votre gadget dvelopp localement sur votre machine, sur le portail Live.com. Il faut pour cela ajouter le site http://*.live.com et le site http://*.start.com dans les sites de conance dInternet Explorer. Pour ce faire, lancez Internet Explorer, cliquez sur le menu Outils puis sur Options Internet. Dans la bote de dialogue qui saffiche, cliquez sur longlet Scurit et slectionnez licne Sites de confiance. Cliquez ensuite sur le bouton Sites. Dans la nouvelle fentre, vriez que la case Ncessite un serveur scuris (https:) pour tous les sites dans cette zone est bien dcoche. Puis ajoutez les sites http://*.live.com et http://*.start.com dans les sites de conance. Ltoile dans
212 Le guide du codeur

Conguration du systme

14

lURL indique que tous les sous-domaines de ces sites seront galement considrs comme des sites de conance.

m Figure 14-1 : Ajout dans les sites de conance

Ensuite, activez laccs aux sources de donnes sur plusieurs domaines puisque vous souhaitez dvelopper lapplication localement et la tester sur le portail Live.com. Pour cela, toujours sous longlet Scurit de la fentre Options Internet, slectionnez licne Internet, puis cliquez sur le bouton Personnaliser le niveau. Dans la fentre qui saffiche, recherchez la catgorie Divers et slectionnez laction Demander pour llment Accs aux sources de donnes depuis plusieurs domaines (voir Figure 14-2). Enn, dsactivez le cache de votre navigateur pour tre certain que le gadget qui saffiche dans le site Live.com est bien celui que vous souhaitez tester, et non une ancienne version mise en cache. Pour cela, sous longlet Gnral de la fentre Options Internet, cliquez sur le bouton Paramtres prsent dans la zone intitule Fichiers Internet temporaires. Dans la bote de dialogue qui saffiche, slectionnez loption chaque visite de la page. Ainsi, Internet Explorer chargera la page web depuis le serveur qui la dlivre chaque visite (voir Figure 14-3).

Le guide du codeur 213

14

Cration dun gadget Live.com

m Figure 14-2 : Modication de la scurit

m Figure 14-3 : Dsactivation du cache

214 Le guide du codeur

Composition dun gadget

14

14.2 Composition dun gadget


Un gadget se compose de trois lments :
j

Le premier et le plus important est le manifeste du gadget. Il sagit dun chier XML qui permet de dnir les informations sur le gadget : son titre, sa description et les liens vers ses autres composants.

Liste des balises les plus courantes dans un manifeste lment Description

title

Titre du gadget. Vous pouvez dnir nimporte quelle valeur de type texte. Ce titre sera affich par Live.com en haut de votre gadget. Description du gadget. Code de langue utilis par le gadget. Type utilis par le gadget et qui doit tre dni dans le chier .js (code JavaScript) associ. Un composant du gadget. Contient gnralement un lien pointant vers un chier JavaScript ou CSS. Balise gnralement prsente dans une balise item. Permet de dnir un lien vers un chier JavaScript. Balise incluse dans une balise item. Permet de dnir un lien vers un chier CSS. Balise contenant une ou plusieurs balises icon dnissant les icnes afficher, et en particulier licne principale du gadget.

Description language Binding:type item link link binding :type=css icons

Exemple de chier manifeste :


<?xml version="1.0"?> <rss version="2.0" xmlns:binding="http://www.live.com"> <channel> <title>Mon premier Gadget</title> <description>Description de mon premier gadget </description> <language>fr-fr</language> <binding:type>Wygwam.monPremierGadget</binding:type> <item> <link>http://www.wygwam.com/Gadgets/ MonPremierGadget/MonPremierGadget.js</link> </item> <item> <link binding:type="css"> http://www.wygwam.com/Gadgets/ MonPremierGadget/MonPremierGadget.css </link>

Le guide du codeur 215

14

Cration dun gadget Live.com

</item> <icons> <icon height="32" width="32"> http://www.mydomain.com/Gadgets/MonPremierGadget/MonPremierGadget.gif</icon> </icons> </channel> </rss>


j

Le deuxime lment important est le chier JavaScript (*.js). Il contient la logique du gadget et du code JavaScript, excut du ct client. Le dernier important est le chier .css. Il permet de dnir la mise en page et la mise en forme du contenu du gadget.

14.3 Crer un gadget de manire rapide et simple


Crer un gadget consiste donc crer le chier manifeste, un chier JavaScript qui gnrera lui-mme le rendu du gadget, et un style CSS pour mettre en forme et mettre en page le gadget. Le problme est que toute linterface doit tre gnre via du code JavaScript. Ainsi, si vous souhaitez ajouter des images ou des boutons, vous devrez gnrer le code HTML correspondant grce du code JavaScript. Le sujet de cet ouvrage ntant pas le langage JavaScript, et la gnration dun gadget rel se rvlant vite complexe si lon utilise uniquement JavaScript, vous allez mettre en uvre une autre solution que celle promue par Microsoft, mais qui facilite grandement la tche. Lastuce consiste utiliser une iframe, ce qui permettra dafficher la page ASP .NET souhaite la place du code HTML gnr laide de JavaScript. Le code JavaScript se rsumera donc quelques lignes ddies lintgration de liframe dans le gadget. Commencez par crer le manifeste du gadget :
<?xml version="1.0"?> <rss version="2.0" xmlns:binding="http://www.live.com"> <channel> <title>Skype Statut</title> <link>http://www.wygwam.com/</link> <description>Permet de visualiser le statut dun utilisateur du logiciel Skype.</description> <language>en-us</language> <pubDate>Tue, 15 Aug 2006 12:30:00 GMT</pubDate>

216 Le guide du codeur

Intgration dune iframe

14

<binding:type>Gadget.Skype</binding:type> <item> <link>http://www.wygwam.com/Gadgets/Patrice/Skype.js</link> </item> <item> <link binding:type="css"> http://www.wygwam.com/Gadgets/Patrice/Skype.css</link> </item> </channel> </rss>

Vous devez appeler lURL du manifeste pour ajouter le gadget votre page Live.com. Pour cela, cliquez sur le bouton Ajouter du contenu. Ds lors un panneau saffiche et propose les diffrentes catgories disponibles (Gadgets, Actualits, Loisirs, Tech). Cliquez sur Options avances pour accder au panneau dajout avanc. Via ce panneau, vous pouvez rechercher des ux de donnes avec laide de Live Search, ajouter un gadget via une URL, ou bien importer un chier OPML (chier de listing de ux RSS). Vous allez prsent ajouter un gadget. LURL est www.wygwam.com/gadgets/patrice/skype.xml. Elle redirige sur le manifeste du gadget. Celui-ci va permettre la plateforme Live de savoir quels chiers doivent tre tlchargs pour laffichage du gadget. Une fois ajout, ce dernier vient se placer automatiquement sur la page en cours de lecture. Vous pourrez cependant retrouver la liste de vos gadgets et ux RSS dans la rubrique Ma Slection.

14.4 Intgration dune iframe


Lintgration de liframe se fait via le chier JavaScript indiqu dans le manifeste.
////Cration et rfrencement de lespace de noms du gadget registerNamespace("Gadget"); //Classe implmenter Gadget.Skype = function(p_elSource, p_args, p_namespace) { Gadget.Skype.initializeBase(this, arguments); this.initialize = function(p_objScope) { Gadget.Skype.getBaseMethod(this, "initialize", "Web.Bindings.Base").call(this, p_objScope); var url = "http://localhost:4655/GadgetLive/Default.aspx";

Le guide du codeur 217

14

Cration dun gadget Live.com

m_iframe = document.createElement("iframe"); m_iframe.scrolling = "yes"; m_iframe.frameBorder = "0"; m_iframe.src = url; m_iframe.width="95%"; m_iframe.height="285px"; p_elSource.appendChild(m_iframe); } //Rfrencement de la classe Gadget.Skype.registerClass("Gadget.Skype", "Web.Bindings.Base"); }

URL de la page incluse Vous devez changer lURL contenue dans la variable url par celle de votre page. Une fois lapplication dploye, vous devrez changer cette URL pour afficher la page hberge sur Internet, et non votre page locale.

14.5 Cration de la page ASP .NET


Maintenant que vous tes capable dafficher votre page au sein du gadget grce lutilisation dune iframe, vous devez dvelopper cette page pour afficher le statut des contacts Skype et grer lesdits contacts.

Gestion des contacts


Lutilisateur du gadget doit tre capable de grer ses contacts. Vous allez lui permettre dajouter un contact ou de supprimer directement toute sa liste de contacts. Pour cela, vous allez utiliser la gestion des prols propose par ASP .NET 2. La nouvelle version dASP .NET permet de grer facilement des prols utilisateurs stocks dans une base SQL Server. Ces prols tant galement applicables aux utilisateurs anonymes non authentis sur le serveur, vous allez les sauvegarder pour tous les visiteurs sans leur demander de sauthentier. Pour cela, lancez lutilitaire aspnet_regsql.exe prsent dans le dossier du Framework .NET 2.

218 Le guide du codeur

Cration de la page ASP .NET

14

Dossier du Framework .NET 2 Le Framework .NET se situe dans le dossier Windows/Microsoft.NET/Framework. Vous y trouverez un dossier par version du Framework .NET install sur votre machine. Rendez-vous dans le dossier de la version 2. Exemple : C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727.

Indiquez les diffrents renseignements demands par lAssistant et validez. Cet Assistant permet de gnrer une base de donnes SQL Server, qui peut contenir toutes les informations ncessaires la gestion des membres, avec entre autres, tout ce qui concerne la gestion des prols. Pour activer les prols, vous devez modier le chier Web.config de votre application web. Ajoutez la section suivante votre Web.config pour congurer correctement votre application :
<anonymousIdentification enabled="true"/> <trust level="Medium"/> <profile defaultProvider="MyProfileProvider"> <properties> <add name="Contacts" allowAnonymous="true" type="ContactsManager" /> </properties> <providers> <add name="MyProfileProvider" connectionStringName="SqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider" /> </providers> </profile>

En ajoutant cette section, vous spciez que vous activez la gestion des prols pour les utilisateurs anonymes, quun prol est constitu dune proprit Contact qui est de type ContactsManager. Vous spciez galement que vous souhaitez utiliser le fournisseur de prols SqlProfileProvider (livr avec ASP .NET 2). Ce fournisseur utilise une chane de connexion nomme SqlServer. Vous devez donc la dnir dans la section ConnectionStrings du Web.config :
<connectionStrings> <add connectionString="server=.\SQLEXPRESS;database=aspnetdb; integrated security=SSPI;" name="SqlServer"/> </connectionStrings>

Le guide du codeur 219

14

Cration dun gadget Live.com

La base par dfaut gnre par lAssistant est nomme aspnetdb. Utilisez donc ce nom dans la chane de connexion. Il ne reste plus qu crer la classe ContactsManager pour grer les contacts :
Imports Microsoft.VisualBasic Imports System.Collections.Generic Public Class ContactsManager Private m_contacts As List(Of String) Public Sub New() End Sub Public Property Contacts() As List(Of String) Get If m_contacts Is Nothing Then m_contacts = New List(Of String) End If Return m_contacts End Get Set(ByVal value As List(Of String)) m_contacts = value End Set End Property Public Sub Ajouter(ByVal contact As String) If m_contacts Is Nothing Then m_contacts = New List(Of String) End If m_contacts.Add(contact) End Sub End Class

Cette classe permet daccder la liste des contacts grce la proprit du mme nom et dajouter des contacts grce la mthode Ajouter.

14.6 Interface de gestion des contacts


Il faut proposer lutilisateur dajouter des contacts ou de rinitialiser sa liste grce quelques contrles web. Pour cela, ajoutez un contrle TextBox que vous nommerez txtContact en modiant sa proprit Name, et deux boutons, le premier pour ajouter le contact saisi, et le second pour rinitialiser la liste.

220 Le guide du codeur

Affichage des contacts

14

b Figure 14-4 : Interface de gestion des contacts

Dans lvnement Click du bouton dajout, placez le texte saisi dans la collection de contacts :
Protected Sub btnAjout_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAjout.Click Profile.Contacts.Ajouter(txtContact.Text) End Sub

Puis dans lvnement Click du bouton de rinitialisation, modiez la proprit Contacts de lobjet Profile en lui attribuant une nouvelle instance de ContactsManager :
Protected Sub BtnInitialiser_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Profile.Contacts = New ContactsManager End Sub

14.7 Affichage des contacts


Pour proposer une interface facile demploi lutilisateur, placez les contrles de gestion des utilisateurs dans une div nomme ajout. Cette div sera affiche ou masque par lutilisateur grce un clic sur un lien. Pour afficher tous les contacts prsents dans le prol de lutilisateur, on effectue une boucle for each, qui permet dnumrer tous les contacts et dafficher limage de statut Skype correspondante.

Rcuprer le statut dun contact Skype Skype permet de connatre ltat dun utilisateur connect son service grce une image disponible ladresse http://mystatus.skype.com/balloon/pseudo, o pseudo est le pseudo Skype de lutilisateur.

Cela donne :
<body> <script> function masquerAjout() { if (document.getElementById(ajout).style.display==block) document.getElementById(ajout).style.display=none;
Le guide du codeur 221

14

Cration dun gadget Live.com

else document.getElementById(ajout).style.display=block; } </script> <form id="form1" runat="server"> <div> <br /> <%For Each s As String In Profile.Contacts.Contacts%> <%=s %><a href="skype:<%=s %>?call"> <img align="absmiddle" width="112,5" height="45" border="0" src="http://mystatus.skype.com/balloon/<%=s %>"/></a><br /> <%Next %> <a href="#" onclick="javascript:masquerAjout()">Ajouter</a> <div id="ajout" style="display:block"> <asp:TextBox ID="txtContact" runat="server"></asp:TextBox><asp:Button ID="btnAjout" runat="server" Text="Ajouter" /> <asp:Button ID="Button1" runat="server" Text="Supprimer" /> </div> </div> </form> </body>

m Figure 14-5 : Interface du gadget dans Live.com

14.8 Check-list
Dans ce chapitre, vous avez appris :
j j

crer un gadget Live.com grce lutilisation dune iframe ; attribuer des prols des utilisateurs anonymes.

222 Le guide du codeur

Ch apit re

15 Slecteur de papier peint


Classes et espaces de noms utiliss ............. Accs aux donnes .................................... Interface utilisateur ................................... Ralisation ................................................ Check-list .................................................. 224 224 225 230 236

15

Slecteur de papier peint

Dans ce chapitre, vous allez crer un utilitaire de changement de papier peint (wallpaper), limage darrire-plan du Bureau de Windows. Le systme dexploitation de Microsoft permet de slectionner une image et non dafficher de nouvelles images alatoirement. Vous allez donc combler ce manque grce un petit utilitaire dvelopp en Visual Basic 2005. Cette application sera le prtexte pour dvelopper une application Windows qui sintgre totalement au systme dexploitation en utilisant des mcanismes courants tels que le dmarrage automatique lors du lancement de Windows, lutilisation dicne dans la barre systme de la barre des tches (trayIcon), laccs la Base de registre, la gestion par glisser-dposer, etc. Vous verrez galement comment utiliser les fonctions systme API Win32 offertes par Windows.

15.1 Classes et espaces de noms utiliss


Bien que lapplication que vous allez raliser soit assez simple, vous allez devoir utiliser des espaces de noms assez varis puisque lutilitaire ncessite des fonctionnalits dans de multiples domaines :
j

System.Windows.Forms, pour tout ce qui concerne la cration dinterface

j j j

Windows ; System.IO, pour la manipulation de chiers ; System.Drawing, pour la manipulation dimages ; Microsoft.Win32, pour linteroprabilit avec le systme dexploitation et plus particulirement laccs la Base de registre ; System.XML, pour la manipulation de documents XML.

15.2 Accs aux donnes


Lobjectif de lapplication que vous allez dvelopper est de changer de papier peint automatiquement chaque dmarrage de lapplication, ou manuellement suite une action de lutilisateur. Vous devez donc crer et stocker une liste dimages qui sera utilise par lutilitaire. Stocker une liste de chemins de chiers ne ncessite pas la cration dune base de donnes car elle ne contiendrait quune table et quun seul champ. Un chier XML convient mieux au stockage dune simple liste dinformations.

224 Le guide du codeur

Interface utilisateur

15

15.3 Interface utilisateur


Lapplication ne compte quun seul formulaire. Vous allez donc modier celui gnr par dfaut lors de la cration du projet par Visual Basic 2005 Express.

m Figure 15-1 : Cration du projet Application Windows

Linterface graphique du formulaire est assez simple. Pour viter de grer le redimensionnement des fentres (inutile dans ce cas), vous allez modier deux proprits du formulaire. Pour commencer, modiez la proprit FormBorderStyle. Elle permet de dnir le type de bordure du formulaire. Vous pouvez donc indiquer que votre formulaire ne possde pas de bordure, ou possde une bordure redimensionnable, etc. Dans ce cas, vous allez affecter la valeur FixedDialog pour indiquer que la fentre nest pas redimensionnable car il sagit dune bote de dialogue simple. Modier cette proprit ne suffit cependant pas empcher le redimensionnement de la fentre par un utilisateur. Le bouton dagrandissement de la fentre est toujours prsent et accessible. Lutilisateur peut donc agrandir la fentre grce ce bouton prsent dans la barre de titre de la plupart des applications. Vous pouvez bien videmment dsactiver ce bouton grce la proprit MaximizeBox en lui affectant la valeur False.

Le guide du codeur 225

15

Slecteur de papier peint

b Figure 15-2 : Modication des proprits du formulaire

Vous allez utiliser un contrle ListBox, qui va permettre dafficher la liste des images qui seront affiches alatoirement. Placez ce contrle dans la partie suprieure de votre formulaire de telle sorte quil prenne toute la largeur de la fentre. Placez galement un contrle PictureBox pour afficher la miniature de limage slectionne dans la zone de liste que vous venez de crer. Pour permettre lutilisateur de dlimiter la PictureBox, modiez sa proprit BorderStyle et dnissez sa valeur Fixed3D pour afficher une bordure avec un effet 3D dlimitant lemplacement et la taille de la miniature. Placez deux boutons, le premier permettant dajouter une image la liste, et le second permettant de changer manuellement le fond dcran du Bureau de Windows.

b Figure 15-3 : Interface de lapplication

226 Le guide du codeur

Interface utilisateur

15

Afficher une icne dans la zone de notication


Pour rendre accessible lapplication et pour quelle noccupe pas de place dans la barre des tches, vous allez crer une icne dans la zone de notication, sur le ct droit de la barre des tches, prs de lheure du systme, de licne permettant de modier le volume ou de licne MSN Messenger si vous lavez install. Pour ce faire, il suffit dutiliser le composant NotifyIcon en doublecliquant dessus dans la bote outils. Le contrle nest pas ajout sur le formulaire, mais en dessous, dans la zone rserve aux composants non visuels. Changez la proprit Text du contrle pour afficher un message dans linfobulle de licne. Vous pouvez par exemple dnir cette valeur "Slection WallPaper".

m Figure 15-4 : Contrle non visuel NotifyIcon

Maintenant que licne est cre grce au contrle NotifyIcon, vous allez permettre lutilisateur daccder rapidement aux fonctions de lapplication grce un menu contextuel. Ce menu permettra dafficher le formulaire principal et de quitter lapplication. Pour le crer, il suffit dutiliser le contrle ContextMenuStrip, disponible dans la catgorie Menus et barres doutils. Double-cliquez sur le contrle pour lattacher au formulaire et ajoutez une entre &Afficher, une entre ayant comme texte un simple tiret () et une dernire entre ayant pour texte &Quitter.

Le guide du codeur 227

15

Slecteur de papier peint

Astuces pour les menus Lesperluette (&) permet dindiquer la lettre qui pourra servir lutilisateur pour accder llment du menu via un raccourci clavier [Alt]+la lettre suivant lesperluette. Lutilisation dun simple tire () permet de crer un sparateur dans le menu.

m Figure 15-5 : Utilisation du caractre & dans les menus

Pour lier licne dans la zone de notication et le menu contextuel, il faut modier la proprit ContextMenuStrip du contrle NotifyIcon en slectionnant le menu contextuel que vous venez de crer. Dans lvnement Click de llment &Afficher du menu contextuel, placez le code suivant pour afficher le formulaire :
Private Sub AfficherToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AfficherToolStripMenuItem.Click Me.WindowState = FormWindowState.Normal End Sub

228 Le guide du codeur

Interface utilisateur

15

Pour grer la prsence de licne dans la barre des tches, placez le code suivant dans lvnement SizeChanged du formulaire :
Private Sub Form1_SizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged If Me.WindowState = FormWindowState.Minimized Then Me.ShowInTaskbar = False Else Me.ShowInTaskbar = True End If End Sub

Ce code permet de masquer licne de la barre des tches lorsque la fentre est rduite, et de lafficher lorsque la fentre est visible grce la proprit ShowInTaskBar. Pour grer la fermeture de lapplication, ajoutez le code suivant dans lvnement Click de llment &Quitter :
Private Sub QuitterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterToolStripMenuItem.Click Application.Exit() End Sub

La mthode Exit de la classe Application permet de quitter lapplication. Pour demander une conrmation lutilisateur, il faut saisir quelques lignes de code dans lvnement FormClosing du formulaire :
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If MsgBox("tes-vous sr de vouloir quitter lapplication ?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Quitter ?") <> MsgBoxResult.Yes Then e.Cancel = True End If End Sub

Dans ce code, vous affichez une bote de dialogue laide de la fonction MsgBox et vous annulez la fermeture de la fentre en modiant le paramtre FormClosingEventArgs, nomm e, de lvnement FormClosing.

b Figure 15-6 : Bote de dialogue de conrmation Le guide du codeur 229

15

Slecteur de papier peint

15.4 Ralisation
Passons prsent au "gros uvre", cest--dire lessentiel de lapplication. Vous allez apprendre modier le papier peint courant, afficher une miniature dimage, et interagir avec Windows en implmentant des fonctionnalits de glisser-dposer et de manipulation de Base de registre.

Dnition du papier peint courant


Lobjectif principal de lutilitaire que vous dveloppez est de changer le papier peint courant grce la liste dimages que lutilisateur a dnie. Il nexiste malheureusement pas de fonction dans le Framework .NET qui permette deffectuer ce changement de papier peint. Vous allez donc devoir utiliser les fonctions propres au systme dexploitation : lAPI (Application Programming Interface) de Windows. Linterface de programmation dapplications propose par Windows permet daccder une importante partie des fonctionnalits utilises par le systme dexploitation lui-mme. Ainsi, la gestion des fentres, la gestion du Presse-papiers, le formatage de disques peuvent tre effectus par lappel des fonctions utilises par Windows et proposes par lAPI, nommes couramment "fonctions API". La fonction que vous devez utiliser est SystemParametersInfo, prsente dans la bibliothque user32.dll, qui est lune des librairies les plus importantes de Windows. Comme souvent, lappel une fonction API requiert lutilisation de certaines constantes. Vous allez en utiliser trois diffrentes. Les valeurs de ces constantes ainsi que la syntaxe de la dclaration de la fonction API sont indiques dans la documentation de Windows destine aux dveloppeurs et fournie par Microsoft. Malheureusement, cette documentation est assez ancienne ; elle date de la cration de la version de Windows que vous utilisez, et les exemples fournis sont rarement proposs en Visual Basic .NET ou en C#. Il est donc prfrable de rechercher de la documentation sur un site ddi disponible sur www.pinvoke.net. Voici la dclaration des constantes et de la fonction API utiliser pour le changement du papier peint :
Private Const SPI_SETDESKWALLPAPER As Integer = &H14 Private Const SPIF_UPDATEINIFILE As Integer = &H1 Private Const SPIF_SENDWININICHANGE As Integer = &H2 Private Declare Auto Function SystemParametersInfo Lib "user32.dll" ( _ ByVal uAction As Integer, ByVal uParam As Integer, _ ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer

Vous allez maintenant crer une mthode SetCurrentWallPaper qui va permettre de dnir le papier peint courant, savoir le chemin de limage qui sera
230 Le guide du codeur

Ralisation

15

affiche, et le mode daffichage (centr ou tir). Le changement dimage est effectu grce un appel la fonction API que vous avez dclare prcdemment et le mode daffichage est dni grce des modications dans la Base de registre de Windows.
Public Shared Sub SetCurrentWallPaper(ByVal imagePath As String) Dim imgBitmap As Image = Image.FromFile(imagePath) Dim desktopKey As RegistryKey = My.Computer.Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True) desktopKey.SetValue("TileWallpaper", "0") If imgBitmap.Width > My.Computer.Screen.Bounds.Width Or imgBitmap.Height > My.Computer.Screen.Bounds.Height Then desktopKey.SetValue("WallpaperStyle", "2") Else desktopKey.SetValue("WallpaperStyle", "0") End If desktopKey.Flush() desktopKey.Close() If System.IO.Path.GetExtension(imagePath) <> "bmp" Then imagePath = Path.ChangeExtension(imagePath, "bmp") imgBitmap.Save(imagePath, Imaging.ImageFormat.Bmp) End If imgBitmap.Dispose() SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, imagePath, _ SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE) End Sub

Affichage de la miniature
Pour amliorer lergonomie de lutilitaire, un aperu de limage slectionne dans le contrle ListBox prsent sur le formulaire va tre affich. Pour cela, il faut utiliser lvnement SelectedIndexChanged et vrier quun lment est slectionn en testant si la proprit SelectedIndex du contrle est suprieure 1. Vous ne pouvez malheureusement pas afficher limage dans un contrle en spciant directement le nom et le chemin du chier souhait car la proprit Image dune PictureBox attend un objet de type Image. Pour des raisons de simplicit, vous pouvez utiliser un objet de type Bitmap (le type Bitmap hrite du type Image et pourra donc tre utilis pour dnir la proprit Image dune PictureBox) pour charger un chier image et ensuite lafficher. Pour bncier dun meilleur affichage de limage, crivez le code suivant, qui centre limage si sa taille est infrieure la taille de la PictureBox et la redimensionne si elle est plus importante.
Le guide du codeur 231

15

Slecteur de papier peint

Private Sub lstWallPapers_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstWallPapers.SelectedIndexChanged If lstWallPapers.SelectedIndex > -1 Then Dim apercu As Bitmap = Image.FromFile(lstWallPapers.Text) If apercu.Width > 192 Or apercu.Height > 256 Then pctApercu.SizeMode = PictureBoxSizeMode.StretchImage Else pctApercu.SizeMode = PictureBoxSizeMode.CenterImage End If pctApercu.Image = apercu End If End Sub

b Figure 15-7 : Affichage de laperu

Gestion du glisser-lcher
Une des fonctionnalits intressantes qui est de plus en plus implmente dans les applications Windows et qui offre une souplesse dutilisation lutilisateur est de permettre le "glisser-lcher" de chiers depuis lExplorateur de chiers de Windows vers la zone de liste de lapplication. Pour activer le glisser-lcher vers la zone de liste, vous devez commencer par modier la proprit AllowDrop et la dnir True. Maintenant que le contrle est capable de recevoir des lments par glisserlcher, il est ncessaire de changer le curseur de la souris lorsquun lment glisse au-dessus du contrle pour indiquer lutilisateur quil peut dposer
232 Le guide du codeur

Ralisation

15

llment sur ledit contrle. Il faut en ce sens utiliser lvnement DragOver de la ListBox et modier le paramtre e de type DragEventArgs pour spcier le curseur affich.
Private Sub lstWallPapers_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstWallPapers.DragOver If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then e.Effect = DragDropEffects.Copy End If End Sub

Lorsquun lment est dpos, lvnement DragDrop est dclench. Il faut donc ajouter le code ncessaire lajout des lments dans la ListBox dans cet vnement.
Private Sub lstWallPapers_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstWallPapers.DragDrop If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then Dim files() As String = CType(e.Data.GetData(DataFormats.FileDrop), String()) For Each file As String In files lstWallPapers.Items.Add(file) Next End If End Sub

m Figure 15-8 : Gestion du glisser-dposer

Le guide du codeur 233

15

Slecteur de papier peint

Dmarrage automatique
Le dmarrage automatique dune application lors du lancement de Windows peut se faire de deux manires. La premire est de crer un raccourci dans le groupe de dmarrage du menu Dmarrer. La seconde est la cration dune valeur dans la Base de registre de Windows.

m Figure 15-9 : Groupe de dmarrage dans le menu Dmarrer

Pour grer toute cette partie lie au dmarrage automatique, il est prfrable de crer une classe StartManager, responsable de la cration et de la suppression de cette valeur dans la Base de registre. Il suffit ensuite de crer trois mthodes, EnableAutoStart, DisableAutoStart et IsAutoStart, pour respectivement activer le dmarrage automatique, le dsactiver, et tester si lapplication a dmarr automatiquement.
Imports Microsoft.Win32 Public Class StartManager Public Shared Sub EnableAutoStart() If Not IsAutoStart() Then Dim runKey As RegistryKey runKey = My.Computer.Registry.CurrentUser.OpenSubKey("Software\Microsoft\ Windows\CurrentVersion\Run", True) runKey.SetValue("SelecteurWallPaper", Application.ExecutablePath) runKey.Flush() runKey.Close() End If End Sub Public Shared Sub DisableAutoStart() Dim runKey As RegistryKey runKey = My.Computer.Registry.CurrentUser.OpenSubKey("Software\Microsoft\ Windows\CurrentVersion\Run", True) runKey.DeleteValue("SelecteurWallPaper") runKey.Flush() runKey.Close() End Sub Public Shared Function IsAutoStart() As Boolean Dim runKey As RegistryKey Dim returnValue As Boolean

234 Le guide du codeur

Ralisation

15

runKey = My.Computer.Registry.CurrentUser.OpenSubKey("Software\Microsoft\ Windows\CurrentVersion\Run", False) returnValue = (Not runKey.GetValue("SelecteurWallPaper") Is Nothing) runKey.Close() Return returnValue End Function End Class

Il suffit prsent dappeler ces mthodes lors de lvnement CheckedChange du contrle CheckBox pour grer le dmarrage automatique de lapplication.

Chargement et sauvegarde de la liste


Il est possible de stocker des informations dans des chiers XML grce au mcanisme de srialisation Reportez-vous au chapitre Gestion dun concours pour en savoir plus
Renvoi ce sujet.

Vous allez ici utiliser une autre technique, qui consiste crer manuellement et ex nihilo un document XML grce aux objets proposs par le Framework .NET dans lespace de noms System.XML. Vous allez donc utiliser un objet XmlTextWriter, qui va vous permettre dcrire un chier XML en dnissant ses balises une par une, ainsi quun objet XmlDocument, qui vous permettra de charger un chier XML et de naviguer au sein de celui-ci.
Private Sub SaveList() Dim ListWriter As New XmlTextWriter("images.xml", System.Text.Encoding.UTF8) ListWriter.WriteStartDocument() ListWriter.WriteStartElement("Images") For Each item As String In lstWallPapers.Items ListWriter.WriteElementString("Image", item) Next ListWriter.WriteEndElement() ListWriter.WriteEndDocument() ListWriter.Flush() ListWriter.Close() End Sub Private Sub LoadList() Dim listDocument As New XmlDocument Try listDocument.Load("images.xml") For Each image As XmlNode In listDocument.GetElementsByTagName("Image") lstWallPapers.Items.Add(image.InnerText)

Le guide du codeur 235

15

Slecteur de papier peint

Next Catch filex As System.IO.FileNotFoundException on ne fait rien, erreur gnre si le fichier est absent (cest le cas lors du premier dmarrage Catch ex As Exception MsgBox("Une erreur sest produite : " + ex.Message, MsgBoxStyle.Exclamation) End Try

Il faut prsent appeler ces mthodes depuis le formulaire. Vous devez donc charger le chier XML lors du dmarrage du formulaire grce son vnement Load.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load LoadList() End Sub

Ensuite sauvegardez la liste courante des images vers le chier lors de la fermeture de lapplication et donc du formulaire en modiant son vnement FormClosing.
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If MsgBox("tes-vous sr de vouloir quitter lapplication ?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Quitter ?") <> MsgBoxResult.Yes Then e.Cancel = True Else SaveList() End If End Sub

15.5 Check-list
Dans ce chapitre, vous avez appris :
j

j j j

utiliser le contrle NotifyIcon pour afficher une icne dans la barre systme de la barre des tches ; lire et crire un chier XML grce un objet XmlDocument ; utiliser les fonctions API Win32 ; implmenter les oprations de glisser-lcher entre lExplorateur et votre application ; manipuler des images.

236 Le guide du codeur

Ch apit re

16 WebParts

Classes et espaces de noms utiliss ............. Conguration ............................................ Construction de lapplication ........................ Ajout dune proprit "personnalisable" un WebPart ........................................... Check-list ..................................................

238 238 241 247 252

16

WebParts

Laisser lutilisateur la possibilit de personnaliser lui-mme une application selon ses propres besoins est une fonctionnalit intressante. Elle serait nanmoins complique mettre en place si vous deviez partir de zro pour raliser vos propres mcanismes de stockage des lments personnaliss par les utilisateurs et leur fournir des moyens de les modier et de les organiser selon leur convenance. Heureusement, le Framework ASP .NET 2.0 met dsormais disposition ce que lon appelle les WebParts. Il sagit dun ensemble de composants qui interagissent et permettent de crer des pages web dans lesquelles les utilisateurs peuvent modier lapparence, la disposition, le comportement et les proprits de chaque lment directement partir du navigateur. La fonctionnalit de base des WebParts est la personnalisation. Elle permet aux utilisateurs de modier ou de personnaliser la disposition, lapparence et le comportement des contrles WebPart sur une page. Ces paramtres personnaliss sont rendus persistants non seulement durant la session de navigation en cours, mais aussi long terme, an que les paramtres dun utilisateur ne soient pas perdus entre deux consultations du site.

16.1 Classes et espaces de noms utiliss


Pas moins de cent cinquante classes sont associes aux WebParts, soit presque autant que dans System.Web.UI.WebControls, qui contient les contrles serveurs web classiques. Cest pourquoi elles ncessitent un nouvel espace de noms : System.Web.UI.WebControls.WebParts. Toutes ces classes ne sont en ralit quun portage de ce qui constitue la base du portail de travail collaboratif Windows Sharepoint Services, le premier Framework qui a utilis cette notion de WebPart et mis disposition un ensemble de WebParts dj raliss qui permettent de grer des documents, de crer des listes dvnements, dannonces ou des tches.

16.2 Conguration
Les WebParts sont intgrs au modle de fournisseur ASP .NET dont nous avons parl dans plusieurs chapitres de ce livre. Cela implique notamment que vous pouvez congurer certaines fonctionnalits partir du chier web.config et de la section WebParts approprie.

238 Le guide du codeur

Conguration

16

Section WebParts
Voici quoi ressemblent les sections de conguration qui permettent de personnaliser le fournisseur de personnalisation des WebParts :
<webParts enableExport="true|false"> <personalization></personalization> <transformers></transformers> </webParts> <personalization defaultProvider=""> <authorization></authorization> <providers></providers> </personalization>

Section providers La section providers permet dajouter des fournisseurs de personnalisation de WebParts et de spcier leurs attributs :
<providers> <add name="String" type="String" connectionStringName="String" applicationName="String" commandTimeout="Integer"/> </providers>
Attributs de llment add dun SqlPersonalizationProvider Attribut Description

applicationName

Attribut String facultatif. Spcie le nom de lapplication pour laquelle on veut stocker et rcuprer des informations de personnalisation. Attribut String requis. Spcie la chane spcique au fournisseur SQL utilis pour tablir la connexion la base de donnes. Attribut Int32 facultatif. Spcie le nombre de secondes avant lexpiration du dlai imparti une commande mise dans la source de donnes de personnalisation WebParts. Attribut String requis. Nom convivial du fournisseur. Attribut String requis. Spcie une rfrence dassembly qualie complte une classe qui implmente la classe PersonalizationProvider de base.

connectionStringName

commandTimeout

name type

Par dfaut, le chier web.config utilise un fournisseur appel AspNetSqlPersonalizationProvider, dont le nom de chane de connexion est LocalSqlServer
Le guide du codeur 239

16

WebParts

et dont le type est System.Web.UI.WebControls.WebParts.SqlPersonalization Provider :


<providers> <add connectionStringName="LocalSqlServer" name="AspNetSqlPersonalizationProvider" type="System.Web.UI.WebControls.WebParts. SqlPersonalizationProvider" /> </providers>

Si vous voulez lutiliser, vous devez congurer votre base de donnes SQL ou SQL Express avec loutil aspnet_regsql.exe situ dans le dossier C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727.

Section authorization La syntaxe de la section authorization est similaire celle utilise pour spcier les rles et les utilisateurs autoriss ou refuss dans une application :
<authorization> <allow/> <deny/> </authorization>

Elle dispose en plus dun attribut verbs que vous pouvez utiliser pour dclarer les autorisations de modication de page et de basculement entre la porte utilisateur et partage. Les valeurs possibles sont donc les suivantes :
j

enterSharedScope : indique si un utilisateur ou un rle peut entrer dans la

porte partage. modifyState : indique si un utilisateur ou un rle peut modier des donnes de personnalisation pour la porte active.

Voici quoi peut ressembler la section webParts complte de votre chier web.config :
<webParts> <personalization defaultProvider="AspNetSqlPersonalizationProvider"> <providers> <remove name="AspNetSqlPersonalizationProvider"> </remove> <add name="AspNetSqlPersonalizationProvider" type="System.Web.UI.WebControls.WebParts. SqlPersonalizationProvider"

240 Le guide du codeur

Construction de lapplication

16

connectionStringName="LocalSqlServer" applicationName="/WebPart" /> </providers> </personalization> <authorization> <deny users="*" verbs="enterSharedScope" /> <allow users="*" verbs="modifyState" /> </authorization> </webParts>

16.3 Construction de lapplication


Maintenant que votre fournisseur est congur, vous pouvez commencer construire votre page de WebParts. An davoir une meilleure comprhension des lments qui entrent en jeu, vous allez construire votre application en plusieurs tapes en dcouvrant chaque fois quel contrle WebPart vous devez utiliser et son utilit. Vous allez galement sparer chaque fonctionnalit dans des contrles utilisateurs diffrents, ce qui vous permettra de mieux comprendre le rle de chacun.

Ajout du WebPartManager
Le contrle WebPartManager est llment principal qui gre les autres contrles WebPart dune page. Un seul contrle WebPartManager est ncessaire dans une page qui utilise des WebParts. Voici sa syntaxe dclarative :
<asp:WebPartManager ID="wpManager" runat="server" />

Ce contrle na aucun rendu, cest--dire quil nest pas visible au moment de laffichage de la page. Son rle est de grer tous les contrles WebPart de la page. Il gre des zones (rgions qui contiennent des contrles WebPart sur une page) et les contrles qui se trouvent dans celles-ci. Il suit galement et contrle les diffrents modes daffichage dune page (navigation, connexion, modication ou catalogue), et vrie si les modications de personnalisation sappliquent tous les utilisateurs ou aux utilisateurs individuels. Enn, il initialise et suit les connexions et la communication entre des contrles WebPart.

Ajout des contrles WebPartZone


Le contrle WebPartZone se charge de la disposition complte pour les contrles WebPart qui composent linterface utilisateur principale dune page. Vous pouvez dcomposer votre page en plusieurs zones dans lesquelles vous organiserez les diffrents WebParts que vous voulez utiliser.

Le guide du codeur 241

16

WebParts

La prochaine tape est donc de crer une page contenant deux contrles WebPartZone dans lesquels vous pourrez dposer vos WebParts, les organiser et les personnaliser votre guise. La manire la plus simple est de les placer dans un tableau deux colonnes :
<table border="0" width="100%" cellpadding="2" cellspacing="2"> <tr> <td valign="top" height="100%"> <asp:WebPartZone ID="LeftWebPartZone" HeaderText="Gauche" runat="server"> <ZoneTemplate> </ZoneTemplate> </asp:WebPartZone> </td> <td valign="top" height="100%"> <asp:WebPartZone ID="RightWebPartZone" HeaderText="Droite" runat="server"> <ZoneTemplate> </ZoneTemplate> </asp:WebPartZone> </td> </tr> </table>

m Figure 16-1 : Affichage dune page avec une zone gauche et une zone droite

Les zones servent de gestionnaires de prsentation sur une page WebPart. Les fonctionnalits disponibles pour ces zones et laffichage dpendent du mode daffichage en cours. Intressons-nous prsent aux diffrents modes daffichage qui existent et la faon de basculer de lun lautre.

Modes daffichage
Voici les modes daffichage par dfaut vers lesquels lutilisateur peut basculer sil a les droits appropris. Ces modes hritent tous de la classe abstraite WebPartDisplayMode.

242 Le guide du codeur

Construction de lapplication

16

Valeurs possibles de lnumration WebPartDisplayMode Mode Description

BrowseDisplayMode DesignDisplayMode EditDisplayMode CatalogDisplayMode

Affichage normal de consultation des contrles WebPart. Permet lutilisateur de faire glisser les contrles WebPart pour modier la disposition dune page. Permet lutilisateur de modier les contrles dune page. Permet aux utilisateurs dajouter et de supprimer des contrles sur une page laide des catalogues qui listent les WebParts disponibles. Permet aux utilisateurs de connecter des contrles WebPart entre eux.

ConnectDisplayMode

Pour basculer facilement entre les modes daffichage, vous allez crer un contrle utilisateur qui va contenir des boutons dont les actions auront pour effet de modier le mode daffichage en cours. 1 Dans le contrle utilisateur, insrez pour chaque mode daffichage disponible un contrle LinkButton qui servira faire basculer la page dans ce mode.
<asp:LinkButton ID="lnkBtnBrowse" runat="server"> Normal </asp:LinkButton>

m Figure 16-2 : Boutons de basculement du mode daffichage

2 Au chargement de la page, vriez pour chaque mode sil est pris en charge, et masquez ou affichez le lien en consquence. La collection SupportedDisplayModes du contrle WebPartManager vous aidera faire ce test.
Protected Sub PageLoad(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load lnkBtnBrowse.Visible = wpManager. _ SupportedDisplayModes.Contains _ (WebPartManager.BrowseDisplayMode) End Sub

3 Ajoutez galement des gestionnaires dvnements sur le clic des boutons an de faire basculer la page dans le mode slectionn.
Le guide du codeur 243

16

WebParts

Protected Sub lnkBtnBrowse_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles lnkBtnBrowse.Click wpManager.DisplayMode = WebPartManager.BrowseDisplayMode End Sub

4 Vous pouvez galement ajouter des contrles Label indiquant la porte de la page ainsi que le mode en cours obtenu.
Mode="<%= wpManager.DisplayMode.Name %>" Scope="<%= wpManager.Personalization.Scope.ToString() %>"

Au chargement de la page web, vous obtiendrez cet affichage. Vous pouvez constater que le mode daffichage de connexions entre WebParts nest pas disponible et que la porte est au niveau de lutilisateur. En outre, le mode daffichage en cours est Browse, ce qui correspond au mode normal.
b Figure 16-3 : Boutons de basculement dans une page web

Un clic sur le bouton Disposition permet de passer en mode Design, qui fait apparatre les deux zones gauche et droite et qui permettra plus tard de dplacer les WebParts.

m Figure 16-4 : Page en mode Design

Maintenant que le cadre est mis en place, il faut un contrle WebPart disposition. Vous pouvez en crer un vous-mme, comme sil sagissait dun contrle serveur personnalis, mais cela savre assez compliqu puisque vous devez tout crer par programmation. Heureusement, il existe une faon simple pour transformer un contrle utilisateur en WebPart.

Transformer un contrle utilisateur en WebPart


Cette mthode a pour avantage de vous laisser la possibilit de crer linterface de votre WebPart laide du designer de contrle utilisateur. Elle ne ncessite ensuite que quelques tapes de conguration. Il sagit dajouter les proprits qui vont faire de votre contrle utilisateur, un contrle WebPart part entire. Il suffit pour cela dimplmenter linterface IWebPart.
244 Le guide du codeur

Construction de lapplication

16

Interface IWebPart
Linterface IWebPart fournit les mthodes qui doivent tre implmentes si vous voulez crer un WebPart. Voici les proprits concernes et leurs rles :
Proprits implmenter de linterface IWebPart Nom Description

CatalogIconImageUrl Description

Obtient ou dnit lURL dune image qui reprsente un contrle WebPart dans un catalogue de contrles. Obtient ou dnit une brve expression qui rsume la fonction dun contrle, en vue dune utilisation dans les info-bulles et les catalogues de contrles WebPart. Obtient une chane concatne avec la valeur de la proprit Title pour constituer le titre complet dun contrle WebPart, ce qui permet de diffrencier deux WebParts qui auraient le mme titre. Obtient ou dnit le titre dun contrle WebPart. Obtient ou dnit lURL dune image utilise pour reprsenter un contrle WebPart dans la propre barre de titre du contrle. Obtient ou dnit une URL vers des informations supplmentaires relatives un contrle WebPart.

Subtitle

Title TitleIconImageUrl

TitleUrl

An davoir disposition une classe dont vous pouvez vous servir pour crer facilement des WebParts partir de contrles utilisateurs, vous pouvez avoir recours une petite astuce qui consiste dclarer une classe abstraite qui hrite de System.Web.UI.UserControl et qui implmente linterface IWebPart. Le code fournit une implmentation de base pour les proprits que vous venez de voir :
Public MustInherit Class ucWebPart Inherits System.Web.UI.UserControl Implements IWebPart Private Private Private Private Private Private _catalogImageUrl As String = String.Empty _description As String = String.Empty _subTitle As String = "[0]" _title As String = "Titre" _titleUrl As String = String.Empty _titleIconImageUrl As String = String.Empty

Public Overridable Property CatalogIconImageUrl() _ As String Implements IWebPart.CatalogIconImageUrl Get


Le guide du codeur 245

16

WebParts

Return _catalogImageUrl End Get Set(ByVal value As String) _catalogImageUrl = value End Set End Property Public Overridable Property Description() As String _ Implements IWebPart.Description Get Return _description End Get Set(ByVal value As String) _description = value End Set End Property Public Overridable ReadOnly Property Subtitle() _ As String Implements IWebPart.Subtitle Get Return _subTitle End Get End Property Public Property Title() As String _ Implements IWebPart.Title Get Return _title End Get Set(ByVal value As String) _title = value End Set End Property Public Property TitleIconImageUrl() As String _ Implements IWebPart.TitleIconImageUrl Get Return _titleIconImageUrl End Get Set(ByVal value As String) _titleIconImageUrl = value End Set End Property Public Property TitleUrl() As String _ Implements IWebPart.TitleUrl Get Return _titleUrl End Get Set(ByVal value As String) _titleUrl = value End Set End Property End Class

246 Le guide du codeur

Ajout dune proprit "personnalisable" un WebPart

16

Vous navez ainsi dclarer ce code quune seule fois et vous pouvez en hriter chaque fois que vous voulez transformer un contrle utilisateur en WebPart. Pour cela, vous devez crer un contrle utilisateur comme si vous dveloppiez une page puis hriter de la classe que vous venez de crer en personnalisant les proprits de base selon vos besoins :
Partial Class UCWebPart Inherits ucWebPart Public Sub New() MyBase.Title = "Titre personnalis" End Sub End Class

Lexemple de WebPart que vous allez crer est basique puisquil ne contiendra quune proprit Text que vous allez rendre "personnalisable" an de pouvoir modier le texte afficher.

16.4 Ajout dune proprit "personnalisable" un WebPart


Pour quune proprit puisse tre utilise par un WebPart, vous devez lui ajouter des attributs, dont certains seront utiles au moment de ldition du WebPart :
j j

WebBrowsable indique si la proprit sera affiche dans lditeur. WebDisplayName dnit le nom convivial de la proprit qui apparatra comme intitul dans lditeur. WebDescription dnit la description utiliser comme info-bulle. Personalizable dtermine si la proprit est "personnalisable" et dans quelle porte.

j j

Voici le code correspondant la proprit Text :


<WebBrowsable(), _ WebDisplayName("Texte"), _ WebDescription("Texte afficher"), _ Personalizable()> _ Public Property Text() As String Get Return m_text End Get Set(ByVal value As String) m_text = value End Set End Property
Le guide du codeur 247

16

WebParts

Maintenant que vous avez un contrle WebPart disposition, vous pouvez ajouter une troisime colonne aux tableaux contenant les zones, qui va servir slectionner les WebParts que vous voulez dposer dans celles-ci et les diter ensuite.

Ajout de WebParts partir dun catalogue


Le contrle CatalogZone contient des contrles de type CatalogPart.

Vous pouvez utiliser cette zone pour crer un catalogue des contrles WebPart que les utilisateurs pourront slectionner et ajouter une page. Lorsque vous cliquez sur le lien Catalogue, le catalogue des WebParts disponibles saffiche. Vous pouvez alors cocher les WebParts que vous voulez insrer et la zone cible.

b Figure 16-5 : Catalogue des WebParts disponibles

Voici une prsentation des diffrents catalogues disponibles.

Contrle DeclarativeCatalogPart
Le contrle DeclarativeCatalogPart permet de proposer un catalogue des contrles WebPart. Vous pouvez y ajouter de faon dclarative les contrles que vous avez implments.
<%@ Register Src="WebPartSample.ascx" TagName="WebPartSample" TagPrefix="uc1" %> <asp:DeclarativeCatalogPart ID="DeclarativeCatalogPart" runat="server"> <WebPartsTemplate> <uc1:WebPartSample ID="WebPartSample1" runat="server" /> </WebPartsTemplate> </asp:DeclarativeCatalogPart>

248 Le guide du codeur

Ajout dune proprit "personnalisable" un WebPart

16

Contrle ImportCatalogPart
Le contrle ImportCatalogPart permet dimporter un chier de description pour un contrle WebPart, an que les utilisateurs puissent ajouter le contrle une page web avec des paramtres prdnis. Ces chiers de description possdent une extension .webpart.

Contrle PageCatalogPart
Le contrle PageCatalogPart est un catalogue qui conserve les rfrences tous les contrles WebPart quun utilisateur a ferms sur la page WebPart en cours an de lui permettre de restaurer les contrles quil a supprims.

Manipulation dun contrle WebPart


Vous pouvez enn dcouvrir les diffrentes fonctionnalits dun WebPart une fois quil a t ajout dans une zone. En mode normal, le contrle prend quasiment toute la place en largeur puisque la seconde zone est vide.

m Figure 16-6 : Page en mode normal

Le WebPart dispose de plusieurs actions possibles accessibles notamment partir b Figure 16-7 : dun menu et qui varient selon le mode Menu par dfaut daffichage en cours. Une icne droite du WebPart permet dafficher ce menu. Il contient toujours un lien Fermer qui supprime le WebPart de la zone mme si vous pouvez le rcuprer partir du catalogue de pages. Le lien Rduire permet dafficher uniquement la barre de titre. Le texte de ce lien devient alors Restaurer et permet de rafficher la totalit du contenu du WebPart.

b Figure 16-8 : Lien Restaurer

La fonctionnalit la plus visuelle et la plus simple dutilisation est le dplacement des WebParts entre les zones ou lintrieur dune mme zone. Pour cela, vous devez tre en mode Design. En cliquant sur la barre de titre sans relcher le bouton, vous pouvez faire glisser une copie transparente du WebPart ; une barre qui apparat au survol dune zone accessible indique quel endroit vous pouvez le dposer.

Le guide du codeur 249

16

WebParts

m Figure 16-9 : Dplacement dun WebPart

Dans ce mode, un lien Supprimer est prsent dans le menu et permet de supprimer dnitivement le contrle de la page.
b Figure 16-10 : Lien Supprimer

dition dun contrle WebPart


Le contrle EditorZone correspond la zone charge de ldition dun WebPart. Vous pouvez utiliser cette zone pour permettre aux utilisateurs de modier et de personnaliser les contrles WebPart dune page. En mode Edit, le lien diter du menu sert afficher les diteurs dclars lintrieur de la balise <ZoneTemplate> du contrle EditorZone.

b Figure 16-11 : Lien diter

Il contient des contrles de type EditorPart dont voici un aperu.

PropertyGridEditorPart
Le contrle PropertyGridEditorPart permet de modier des proprits personnalises dun contrle WebPart. Le contrle de saisie associ dpend du type de la proprit. Par exemple, une chane de caractres sera modiable laide dune TextBox tandis quun boolen sera reprsent par une CheckBox et une numration pourra avoir une DropDownList.

250 Le guide du codeur

Ajout dune proprit "personnalisable" un WebPart

16

b Figure 16-12 : diteur des proprits personnalises

AppearanceEditorPart
Le contrle AppearanceEditorPart permet de modier plusieurs proprits dinterface utilisateur relatives lapparence dun contrle WebPart, comme sa taille ou son titre.

b Figure 16-13 : diteur des proprits dapparence

LayoutEditorPart
Le contrle LayoutEditorPart permet de modier plusieurs proprits dinterface utilisateur concernant la disposition dun contrle WebPart dans une zone.

b Figure 16-14 : diteur des proprits de disposition

Le guide du codeur 251

16

WebParts

BehaviorEditorPart
Le contrle BehaviorEditorPart permet de modier plusieurs proprits dinterface utilisateur concernant le comportement et les autorisations dun contrle WebPart.

b Figure 16-15 : diteur des proprits de comportement

16.5 Check-list
Votre page de WebParts est maintenant termine. Les WebParts fournissent des fonctionnalits extrmement puissantes permettant de crer des applications que lutilisateur peut personnaliser. Voici les concepts et les fonctionnalits prsents dans ce chapitre :
j j j j j j j j

crer une page de WebParts ; ajouter des contrles WebPartZone une page ; basculer entre les diffrents modes daffichage ; transformer un contrle utilisateur en WebPart ; ajouter une proprit "personnalisable" un WebPart ; manipuler les WebParts (actions, disposition) ; ajouter un catalogue de WebParts (CatalogZone) ; ajouter des diteurs de WebParts (WebPartZone).

252 Le guide du codeur

Ch apit re

17 Stockage dinformations dans un profil


Classes et espaces de noms utiliss ............. Conguration ............................................ Persistance des donnes ............................ Check-list .................................................. 254 255 259 264

17

Stockage dinformations dans un prol

Dans de nombreuses applications qui grent des utilisateurs, il faut stocker des informations diffrentes sur chacun dentre eux. La personnalisation dune application ncessite certains dveloppements. Vous devez stocker les informations laide dun identiant dutilisateur unique, reconnatre des utilisateurs lorsquils reviennent sur le site, puis extraire les informations ncessaires leur sujet. Pour faciliter vos dveloppements, vous pouvez utiliser la fonctionnalit de prol ASP .NET, qui permet de grer la totalit de ces tches en toute transparence. La fonctionnalit de prol ASP .NET associe des informations un utilisateur donn et les stocke sous un format persistant. Elle permet de les grer facilement sans quil soit ncessaire de crer ou de grer une base de donnes personnelle. Elle les met votre disposition laide dune classe qui contient des proprits fortement types, auxquelles vous pouvez accder facilement depuis nimporte quel endroit de votre application. Elle permet en outre de stocker des objets de tout type en srialisant ces objets en binaire ou en XML. Il sagit dune fonction de stockage gnrique.

17.1 Classes et espaces de noms utiliss


La classe System.Web.Profile.ProfileBase hrite de SettingsBase fournit le modle respecter si vous voulez dvelopper votre propre fournisseur de prols. Voici les proprits hrites et ajoutes :
Proprits de la classe System.Web.Prole.ProleBase Proprit Description

Context IsAnonymous IsDirty Item

Obtient le contexte de paramtres associ. Obtient une valeur qui indique si le prol utilisateur est destin un utilisateur anonyme. Obtient une valeur qui indique si lune des proprits de prol a t modie. Substitu (hrit de la classe de base). Obtient ou dnit une valeur de proprit de prol indexe par le nom de proprit. Obtient la date et lheure de dernire lecture ou de modication du prol. Obtient la date et lheure de dernire modication du prol. Obtient une collection dobjets SettingsProperty pour chaque proprit dans le prol.

LastActivityDate LastUpdatedDate Properties

254 Le guide du codeur

Conguration

17

Proprits de la classe System.Web.Prole.ProleBase Proprit Description

PropertyValues Providers UserName

Obtient une collection de valeurs de proprit de paramtre. Obtient une collection de fournisseurs de paramtres. Obtient le nom dutilisateur du prol.

17.2 Conguration
La section profile du chier Web.config se compose dune collection de proprits dont il faut conserver les valeurs et dune collection de fournisseurs personnaliss. Son prototype se prsente comme suit :
<profile defaultProvider="SqlProvider"> <providers> </providers> <properties> </properties> </profile>

Les tableaux suivants prsentent les syntaxes et les attributs que vous pouvez employer pour congurer vos proprits et vos fournisseurs de prols :
Attributs de llment prole Attribut Description

enabled

Attribut Boolean facultatif. Valeur par dfaut : true. Spcie si les prols utilisateurs ASP .NET sont activs. Ils le sont si la valeur est true. Attribut String facultatif. Valeur par dfaut : AspNetSqlProfileProvider. Spcie le nom du fournisseur de prols par dfaut. Attribut String facultatif. Contient une rfrence de type pour un type personnalis qui drive de la classe abstraite ProfileBase. Une classe ProfileCommon qui hrite de ce type est gnre dynamiquement et enregistre dans la proprit Profile du HttpContext en cours.

defaultProvider

inherits

Le guide du codeur 255

17

Stockage dinformations dans un prol

Attributs de llment prole Attribut Description

automaticSaveEnabled

Attribut Boolean facultatif. Valeur par dfaut : true. Indique si le prol utilisateur est automatiquement enregistr la n de lexcution dune page ASP .NET. Il lest si la valeur est true. Lobjet ProfileModule enregistre un prol utilisateur uniquement si le module dtecte que le prol a t modi, en dautres termes si la proprit IsDirty est true.

Dclaration dune proprit de prol


La dclaration dune proprit de prol se fait dans le chier de conguration de lapplication, Web.config. Dans la section profile, crez une section properties qui va contenir la liste des proprits attribuer au prol des utilisateurs. Lajout dune proprit se fait de manire simple : insrez au minimum une balise add, en spciant le nom de la proprit ajouter grce lattribut name. Le type par dfaut dune proprit est la chane de caractres (string). Si vous avez besoin dun autre type, pour spcier lge de lutilisateur par exemple, servez-vous de lattribut type et spciez le type dsir, par exemple System.Int32. Exemple :
<properties> <add name=Age type=System.Int32 /> <add name=Adresse/> </properties>

Voici la syntaxe gnrale de dclaration de proprits de prol :


<properties> <add... /> <clear /> <remove... /> <group name="group name">...</group> </properties> <add name="Nom de la proprit" type="Type de la proprit" provider="Provider" serializeAs="String|Xml|Binary|Personnalis" allowAnonymous="true|false" defaultValue="Valeur par dfaut" readOnly="true|false"/> />

256 Le guide du codeur

Conguration

17

Attributs de llment <add> de la collection properties de llment prole Attribut Description

name

Attribut String requis. Spcie le nom de la proprit. Cette valeur est utilise comme nom de la proprit pour la classe de prol gnre automatiquement et comme valeur dindex pour la proprit dans la collection Properties. Le nom de la proprit ne peut pas contenir de point. Attribut String facultatif. Valeur par dfaut : String. Spcie le type de la proprit. Attribut String facultatif. Spcie le fournisseur de prols utilis pour stocker et rcuprer des valeurs de la proprit. La valeur de lattribut provider est le nom de lun des fournisseurs de prols spcis dans llment providers. Si aucun nom de fournisseur nest spci, le fournisseur par dfaut spci dans llment profile est utilis. Attribut facultatif. Spcie le format de srialisation de la valeur de proprit dans le magasin de donnes. Le format de srialisation utilis par dfaut est spcique au fournisseur. Cest le fournisseur qui dtermine la srialisation utilise, savoir la srialisation String ou Binary dans le cas du fournisseur SQL. Attribut Boolean facultatif. Valeur par dfaut : false. Spcie si la proprit peut tre obtenue ou dnie, si lutilisateur de lapplication est anonyme. Attribut String facultatif. Spcie la valeur par dfaut, en labsence dune valeur de la proprit Profile. Attribut Boolean facultatif. Valeur par dfaut : false. Spcie si la proprit est en lecture seule.

type provider

serializeAs

allowAnonymous

defaultValue

readOnly

Dclaration dun fournisseur de prols personnalis


Si vous voulez utiliser une autre chane de connexion ou personnaliser votre fournisseur de prols, vous pouvez en ajouter un. Spciez ensuite dans llment profile parent quil sagit du fournisseur par dfaut en donnant son nom lattribut defaultProvider.

Le guide du codeur 257

17

Stockage dinformations dans un prol

Ajouter un fournisseur ou rednir celui par dfaut Il est fortement conseill de toujours ajouter un fournisseur ou de rednir celui par dfaut, ne serait-ce que pour spcier lattribut applicationName : donnezlui le nom correspondant lapplication que vous dveloppez. Cela est notamment indispensable si vous utilisez une seule base de donnes pour grer plusieurs applications.

<add name="SqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ConnectionString" applicationName="Application" description="Description" />


Attributs de llment <add> de la collection providers de llment prole Attribut Description

name

Attribut String requis. Spcie le nom de linstance de fournisseur. Il sagit de la valeur utilise par lattribut defaultProvider de llment <profile> pour dsigner linstance de fournisseur comme fournisseur de prols par dfaut. name est galement utilis pour indexer le fournisseur dans la collection Providers. Attribut String requis. Spcie le type qui implmente la classe de base abstraite ProfileProvider. Attribut String requis. Spcie le nom dune chane de connexion dnie dans llment <connectionStrings>. La chane de connexion spcie sera utilise par le fournisseur qui est ajout. Attribut String facultatif. Spcie le nom de lapplication sous laquelle les donnes de prol sont stockes dans la source de donnes. Le nom dapplication permet plusieurs applications ASP. NET dutiliser la mme base de donnes sans rencontrer de donnes de prol en double. Plusieurs applications ASP .NET peuvent galement utiliser les mmes informations de prol si lon spcie le mme nom dapplication. Les fournisseurs de prols inclus dans le Framework .NET utilisent la valeur ApplicationPath pour la proprit ApplicationName si cet attribut nest pas spci.

type

connectionStringName

applicationName

258 Le guide du codeur

Persistance des donnes

17

Attributs de llment <add> de la collection providers de llment prole Attribut Description

commandTimeout

Attribut Int32 facultatif. Valeur par dfaut (pour ADO .NET) : 30. Spcie le nombre de secondes avant lexpiration du dlai imparti une commande envoye la source de donnes dappartenance. Attribut String facultatif. Spcie une description de linstance de fournisseur de prols.

description

17.3 Persistance des donnes


Maintenant que vous savez dclarer des prols au sein de votre application, vous devez mettre en place la persistance des informations quils contiennent, les sauvegarder an quelles puissent tre rcupres ultrieurement par ASP .NET lorsque lutilisateur se connectera votre site ou lorsque vous les afficherez. Cette persistance seffectue grce des fournisseurs de donnes spcialiss dans la sauvegarde de donnes lies aux prols. Ces classes hritent toutes de System.Configuration.SettingsProvider.
Membres de la classe System.Conguration.SettingsProvider Mthode Description

GetPropertyValues

Prend en paramtre des objets SettingsContext et SettingsPropertyCollection. SettingsContext fournit des informations sur lutilisateur. Vous pouvez les utiliser comme cl primaire pour rcuprer des informations de proprit de prol sur lutilisateur. Servez-vous de lobjet SettingsContext pour obtenir le nom de lutilisateur et pour savoir sil est authenti ou anonyme. SettingsPropertyCollection contient une collection dobjets SettingsProperty. Chaque objet SettingsProperty fournit le nom et le type de la proprit, ainsi que des informations supplmentaires, comme la valeur par dfaut de la proprit et si elle est ou non en lecture seule. La mthode GetPropertyValues remplit SettingsPropertyValueCollection avec les objets SettingsPropertyValue tablis daprs les objets SettingsProperty utiliss comme entre.

Le guide du codeur 259

17

Stockage dinformations dans un prol

Membres de la classe System.Conguration.SettingsProvider Mthode Description

Les valeurs de la source de donnes sur lutilisateur spci sont affectes aux proprits PropertyValue de chaque objet SettingsPropertyValue et la collection entire est retourne. Lappel de cette mthode met galement jour la valeur LastActivityDate du prol utilisateur spci, avec la date et lheure courantes.
SetPropertyValues

Prend en paramtre des objets SettingsContext et SettingsPropertyValueCollection. SettingsContext fournit des informations sur lutilisateur. Vous pouvez les utiliser comme cl primaire pour rcuprer des informations de proprit de prol sur lutilisateur. Servez-vous de lobjet SettingsContext pour obtenir le nom de lutilisateur et pour savoir sil est authenti ou anonyme. SettingsPropertyValueCollection contient une collection dobjets SettingsPropertyValue. Chaque objet SettingsPropertyValue fournit le nom, le type et la valeur de la proprit, ainsi que des informations supplmentaires, comme la valeur par dfaut de la proprit et si elle est ou non en lecture seule. La mthode SetPropertyValues met jour les valeurs des proprits de prol dans la source de donnes sur lutilisateur spci. Lappel de cette mthode met galement jour les valeurs LastActivityDate et LastUpdatedDate du prol utilisateur spci, avec la date et lheure courantes.

SettingsProvider est une classe dassez bas niveau. Crer une classe hritant de celle-ci demanderait pas mal de travail. Cest pourquoi Microsoft propose une classe abstraite plus spcialise, nomme System.Web.Profile.Profile Provider. Ainsi si vous souhaitez crer votre propre fournisseur de donnes, vous navez qu crer une classe hritant de ProfileProvider et implmenter la logique technique correspondant votre besoin (stockage dans Oracle, dans un chier plat).

Bien videmment, Microsoft ne vous oblige pas crer votre propre fournisseur de donnes chaque fois que vous souhaitez implmenter une gestion de prols, et propose un fournisseur de donnes par dfaut nomm System.Web.Profile.SqlProfileProvider. Celui-ci permet denregistrer les donnes lies aux prols directement dans une base de donnes SQL Server, qui peut tre cre laide dun Assistant.

260 Le guide du codeur

Persistance des donnes

17

La fonctionnalit de prol ASP .NET utilise la mme structure base de fournisseur que celle utilise par lappartenance (la gestion des membres), la gestion des rles ou dautres fonctionnalits ASP .NET. Elle sappuie sur des fournisseurs de prols pour effectuer les tches principales (stocker et rcuprer les valeurs des proprits de prol entre autres).

Fournisseur de prols
ASP .NET comprend un fournisseur de prols qui stocke des donnes laide dune base SQL Server. La conguration ASP .NET par dfaut de lordinateur contient et utilise une instance de SqlProfileProvider nomme AspNetSqlProfileProvider. Vous pouvez spcier un fournisseur par dfaut diffrent dans le chier Web.config de votre application. Pour utiliser le SqlProfileProvider, vous devez crer la base de donnes SQL Server dont il a besoin. En ce sens, excutez le programme Aspnet_regsql.exe qui se trouve dans le rpertoire C:\WINDOWS\Microsoft.NET\Framework\ v2.0.50727. Lorsque vous excutez cet outil, spciez loption Ap pour activer la fonctionnalit de prol sur une base de donnes et ainsi stocker des prols ASP .NET laide du SqlProfileProvider.

Utilisateurs anonymes
Les prols peuvent galement fonctionner avec des utilisateurs anonymes. La prise en charge des prols anonymes ntant pas active par dfaut, vous devez lactiver explicitement. De plus, lorsque vous dnissez des proprits de prol dans le chier Web.config, vous devez les rendre explicitement accessibles pour les utilisateurs anonymes individuellement. Les proprits de prol ne prennent pas en charge laccs anonyme par dfaut. Si lidentication anonyme est active, ASP .NET cre une identication unique pour les utilisateurs la premire fois quils visitent votre site. Lidentication utilisateur unique est stocke dans un cookie sur lordinateur du visiteur an que ce dernier puisse tre identi chaque demande de page.
<anonymousIdentification enabled="[true | false]" cookieless= "[UseUri | UseCookies | AutoDetect | UseDeviceProfile]" cookieName="" cookiePath="" cookieProtection="[None | Validation | Encryption | All]" cookieRequireSSL="[true | false]" cookieSlidingExpiration="[true | false]" cookieTimeout="[DD.HH:MM:SS]"

Le guide du codeur 261

17

Stockage dinformations dans un prol

/>

domain="domaine.ext"

Attributs de llment anonymousIdentication Attribut Description

cookieless

Spcie sil faut utiliser des cookies dans une application web. Lnumration HttpCookieMode permet de spcier la valeur de cet attribut dans la section de conguration. Elle est utilise par toutes les fonctionnalits qui prennent en charge lauthentication sans cookie. Lorsque la valeur AutoDetect est spcie, ASP .NET interroge le navigateur ou le priphrique pour dterminer sil prend en charge les cookies. Si cest le cas, ces derniers sont utiliss pour rendre les donnes utilisateurs persistantes ; sinon, un identicateur est saisi dans la chane de requte. Cet attribut peut avoir lune des valeurs suivantes : Valeur, Description. AutoDetect : indique que ASP .NET doit dterminer si le navigateur ou le priphrique lorigine de la demande prend en charge des cookies. Si cest le cas, AutoDetect utilise des cookies pour rendre les donnes utilisateurs persistantes ; sinon, un identicateur est saisi dans la chane de requte. Si le navigateur ou le priphrique prend en charge les cookies alors quils sont actuellement dsactivs, ils sont nanmoins utiliss par la fonctionnalit qui effectue la demande. UseCookies : spcie que les cookies doivent tre utiliss pour rendre les donnes utilisateurs persistantes, que le navigateur ou le priphrique prenne en charge ou non les cookies. Il sagit de loption par dfaut. UseDeviceProfile : indique que ASP .NET doit dterminer sil faut utiliser des cookies sur la base du paramtre HttpBrowserCapabilities. Si le paramtre indique que le navigateur ou le priphrique prend en charge les cookies, ces derniers sont employs ; sinon, un identicateur est utilis dans la chane de requte. UseUri : indique que la fonctionnalit appelante doit utiliser la chane de requte pour stocker un identicateur, que le navigateur ou le priphrique prenne en charge ou non les cookies. Valeur par dfaut : UseCookies. Valeur par dfaut : .ASPXANONYMOUS. Spcie le nom du cookie.

cookieName

262 Le guide du codeur

Persistance des donnes

17

Attributs de llment anonymousIdentication Attribut Description

cookiePath

Valeur par dfaut : le rpertoire racine spci par "/". Spcie le chemin daccs au rpertoire de stockage du cookie. Le chemin daccs respecte la casse. Spcie la mthode de protection contre les cookies. Valeur par dfaut : false. Spcie si le cookie exige une connexion SSL lorsquil est transmis au client. Comme ASP .NET dnit la proprit de cookie dauthentication, Secure, le client ne retourne pas le cookie moins quune connexion SSL soit utilise. Spcie si le dlai dexpiration dun cookie est rinitialis chaque demande ou selon un intervalle de temps xe prdni. Si la valeur est true, le cookie expire lorsquil reste moins de 50 % de dure de vie (TTL, Time-ToLive). Si la valeur est false, le cookie expire une fois la dure cookieTimeout coule.

cookieProtection cookieRequireSSL

cookieSlidingExpiration Attribut Boolean requis. Valeur par dfaut : true.

cookieTimeout

Attribut TimeSpan requis. Valeur par dfaut : 10 000 minutes. Spcie le dlai dexpiration dun cookie en minutes. Valeur par dfaut : une chane vide (""). Spcie le domaine du cookie. Cet attribut autorise le partage du cookie didentication anonyme entre les domaines qui disposent dun espace de noms DNS commun. Les sites doivent alors partager des cls de dchiffrement et de validation. Dautres attributs de conguration de lidentication anonyme, tels que le chemin daccs et le nom du cookie, doivent tre identiques pour tous les sites. Attribut Boolean facultatif. Valeur par dfaut : false. Spcie si lidentication anonyme est active. Si la valeur est true, un cookie (ou une valeur sans cookie) est utilis pour grer lidenticateur anonyme de lutilisateur.

domain

enabled

Migration des informations de prol anonyme


Dans certains cas, une proprit de prol doit tre accessible pour les utilisateurs anonymes. Il peut tre utile de stocker des informations de prols pour les visiteurs dun site web, notamment lorsque lon souhaite implmenter une gestion de paniers. Par exemple, les sites de-commerce proposent tous

Le guide du codeur 263

17

Stockage dinformations dans un prol

leurs utilisateurs, de rajouter des produits un panier, ces utilisateurs devant sauthentier avant de valider leur commande. La difficult consiste faire migrer les informations dun prol anonyme vers un prol utilisateur au moment o celui-ci se connecte. Vous pouvez grer lvnement MigrateAnonymous dans le chier Global.asax pour effectuer une migration des informations de lidentit anonyme de lutilisateur vers la nouvelle identit authentie. Lexemple de code suivant montre comment effectuer une migration des informations au moment o lutilisateur sauthentie :
Public Sub Profile_OnMigrateAnonymous( _ sender As Object, args As ProfileMigrateEventArgs) Migration vers le profil authentifi. Dim anonymousProfile As ProfileCommon = _ Profile.GetProfile(args.AnonymousID) Profile.PropertyName = anonymousProfile.PropertyName Suppression du profil anonyme. ProfileManager.DeleteProfile(args.AnonymousID) AnonymousIdentificationModule.ClearAnonymousIdentifier() End Sub

17.4 Check-list
Les diffrentes utilisations de la fonctionnalit de prol ASP .NET prsentes ici montrent quel point il est simple de stocker des informations sur un utilisateur et de les rcuprer. Dans ce chapitre, vous avez appris :
j j

stocker des informations sur un client ; faire migrer des informations dun prol anonyme.

264 Le guide du codeur

Ch apit re

18 Site web avec slecteur de thmes


Mise en forme des contrles serveurs .......... Thmes .................................................... Appliquer un thme .................................... Stocker un thme par utilisateur .................. Rsultat nal ............................................ Check-list .................................................. 266 272 276 277 280 280

18

Site web avec slecteur de thmes

Le graphisme des pages est un lment important dun site et doit faire appel dautres comptences que celles dun dveloppeur, cest--dire celles dun designer ou dun intgrateur. Ces mtiers sont de plus en plus amens cohabiter dans le cas de la construction dune application web. Pour que leurs rles soient clairement dnis, il est donc indispensable de sparer la prsentation et le code proprement parler. La fonctionnalit de thmes introduite avec le Framework 2.0 va vous aider regrouper les chiers spciques au graphisme dans un rpertoire spar et faire hriter vos pages et vos contrles dun thme visuel. Dans ce chapitre, vous apprendrez connatre les notions associes la fonctionnalit de thmes ASP .NET, crer vos propres thmes et donner une apparence par dfaut vos pages et vos contrles.

18.1 Mise en forme des contrles serveurs


Avant dexpliquer les thmes, il est ncessaire de prsenter les diffrentes faons de mettre en forme un contrle serveur. Certains moyens sont plus simples que dautres a priori, mais au nal, ils peuvent alourdir le code inutilement et devenir difficilement congurables. Nous allons vous prsenter les diffrentes techniques, ce qui vous permettra de mieux comprendre comment cela fonctionne et de faire votre choix parmi elles.

Proprits de style
La mthode la plus simple pour personnaliser rapidement lapparence de vos contrles est de congurer les proprits de style. Celles-ci sont un quivalent des attributs des balises HTML qui servent reprsenter le contrle.

dition de proprits de contrle en mode Source


En mode Source, la fonctionnalit dIntellisense est accessible lorsque vous commencez modier la balise asp.net correspondant au contrle serveur et propose toutes les proprits disponibles par ordre alphabtique (voir Figure 18-1). Lorsquil sagit de proprits boolennes ou dnumration, lditeur propose en plus lensemble des valeurs possibles une fois saisi le caractre =. Vous naurez qu cliquer sur la valeur dsire pour laffecter la proprit, ce qui vous vitera notamment de faire une erreur de saisie (voir Figure 18-2).

266 Le guide du codeur

Mise en forme des contrles serveurs

18

b Figure 18-1 : Liste des proprits dun contrle dune page aspx en mode Source grce lIntellisense

m Figure 18-2 : Liste des valeurs possibles dune proprit dun contrle

dition de proprits de contrle en mode Design


En mode Design, lditeur de proprits est encore plus simple. Il permet de trouver la proprit personnaliser et den modier la valeur.

m Figure 18-3 : Fentre Proprits dun contrle dune page aspx en mode Design

Options de Visual Studio


Visual Studio possde des options intressantes relatives lditeur HTML en mode Source, cest--dire celui que vous utilisez pour les pages ou les contrles utilisateurs aspx. Pour congurer ces options, ouvrez la bote de dialogue

Le guide du codeur 267

18

Site web avec slecteur de thmes

correspondante en slectionnant la commande Options du menu Outils. Les options relatives aux diffrents diteurs se trouvent dans le menu diteur de texte.

m Figure 18-4 : Options de Visual Studio relatives lditeur HTML

Options de formatage Si toutes les options ne sont pas affiches, cochez la case Afficher toutes les options en bas de la fentre. Elle permet dafficher et de masquer les options les plus frquemment utilises.
La commande Insrer des guillemets de valeur dattributs lors de la saisie du menu diteur de texte/HTML/Format active une fonctionnalit qui ajoute automatiquement des guillemets une fois saisi le caractre = la suite dune proprit de contrle. Cela peut paratre anodin, mais ce genre doption daide la saisie permet damliorer considrablement la productivit. Il est parfois plus rapide dcrire une proprit que daffecter une valeur partir du mode Design.

Options communes tous les diteurs Le menu diteur de texte/Basic permet de spcier des options communes tous les diteurs, comme laffichage des numros de ligne ou le retour automatique la ligne.

268 Le guide du codeur

Mise en forme des contrles serveurs

18

La plupart des options de cette fentre servent notamment lors de la mise en forme du document. Cette fonctionnalit extrmement pratique permet de rorganiser les contrles de la page selon les rgles de mise en forme spcies. Elle est accessible partir du menu Edition/Avac : Vous pouvez galement y accder partir dun bouton de la barre doutils Modification de la source HTML : Si vous voulez aller plus loin dans la personnalisation des options de formatage ou comprendre quels choix de formatage ont t faits pour chaque contrle ou balise HTML, cliquez sur le bouton Options spciques pour les balises. Il ouvre une fentre partir de laquelle vous pourrez visualiser et congurer tous ces choix. Une arborescence permet de naviguer facilement dans la hirarchie des contrles et de dcouvrir pour chacun dentre eux les options qui lui sont affectes. Un aperu qui montre le rendu gnr par les options slectionnes est galement affich.

m Figure 18-5 : Fentre Options spciques pour les balises

Le guide du codeur 269

18

Site web avec slecteur de thmes

Selon les paramtres par dfaut, les balises qui ne contiennent aucun contrle enfant sont fermes automatiquement alors que les balises avec contenu ont une balise de fermeture distincte. Par ailleurs, des sauts de ligne sont effectus dans certains cas. Enn, le mode Plan (bouton de dveloppement et de rduction) est activ pour des contrles qui sont dclars sur trois lignes ou plus.
b Figure 18-6 : Activation du mode Plan pour les balises de plus de trois lignes

Options de validation Le menu diteur de texte/HTML/Validation permet de slectionner le schma de validation que les pages doivent vrier et respecter. Des erreurs seront affiches si votre code ne respecte pas ce schma et les options de validation associes.

m Figure 18-7 : Fentre de slection du schma de validation

Personnaliser un environnement de dveloppement Nhsitez pas parcourir lensemble des options de Visual Studio an de congurer votre environnement de dveloppement selon vos souhaits.

270 Le guide du codeur

Mise en forme des contrles serveurs

18

Mise en forme automatique


La plupart des contrles serveurs volus disposent dun Assistant de mise en forme automatique. En mode Design, un smart tag permet douvrir cet Assistant.
b Figure 18-8 : Smart tag de mise en forme automatique dun contrle

Une bote de dialogue souvre alors et propose plusieurs styles prcongurs. La slection dun style permet de visualiser le rendu que vous obtiendrez.

b Figure 18-9 : Bote de dialogue Mise en forme automatique

Les proprits de style du contrle associ sont affectes en accord avec lapparence qui a t slectionne. Un contrle Login par exemple ressemblera ce qui suit une fois slectionne lapparence :
<asp:Login ID="Login1" runat="server" BorderColor="#E6E2D8" BorderPadding="4" BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#333333"> <TitleTextStyle BackColor="#5D7B9D" Font-Bold="True" Font-Size="0.9em" ForeColor="White" /> <InstructionTextStyle Font-Italic="True" ForeColor="Black" /> <TextBoxStyle Font-Size="0.8em" /> <LoginButtonStyle BackColor="#FFFBFF" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#284775" /> </asp:Login>

Le guide du codeur 271

18

Site web avec slecteur de thmes

Cette technique nest pas conseille puisquelle est en dsaccord avec notre volont de sparer la prsentation et le code et de diminuer le poids des pages grce lutilisation de feuilles de styles CSS.

18.2 Thmes
Un thme permet de dnir lapparence des pages et des contrles puis de lappliquer de manire cohrente sur les pages dune application web. Les thmes sont stocks dans un rpertoire particulier du site nomm App_Themes. Chaque dossier situ la racine constitue un thme. Pour ajouter ce rpertoire, cliquez du bouton droit sur le site dans lExplorateur de solutions puis slectionnez Thme dans le menu Ajouter le dossier ASP.NET.

b Figure 18-10 : Ajout du dossier App_Themes

Un thme sert paramtrer de manire globale, et dans des chiers spars, les proprits des contrles qui apparaissent dans les pages. Il peut contenir des feuilles de style CSS, des images et des chiers dapparence.

Fichiers dapparence
Un chier dapparence a lextension .skin et contient les paramtres de proprit des contrles serveurs. Les paramtres dapparence de contrle sont semblables au balisage du contrle lui-mme, mais contiennent uniquement les proprits que vous souhaitez dnir dans le cadre du thme. Par exemple, lapparence suivante reprsente lapparence de contrle du contrle Button :
<asp:button runat="server" BackColor="lightblue" ForeColor="black" />

Vous crez des chiers .skin dans le rpertoire de votre thme. Un chier .skin peut contenir une ou plusieurs skins de contrle pour un ou plusieurs types de contrles. Vous pouvez ainsi dnir les skins dans un chier spar pour chaque contrle ou dnir toutes les skins dun thme dans un seul chier. Vous tes libre de dnir soit une apparence par dfaut, soit une apparence nomme pour un contrle grce lattribut SkinId.

272 Le guide du codeur

Thmes

18

Apparence par dfaut et apparence nomme


Une apparence par dfaut ne possde pas dattribut SkinID et sapplique automatiquement tous les contrles du mme type lorsquun thme est appliqu une page.

Aucun hritage dapparence entre un contrle parent et enfant Les apparences par dfaut sont mises en correspondance exacte par type de contrle. Cela signie quil ny a aucun hritage dapparence pour un contrle qui driverait dun type de contrle auquel on aurait affect un thme. Cela vite par exemple quun contrle LinkButton hrite de lapparence dun contrle Button.

Une apparence nomme est une apparence de contrle dote dun ensemble de proprits SkinID. Les apparences nommes ne sappliquent pas automatiquement aux contrles. Vous devez affecter explicitement une apparence nomme un contrle en dnissant la proprit SkinID du contrle. La cration dapparences nommes permet ainsi de dnir diffrentes apparences pour plusieurs instances dun mme type de contrle.

Cration dun chier dapparence


La bote de dialogue dajout de chier dans un dossier de thmes permet dajouter des chiers CSS mais aussi des chiers dapparence .skin. Pour afficher cette bote de dialogue, cliquez du bouton droit sur le dossier du thme et slectionnez la commande Ajouter un nouvel lment.

m Figure 18-11 : Ajout dun chier dapparence (.skin) un thme

Le guide du codeur 273

18

Site web avec slecteur de thmes

Copiez ensuite le code prcdent en enlevant toutes les proprits non Themeable les proprits non lies la mise en forme - , comme lidentiant du contrle, mais en gardant runat="server" qui est indispensable. Vous pouvez ensuite supprimer la mise en forme du contrle grce au premier style de lAssistant de mise en forme nomm Supprimer la mise en forme. Il supprimera proprement lensemble des proprits quil avait ventuellement ajoutes auparavant. Tous les contrles du mme type contenus dans une page avec ce thme ressembleront ainsi au modle que vous venez de spcier.

diteur de chiers dapparence


Par dfaut, aucun diteur nest associ aux chiers dapparence. Cela a notamment pour consquence que lIntellisense nest pas disponible et que les erreurs dorthographe sur les noms de proprit ou les valeurs ne sont pas releves. Heureusement, il est possible dassocier nimporte quelle extension un diteur spcique. Vous pouvez ainsi utiliser lditeur de contrle utilisateur qui vous apportera toutes les fonctionnalits qui vous manquaient. Pour cela, ouvrez la fentre des options puis slectionnez le menu diteur de texte/ Extension de chier.

m Figure 18-12 : Ajout dun diteur aux chiers dextension .skin

Vous pouvez alors ajouter lextension .skin et lassocier lditeur de contrle utilisateur.

274 Le guide du codeur

Thmes

18

Feuilles de style en cascade


Un thme peut galement contenir des feuilles de style en cascade (chier .css). Lorsque vous placez un chier .css dans le rpertoire des thmes, la feuille de style est ajoute automatiquement la balise Head dune page associe ce thme.

Diffrences entre les thmes et les feuilles de style


Les thmes sont semblables aux feuilles de style CSS car tous deux servent congurer lapparence des lments des pages. Cependant, les thmes ont la particularit de pouvoir dnir plusieurs proprits dun contrle ou dune page, et pas seulement les proprits de style.

Utilisation de la proprit CssClass En affectant la proprit CssClass des contrles, vous pouvez facilement dnir une apparence globale tout en gardant des pages conformes aux standards CSS.

Association dimages aux proprits


Les thmes peuvent galement contenir des images. Certaines proprits de contrle sont en effet relies au chemin daccs vers une image, comme les boutons dun TreeView, le sparateur dun SiteMapPath ou les boutons dun Login. De manire gnrale, les chiers de ressources du thme se trouvent dans le mme dossier que les chiers dapparence de ce mme thme, mais elles peuvent aussi tre stockes un autre emplacement de lapplication web, comme un sous-dossier du rpertoire des thmes. Pour faire rfrence un chier de ressources dun sous-dossier du rpertoire des thmes, utilisez un chemin daccs similaire celui reprsent pour la dnition de lapparence de ce contrle Image :
<asp:Image runat="server" ImageUrl="Theme/img.gif" />

Vous pouvez aussi stocker vos chiers de ressources en dehors du rpertoire des thmes. Si vous utilisez le caractre tilde (~) pour faire rfrence aux chiers de ressources, vous pouvez spcier un chemin daccs relatif par rapport la racine :
<asp:Image runat="server" ImageUrl="~/Images/img.gif" />

Le guide du codeur 275

18

Site web avec slecteur de thmes

Proprits dnies laide de thmes


Vous ne pouvez dnir que les proprits ayant un attribut ThemeableAttribute dot de la valeur true dans la classe du contrle. Les proprits qui spcient explicitement le comportement du contrle plutt que lapparence naccepte pas de valeurs de thme. Par exemple, vous ne pouvez pas utiliser un thme pour dnir la proprit CommandName dun contrle Button ou la proprit AllowPaging dun contrle GridView. Si vous le faites par curiosit ou par inadvertance, un message derreur explicite vous le rappellera.

18.3 Appliquer un thme


Priorit des paramtres de thme
Si vous dnissez la proprit Theme dune page, les paramtres de contrle du thme et ceux de la page sont fusionns pour former les paramtres du contrle. Si un paramtre de contrle est dni la fois dans le contrle et dans le thme, les paramtres de contrle du thme ont la priorit et remplacent donc tous les paramtres du contrle ventuellement spcis. Cependant, vous pouvez appliquer un thme sous forme de thme de feuille de style en dnissant la proprit StyleSheetTheme de la page. Dans ce cas, les paramtres de page locaux sont prioritaires sur ceux dnis dans le thme lorsque le paramtre est dni aux deux emplacements. Il sagit du modle utilis par les feuilles de style en cascade. Vous pouvez ainsi combiner les deux en appliquant un thme sous forme de thme de feuille de style (StyleSheetTheme) pour pouvoir dnir les proprits de certains contrles de la page tout en appliquant un thme (Theme) pour garder une apparence globale.

Dclarer un thme
Vous pouvez dclarer un thme utiliser dans une page grce lattribut Theme ou StyleSheetTheme de la directive de page. Par exemple :
<%@Page Theme="DefaultTheme" StyleSheetTheme="DefaultStyleSheetTheme" %>

Vous pouvez galement utiliser la section <pages> du chier web.config la racine du site pour affecter un thme par dfaut toutes les pages :
<pages theme="Default" />

276 Le guide du codeur

Stocker un thme par utilisateur

18

Affecter un thme par programmation


La proprit Theme est accessible pour chaque page. Elle permet daffecter par programmation le thme de la page. Le gestionnaire dvnements le plus appropri pour affecter le thme est lvnement PreRender de la page.

Thmes globaux
Un thme global peut tre appliqu tous les sites web dun serveur de sorte dnir une apparence globale. Les thmes globaux sont identiques aux thmes de page puisquils incluent les mmes types de chiers, cest--dire les chiers dapparence, les feuilles de style et les images. La seule diffrence est que thmes globaux sont stocks dans un rpertoire situ sous le rpertoire C:\Inetpub\wwwroot\aspnet_client\ system_web\2_0_50727\Themes spcialement prvu cet effet. Vous pouvez ensuite utiliser un tel thme comme sil tait prsent dans votre site et en faire le thme par dfaut.

Rpertoire des thmes globaux Si vous souhaitez vraiment que tous les sites dun mme serveur aient la mme apparence, vous pouvez dnir la proprit theme de llment <pages> du chier machine.config du rpertoire C:\WINDOWS\Microsoft.NET\Framework\ v2.0.50727 an que le thme sapplique toutes les pages des sites.

18.4 Stocker un thme par utilisateur


Vous allez raliser un site dans lequel lutilisateur pourra choisir lui-mme parmi diffrents thmes et ainsi modier lapparence des pages. Cela peut se faire facilement. Il suffit en effet de crer plusieurs thmes dans le rpertoire App_Themes et de les mettre disposition de lutilisateur pour quil puisse slectionner celui qui lui convient. Il faut ensuite stocker le thme de lutilisateur et laffecter par programmation chaque nouvel appel de page. Le mode de stockage le plus appropri est le cookie, qui a la particularit dtre simple dutilisation, persistant dans le temps et associ au navigateur de la machine cliente. Il est conseill au pralable daffecter un thme par dfaut au cas o lutilisateur naurait pas encore slectionn de thme.

Le guide du codeur 277

18

Site web avec slecteur de thmes

Listage des thmes


Vous pouvez mettre disposition les diffrents thmes dun site laide dun contrle DropDownList. Cette DropDownList sera place dans une page matre que vous pourrez utiliser pour crer toutes vos autres pages. Vous ne dnissez ainsi le code correspondant quune seule fois. Pour rcuprer les thmes disponibles et initialiser la page avec le thme stock dans un cookie, vous pouvez avoir recours au code suivant :
Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load If Not Page.IsPostBack Then Dim vpp As _ System.Web.Hosting.VirtualPathProvider = _ Hosting.HostingEnvironment. _ VirtualPathProvider ddlThemes.DataSource = vpp.GetDirectory _ ("~/App_Themes").Directories ddlThemes.DataTextField = "Name" ddlThemes.DataBind() ddlThemes.SelectedValue = _ My.Request.Cookies("Settings")("Theme") End If End Sub

La liste est ainsi remplie avec les thmes disponibles dans le rpertoire de thmes.
b Figure 18-13 : Liste des thmes

Ajout dun thme global la liste Si vous voulez placer dans cette liste un thme global, vous pouvez ajouter un

ListItem la DropDownList, avec comme valeur le nom du thme, et activer sa proprit AppendDataBoundItems, ce qui introduira cet lment au dbut de la
liste.

Stockage des thmes et affectation du thme slectionn


Vous pouvez activer la proprit AutoPostBack de la DropDownList an quelle dclenche lvnement SelectedIndexChanged au moment de la slection dun thme. Vous ragissez ainsi cet vnement en stockant le choix de lutilisateur :
278 Le guide du codeur

Stocker un thme par utilisateur

18

Protected Sub ddlThemes_SelectedIndexChanged( _ ByVal sender As Object, ByVal e As System.EventArgs) _ Handles ddlThemes.SelectedIndexChanged My.Response.Cookies("Settings")("Theme") = _ ddlThemes.SelectedValue My.Response.Cookies("Settings").Expires = _ Date.Now.AddDays(1) Response.Redirect(Request.RawUrl) End Sub

Initialisation du thme lappel dune page


Vous devez enn initialiser chaque page avec le thme slectionn par lutilisateur. Le moyen le plus simple est dutiliser une classe qui hrite de System.Web.UI.Page, dy insrer le code dinitialisation et den faire hriter toutes vos pages. Comme vous lavez vu prcdemment, linitialisation du thme se fait au moment dun PreRender :
Public Class BasePage Inherits System.Web.UI.Page Protected Sub Page_PreInit(ByVal sender As Object, _ ByVal e As _ System.EventArgs) Handles Me.PreInit If My.Request.Cookies("Settings") Is Nothing Then Dim c As HttpCookie = _ New HttpCookie("Settings") c("Theme") = "Blue" c.Expires = Date.Now.AddDays(1) My.Response.Cookies.Add(c) End If Me.Theme = My.Request.Cookies("Settings")("Theme") End Sub End Class

Pour que toutes vos pages hritent de cette classe de base, utilisez lastuce suivante. Llment page du chier web.config permet de dclarer un attribut qui correspond au nom de la classe dont toutes les autres doivent hriter.
<pages pageBaseType="BasePage"></pages>

Il y a cependant une contrainte importante puisque cet attribut ne fonctionne malheureusement que pour des pages qui dclarent leur code lintrieur mme de la page .aspx, et non pour les pages avec un cher .aspx.vb associ (Code Behind).

Le guide du codeur 279

18

Site web avec slecteur de thmes

18.5 Rsultat nal


Aprs avoir ralis toutes ces tapes, vous avez disposition un site web sur lequel lutilisateur peut choisir un thme sa convenance parmi ceux proposs. Si vous avez correctement spci les styles de chaque contrle que vous utilisez dans vos pages, vous pouvez slectionner les diffrents thmes et voir le rsultat.

b Figure 18-14 : Contrle Login avec le thme Blue

b Figure 18-15 : Contrle Login avec le thme Red

18.6 Check-list
Les thmes ASP .NET sont une nouveaut extrmement utile sils sont utiliss bon escient. Pour crer un thme et lutiliser de la faon la plus optimale dans un site, mieux vaut recourir aux mthodes conseilles dans ce chapitre. En outre, il faut respecter quelques rgles lors de la cration de vos pages, par exemple naffecter aucun style vos contrles et laisser toute personnalisation de laffichage la charge du thme. 1 Cration du thme : ajout du rpertoire App_Themes ; ajout du thme dont le nom de rpertoire correspond au nom du thme. 2 Dclaration du thme par dfaut dans le web.config :
<pages theme="Default" />

3 Ajout de chiers .skin : dclaration des contrles avec leurs proprits CssClass.
280 Le guide du codeur

Check-list

18

4 Ajout de feuilles CSS : utilisation des classes CSS pour affecter le style des contrles. 5 Si vous voulez affecter le mme thme un autre site : ajout du thme dans le rpertoire des thmes globaux :
C:\Inetpub\wwwroot\aspnet_client\system_web\2_0_50727\Themes.

6 Si vous voulez proposer plusieurs thmes lutilisateur : cration des thmes listage des thmes, savoir cration dune Master Page contenant la liste des thmes, puis initialisation de la liste :
ddlThemes.DataSource = _ vpp.GetDirectory("~/App_Themes").Directories

choix du mcanisme de stockage par utilisateur (cookie, session, cache, prol). cration dune page de base : affectation du thme par dfaut la slection :
My.Response.Cookies("Settings")("Theme") = _ ddlThemes.SelectedValue

initialisation du thme lappel dune page :


Me.Theme = My.Request.Cookies("Settings")("Theme")

hritage des toutes les pages la page de base :


<pages pageBaseType="BasePage"></pages>

ou
Partial Class _Default Inherits Base.Page

Le guide du codeur 281

Ch apit re

19
Reprsentation de donnes hirarchiques laide dun contrle TreeView
Contrle TreeView ...................................... 284 Ajouter des nuds un contrle TreeView .... 286 Modier des styles associs aux diffrents types de nuds ................................................. 287 Affecter des images aux nuds ................... 289 Lier des donnes un contrle TreeView ....... 291 Remplir dynamiquement des nuds .............. 292 Check-list .................................................. 298

19

Reprsentation de donnes hirarchiques laide dun contrle TreeView

Laffichage de donnes hirarchiques est un besoin qui apparat souvent lors du dveloppement dune application. Dans ce chapitre, vous allez raliser diffrentes fonctionnalits laide de contrles TreeView qui vous permettront de mieux apprcier tout leur potentiel.

19.1 Contrle TreeView


Dans le Framework 1.1, il nexistait aucun contrle natif permettant de raliser ce genre de fonctionnalit facilement. Certains contrles serveurs personnaliss ont donc t dvelopps pour pallier ce manque, mais aucun ne rpond toutes les problmatiques quun dveloppeur peut rencontrer. Le Framework 2.0 propose un nouveau contrle volu, TreeView, qui tire partie des amliorations apportes la cration de contrles, comme la prise en charge du design, des ressources embarques, des sources de donnes ou encore des fonctionnalits ct client. Les fonctionnalits suivantes sont notamment prises en charge :
j j

j j

j j j

liaison une source de donnes XML ; navigation lintrieur dun site lorsquil est associ un contrle SiteMapDataSource ; affichage des nuds en tant que lien ou en tant que texte ; accs par programme au modle objet du TreeView pour agir dynamiquement sur les nuds et leurs proprits ; remplissage de nud ct client (sans rechargement) ; affichage dune case cocher devant chaque nud ; apparence personnalisable grce aux thmes, aux images dnies par lutilisateur et aux styles.

Avant dexpliquer comment ajouter des nuds un arbre et comment les grer, passons en revue les notions qui leur sont associes.

Notions relatives aux nuds


Chaque entre de larborescence est appele "nud". Il existe plusieurs types de nuds qui, selon leur emplacement dans la hirarchie, sont appels diffremment :
j j j

Un nud parent (ParentNode) contient dautres nuds. Un nud enfant (ChildNode) est contenu dans un autre nud. Un nud feuille (LeafNode) na pas de nud enfant.

284 Le guide du codeur

Contrle TreeView

19

Le nud racine (RootNode) nest contenu dans aucun autre nud. Cest donc lanctre de tous les autres nuds.

Il est important de connatre ces diffrents types de nuds car plusieurs proprits visuelles et comportementales sont dtermines par le type dun nud.

Classe TreeNode
La classe correspondant la notion de nud est TreeNode. Voici un aperu de ses proprits :
Proprits dun objet TreeNode Proprit Description

Checked ChildNodes DataBound DataItem DataPath Depth Expanded ImageToolTip ImageUrl NavigateUrl Parent PopulateOnDemand SelectAction Selected ShowCheckBox

Obtient ou dnit une valeur qui indique si la case cocher du nud est active. Obtient une collection TreeNodeCollection qui contient les nuds enfants de premier niveau du nud courant. Obtient une valeur qui indique si le nud a t cr via une liaison de donnes. Obtient llment de donnes qui est li au contrle. Obtient le chemin daccs aux donnes lies au nud. Obtient la profondeur du nud. Obtient ou dnit une valeur qui indique si le nud est dvelopp. Obtient ou dnit le texte dinfo-bulle pour limage affiche en regard dun nud. Obtient ou dnit lURL vers une image qui est affiche ct du nud. Obtient ou dnit lURL laquelle accder lorsquun clic est effectu sur le nud. Obtient le nud parent du nud courant. Obtient ou dnit une valeur qui indique si le nud est rempli dynamiquement. Obtient ou dnit lvnement ou les vnements dclencher lorsquun nud est slectionn. Obtient ou dnit une valeur qui indique si le nud est slectionn. Obtient ou dnit une valeur qui indique si une case cocher est affiche en regard du nud.

Le guide du codeur 285

19

Reprsentation de donnes hirarchiques laide dun contrle TreeView

Proprits dun objet TreeNode Proprit Description

Target

Obtient ou dnit la fentre (ou frame cible) dans laquelle afficher le contenu de la page web associe un nud. Obtient ou dnit le texte affich pour le nud. Obtient ou dnit le texte dinfo-bulle pour le nud. Obtient ou dnit une valeur non affiche utilise pour stocker des donnes supplmentaires relatives au nud, telles que les donnes utilises pour la gestion des vnements de publication. Obtient le chemin daccs du nud racine vers le nud courant.

Text ToolTip Value

ValuePath

19.2 Ajouter des nuds un contrle TreeView


Le moyen le plus simple pour ajouter des nuds un contrle TreeView est de les spcier laide dune syntaxe dclarative. Pour cela, il suffit dajouter des balises <asp:TreeNode> la collection <Nodes>. 1 Tout dabord, dposez un contrle TreeView sur votre page. La balise par dfaut ressemble celle-ci :

<asp:TreeView ID="TreeView1" runat="server"></asp:TreeView>

2 En mode Design, une fentre de cration de nuds statiques est disponible pour vous aider grer la hirarchie que vous voulez mettre en place. Pour louvrir, cliquez sur le bouton situ droite de la proprit Nodes dans lditeur de proprits. Cette fentre permet visualiser la hirarchie des nuds, de les crer ou de les supprimer, et de modier leurs proprits.
b Figure 19-1 : Proprit Nodes dans lditeur de proprits

3 Ajoutez ensuite la collection de nuds <Nodes> les balises <asp:TreeNode> que vous dsirez.

286 Le guide du codeur

Modier des styles associs aux diffrents types de nuds

19

m Figure 19-2 : Fentre diteur de nuds TreeView

4 Vous pouvez notamment modier la proprit SelectAction, qui vous permet de spcier laction effectuer au moment de la slection du nud.

b Figure 19-3 : Proprit SelectAction dun nud

Modes possibles pour un nud


Un nud peut se prsenter sous lun des deux modes suivants : mode Slection et mode Navigation. Par dfaut, un nud est en mode de slection. Pour faire passer un nud en mode de navigation, affectez une valeur diffrente dune chane vide ("") la proprit NavigateUrl du nud. Pour faire passer un nud en mode de slection, affectez une chane vide ("") la proprit NavigateUrl du nud.

19.3 Modier des styles associs aux diffrents types de nuds


Plusieurs styles sont congurables pour un contrle TreeView. Certains correspondent au style affect un type de feuille (racine, parent, feuille).

Le guide du codeur 287

19

Reprsentation de donnes hirarchiques laide dun contrle TreeView

b Figure 19-4 : Liste des proprits de style dun contrle TreeView

Vous pouvez galement agir sur les styles affects au moment du survol (HoverNodeStyle) et de la slection (SelectedNodeStyle). Il est ainsi facile de spcier que le nud slectionn aura un arrire-plan jaune et que son texte sera en gras et en italique.

b Figure 19-5 : Proprits de style de la proprit SelectedNodeStyle

La proprit LevelStyles est une collection de styles qui permet de spcier le style des nuds selon le niveau de hirarchie dans lequel ils se trouvent. Le bouton situ droite de celle-ci dans lditeur de proprits ouvre une fentre dans laquelle vous pouvez ajouter les niveaux et congurer leurs styles respectifs. Vous pouvez par exemple affecter une couleur de texte verte aux lments racines et une couleur rouge aux lments enfants.

m Figure 19-6 : Fentre diteur de collections TreeNodeStyle

288 Le guide du codeur

Affecter des images aux nuds

19

Lapparence du contrle dans lditeur en mode Design est mise jour pour reter les changements de style qui vous avez effectu.

b Figure 19-7 : Contrle TreeView en mode Design

19.4 Affecter des images aux nuds


Vous avez la possibilit daffecter des images au dbut de chaque nud. La proprit ImageUrl dun TreeNode permet de slectionner lemplacement de limage laide dune fentre qui liste les images disponibles.

m Figure 19-8 : Fentre Slectionner un lment de projet

Vous pouvez galement spcier les images de rduction et de dveloppement laide des proprits ExpandImageUrl et CollapseImageUrl, ainsi quun rpertoire (LineImagesFolder) contenant les images des lignes. Enn, pour associer simplement des images vos nuds, vous avez votre disposition une liste dimages prdnies grce la proprit ImageSet. Vous pouvez ainsi donner votre arborescence une apparence qui la fait ressembler un Explorateur Windows ou une liste de contacts.

Le guide du codeur 289

19

Reprsentation de donnes hirarchiques laide dun contrle TreeView

b Figure 19-9 : Liste des images prdnies

Cette liste est aussi accessible partir du lien Mise en forme automatique de la balise active et permet en plus davoir un aperu du rsultat.

b Figure 19-10 : Assistant Mise en forme automatique

Ressources embarques Ces images sont stockes dans lassembly System.Web en tant que ressources embarques.

Pour plus dinformations sur les ressources embarques au sein


Renvoi dassembly, reportez-vous au chapitre Cration dun contrle serveur

personnalis.

290 Le guide du codeur

Lier des donnes un contrle TreeView

19

19.5 Lier des donnes un contrle TreeView


Le contrle TreeView peut galement tre li aux donnes, soit de manire dclarative (avec une source de donnes approprie), soit par programmation ( un objet XmlDocument ou un objet DataSet avec des relations), grce des mcanismes de liaison de donnes avancs.

Balises DataBindings et TreeNodeBinding


La collection DataBindings contient des objets TreeNodeBinding qui dnissent la relation entre un lment de donnes et le nud auquel il est li. Vous pouvez spcier les critres de liaison et la proprit de llment de donnes affiche dans le nud laide dun lment TreeNodeBinding. Le tableau suivant prsente lensemble des proprits dun objet TreeNode Binding. Plusieurs dentre elles sont similaires celles de lobjet TreeNode. Des proprits supplmentaires permettent de relier ces proprits un champ de la source de donnes.
Proprits dun llment TreeNodeBinding

DataMember

Obtient ou dnit la valeur associer une proprit IHierarchyData.Type pour un lment de donnes an de dterminer si la liaison de nud darbre doit tre applique. Obtient ou dnit la profondeur de nud. Obtient ou dnit la chane qui spcie le format daffichage du texte dun nud. Obtient ou dnit le texte dinfo-bulle de limage affich ct dun nud. Obtient ou dnit le nom du champ de la source de donnes lier la proprit ImageToolTip. Obtient ou dnit lURL vers limage affiche ct dun nud. Obtient ou dnit le nom du champ de la source de donnes lier la proprit ImageUrl. Obtient ou dnit lURL vers laquelle effectuer le lien lorsque lutilisateur clique sur un nud. Obtient ou dnit le nom du champ de la source de donnes lier la proprit NavigateUrl. Obtient ou dnit une valeur indiquant si le nud est rempli dynamiquement. Obtient ou dnit le ou les vnements dclencher lorsquun nud est slectionn. Les valeurs possibles sont None, Expand, Select et SelectExpand.
Le guide du codeur 291

Depth FormatString ImageToolTip ImageToolTipField ImageUrl ImageUrlField NavigateUrl NavigateUrlField PopulateOnDemand SelectAction

19

Reprsentation de donnes hirarchiques laide dun contrle TreeView

Proprits dun llment TreeNodeBinding

DataMember

Obtient ou dnit la valeur associer une proprit IHierarchyData.Type pour un lment de donnes an de dterminer si la liaison de nud darbre doit tre applique. Obtient ou dnit une valeur indiquant si une case cocher est affiche ct dun nud. Obtient ou dnit la cible du lien dun nud. Obtient ou dnit le nom du champ de la source de donnes lier la proprit Target. Obtient ou dnit le texte affich pour le nud. Obtient ou dnit le nom du champ de la source de donnes lier la proprit Text. Obtient ou dnit le texte dinfo-bulle dun nud. Obtient ou dnit le nom du champ de la source de donnes lier la proprit ToolTip. Obtient ou dnit une valeur qui nest pas affiche mais utilise pour stocker des donnes supplmentaires concernant un nud, telles que les donnes utilises pour grer des vnements de publication. Obtient ou dnit le nom du champ de la source de donnes lier la proprit Value.

ShowCheckBox Target TargetField Text TextField ToolTip ToolTipField Value

ValueField

19.6 Remplir dynamiquement des nuds


Lorsque la source de donnes est trop consquente, que son traitement de rcupration est trop pnalisant ou encore lorsque les donnes afficher dpendent des informations que vous obtenez au moment de lexcution, vous ne pouvez pas dnir statiquement larborescence du TreeView. Vous pouvez alors utiliser la fonctionnalit de remplissage dynamique de nuds. En guise dexemple, vous allez crer une arborescence qui rcupre dynamiquement les clients puis les commandes partir de la base de donnes SQL Northwind. Tout dabord, dposez un contrle TreeView dans votre page et ajoutez un nud racine comme vous lavez vu prcdemment.
<asp:TreeView ID="tvCustomers" runat="server"> <Nodes> </Nodes> </asp:TreeView>

292 Le guide du codeur

Remplir dynamiquement des nuds

19

Affectez la valeur true la proprit PopulateOnDemand dun nud, ce qui signie que vous allez spcier vous-mme comment remplir le nud laide de code serveur.
<asp:TreeNode Text="Clients" Value="Customers" PopulateOnDemand="True" Expanded="False" />

Pour remplir un nud dynamiquement, vous devez dnir une mthode de gestion pour lvnement TreeNodePopulate. En fonction du niveau auquel le nud a t dvelopp, vous pouvez spciez des mthodes de remplissage diffrentes.
Protected Sub tvCustomers_TreeNodePopulate( _ ByVal sender As Object, ByVal e As TreeNodeEventArgs) _ handles tvCustomers.TreeNodePopulate Select Case e.Node.Depth Case 0 FillCustomers(e.Node) Case 1 FillOrders(e.Node) End Select End Sub

La mthode GetDataSet permet de rcuprer un DataSet partir dune requte.


Private Function GetDataSet(ByVal sql As String) As DataSet Dim connstr As String = _ "Data Source=(local);Initial Catalog=Northwind;User ID=sa" Dim da As SqlDataAdapter = New SqlDataAdapter(sql, connstr) Dim ds As DataSet = New DataSet() da.Fill(ds) Return ds End Function

La mthode FillCustomers de remplissage des clients prend en paramtre le nud auquel elle doit ajouter les nuds enfants.
Private Sub FillCustomers(ByVal parent As TreeNode) Dim ds As DataSet = GetDataSet( _ "SELECT customerId, companyName FROM customers order by companyName") For Each row As DataRow In ds.Tables(0).Rows Dim node As TreeNode = New TreeNode() node.Text = row("companyname") node.Value = row("customerid") node.PopulateOnDemand = True node.SelectAction = TreeNodeSelectAction.SelectExpand parent.ChildNodes.Add(node) Next End Sub

Le guide du codeur 293

19

Reprsentation de donnes hirarchiques laide dun contrle TreeView

La mthode FillOrders de remplissage des factures dun client fait appel la valeur du nud parent pour effectuer la requte.
Private Sub FillOrders(ByVal parent As TreeNode) Dim ds As DataSet = GetDataSet( _ "SELECT customerId, orderId FROM orders WHERE customerId=" & parent.Value & "") For Each row As DataRow In ds.Tables(0).Rows Dim node As TreeNode = New TreeNode() node.Text = row("orderid") node.Value = row("orderid") node.PopulateOnDemand = False node.SelectAction = TreeNodeSelectAction.SelectExpand parent.ChildNodes.Add(node) Next End Sub

Enn, le remplissage des nuds ct client permet au contrle TreeView de remplir un nud laide de script client lorsque les utilisateurs dveloppent le nud, sans ncessiter dallers-retours avec le serveur. Pour cela, il suffit daffecter la valeur true la proprit PopulateNodesFromClient.

Fonctionnalit disponible uniquement pour les navigateurs avancs Seuls les navigateurs volus peuvent utiliser cette fonctionnalit de remplissage de nuds ct client.

Vous obtenez ainsi un contrle TreeView dont les nuds ne sont chargs que lorsque lon clique dessus, ce qui amliore considrablement les performances, et tout cela sans rechargement de la page.

b Figure 19-11 : Remplissage dynamique des clients puis de leurs factures

294 Le guide du codeur

Remplir dynamiquement des nuds

19

Source de donnes hirarchiques


Le fait davoir un contrle TreeView est une chose, encore faut-il des sources de donnes adquates qui puissent reprsenter une hirarchie. Pour cela, la source de donnes doit implmenter linterface IHierarchicalDataSource. Voici une prsentation des deux sources de donnes hirarchiques principales incluses dans le Framework ASP .NET.

XmlDataSource
Le contrle XmlDataSource utilise un chier XML, ce qui permet dobtenir une source de donnes hirarchiques que vous pouvez lier des contrles tels que TreeView ou Menu. Il prend notamment en charge des fonctions de ltrage laide dexpressions XPath. Enn, il permet de mettre jour des donnes en enregistrant le document XML entier avec ses modications.

SiteMapDataSource
Le contrle SiteMapDataSource est une source de donnes spcialement adapte aux plans de site hirarchiques et aux contrles de navigation, comme TreeView mais aussi comme Menu ou SiteMapPath. Voici comment associer un TreeView un plan de site. Tout dabord, crez un chier web.sitemap la racine du site dans lequel vous dnirez la hirarchie du plan de site.
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns= "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx" title="Accueil" description=""> <siteMapNode url="page1.aspx" title="Page1" description=""> <siteMapNode url="page11.aspx" title="Page1.1" description="" /> <siteMapNode url="page12.aspx" title="Page1.2" description="" /> </siteMapNode> <siteMapNode url="page2.aspx" title="Page2" description=""> <siteMapNode url="page21.aspx" title="Page2.1" description="" /> <siteMapNode url="page22.aspx" title="Page2.2" description="" /> </siteMapNode> </siteMapNode> </siteMap>
Le guide du codeur 295

19

Reprsentation de donnes hirarchiques laide dun contrle TreeView

Dposez ensuite un contrle TreeView :


<asp:TreeView ID="tvSiteMap" runat="server"></asp:TreeView>

Puis dposez un contrle SiteMapDataSource :


<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Enn, affectez la proprit DataSourceID du TreeView la valeur de lidentiant du contrle SiteMapDataSource :


DataSourceID="SiteMapDataSource1

Votre page affiche alors une arborescence reprsentant le plan de site.

b Figure 19-12 : Arborescence de plan de site

Le contrle SiteMapDataSource se lie aux donnes de plan de site et affiche les nuds en fonction dun nud de dmarrage spci dans la hirarchie de plan de site. Par dfaut, ce nud correspond au nud racine de la hirarchie, mais il peut galement sagir dun autre nud de la hirarchie. Le nud de dmarrage peut tre spci par les proprits StartFromCurrentNode, StartingNodeUrl ou StartingNodeOffset.

Assistant Conguration de source de donnes


Pour lier un contrle TreeView une source de donnes, vous pouvez galement utiliser lAssistant Conguration de source de donnes. Vous pouvez louvrir partir de la proprit DataSourceId dans lditeur de proprits et soit utiliser une source de donnes existante, soit en crer une nouvelle.
b Figure 19-13 : Proprit DataSourceId

Vous pouvez slectionner un contrle SiteMapDataSource.

296 Le guide du codeur

Remplir dynamiquement des nuds

19

m Figure 19-14 : Ajout dun contrle SiteMapDataSource

Vous pouvez galement slectionner un contrle XmlDataSource.

m Figure 19-15 : Ajout dun contrle XmlDataSource

Le guide du codeur 297

19

Reprsentation de donnes hirarchiques laide dun contrle TreeView

19.7 Check-list
Le contrle TreeView tait trs attendu par les dveloppeurs car de nombreuses fonctionnalits ncessitent de faire appel une darborescence pour afficher des donnes hirarchiques. Il sagissait de fournir un contrle capable de satisfaire tous les cas possibles. De ce point de vue, TreeView rpond parfaitement cette demande puisquil dispose notamment des fonctionnalits suivantes, dont vous avez pu avoir un aperu dans ce chapitre :
j j j j j j

affichage des donnes statiques et dynamiques ; personnalisation des styles ; association dimages aux nuds ; remplissage dynamique des nuds ; remplissage des nuds sans rechargement de page ; liaison de donnes entre les proprits du contrle et la source de donnes.

298 Le guide du codeur

Ch apit re

20
Site multilingue avec stockage des ressources en base de donnes
Classes et espaces de noms utiliss ............. Conguration ............................................ Ressources globales et ressources locales .... Expressions de ressource ........................... Fonctionnalits intressantes relatives la localisation ......................................... Implmentation dun fournisseur de ressources ............................................ Check-list .................................................. 300 301 302 305 308 313 318

20

Site multilingue avec stockage des ressources en base de donnes

La localisation dun site web est souvent aussi primordiale que difficile mettre en uvre. Il sagit de traduire tous les textes afficher mais galement le format des dates, des nombres ou encore des prix, qui varie selon la culture. On parle en effet de culture et non de langue, car une mme langue peut regrouper plusieurs pays et cultures diffrents. Les dveloppeurs qui souhaitent crer une application multilingue devront adapter toutes leurs pages la culture de lutilisateur en cours. Cela peut mme aller jusquau sens de lecture (on lit en effet de droite gauche dans certaines cultures). Dans ce chapitre, nous aborderons tous les concepts relatifs la localisation dun site web. Vous aurez ainsi loccasion de vous familiariser avec le modle de localisation dASP .NET 2.0 et avec les notions matriser. Vous apprendrez tout dabord localiser les pages dun site web selon la manire habituelle, cest--dire laide des chiers XML dans lesquels vous dclarerez les cls et les valeurs de chaque ressource. Vous verrez ensuite comment tendre ces expressions de ressource en implmentant un fournisseur de ressources personnalis qui stockera ces dernires dans une table de base de donnes.

20.1 Classes et espaces de noms utiliss


Lespace de noms System.Globalization regroupe lensemble des classes qui ont un rapport avec tout ce qui est spcique et qui peut varier selon la culture de lordinateur ou de lutilisateur en cours, notamment des classes qui interviennent dans diffrents domaines de la programmation :
j j

j j j

les classes de formatage de donnes (dates, nombres) ; les classes dencodage de chiers et de caractres (UTF-8, ISO 8859-1, Unicode) ; les classes de comparaison et des ordres de tri ; les calendriers spciaux (chinois, grgorien, hbreux, japonais) ; les cultures et sous-cultures existantes.

Les espaces de noms System.Resources et System.Web.UI.Design seront galement utiliss lors de limplmentation du fournisseur de ressources personnalis. Pour commencer, voyons une dnition des concepts mis en uvre lors de la localisation dun site, et des exemples expliquant la manire traditionnelle de dclarer des ressources destines traduire le contenu dun site.

300 Le guide du codeur

Conguration

20

Noms de culture
Un petit rappel simpose sur les normes concernant les noms de culture. Un systme de code simple et efficace a t mis en place, permettant de distinguer les cultures et leurs sous-cultures. Les codes des cultures correspondent aux conventions ISO (International Standard Organization). Les deux premires lettres en minuscules correspondent la langue (exemple : fr) et sappuient sur la norme ISO 639-1, tandis que les deux lettres en majuscules (exemple : FR) qui suivent le tiret sparateur (-) correspondent au code du pays et doivent respecter la norme ISO 3166. La culture franaise spcique la Belgique scrit fr-BE. Le tout est repris dans la RFC 3066.

Extension de chiers .resx


Vous retrouverez ces codes dans les extensions des noms de chier .resx. Cest en effet de cette faon que vous distinguerez les chiers de localisation des diffrentes cultures. Pour rcuprer une ressource, le fournisseur de localisation recherche en fonction de la cl, la culture la plus adquate. Si la culture en cours est es-Mx par exemple, il cherche un chier avec cette extension puis, sil nen trouve pas, il remonte la culture parente et enn la culture neutre. Cest pourquoi il est indispensable de fournir chaque fois un chier sans extension de code de culture an de pouvoir proposer une traduction par dfaut.

20.2 Conguration
La section de conguration globalization du web.config permet de spcier des rgles dencodage et de localisation appliquer par dfaut au sein de lapplication.
<globalization requestEncoding = "format dencodage" responseEncoding = "format dencodage"" fileEncoding = "format dencodage" responseHeaderEncoding = "format dencodage" resourceProviderFactoryType = "type" enableBestFitResponseEncoding = "true|false" culture="culture" uiCulture="culture"/>

Le guide du codeur 301

20

Site multilingue avec stockage des ressources en base de donnes

Attributs de llment globalization Attribut Description

culture fileEncoding requestEncoding

Attribut facultatif. Spcie la culture par dfaut. Attribut facultatif. Spcie le format dencodage par dfaut pour lanalyse des chiers .aspx, .asmx et .asax. Attribut facultatif. Spcie le format dencodage suppos de chaque demande entrante, y compris les donnes publies et la chane de requte. Attribut facultatif. Spcie le format dencodage du contenu des rponses. Attribut facultatif. Spcie la culture par dfaut pour le traitement des recherches de ressources dpendant des paramtres rgionaux.

responseEncoding uiCulture

Vous verrez plus loin comment initialiser de manire dclarative ou par programmation la culture de la page en cours.

20.3 Ressources globales et ressources locales


Le modle de localisation ASP .NET 2.0 permet aux dveloppeurs de dclarer des expressions dclaratives implicites ou explicites. 1 Pour utiliser des chiers de ressources globales ou locales, il faut commencer par crer respectivement le dossier App_GlobalRessources ou App_ LocalRessources. Pour cela, cliquez du bouton droit sur la racine du site et slectionnez le dossier que vous voulez crer dans la liste de rpertoires spciaux que vous propose le menu Ajouter un dossier ASP.NET.

m Figure 20-1 : Menu Ajouter un dossier ASP .NET

2 Pour ajouter un chier de ressources, cliquez du bouton droit sur le dossier App_GlobalResources dans lExplorateur de solutions, puis slectionnez la commande Ajouter un nouvel lment.
302 Le guide du codeur

Ressources globales et ressources locales

20

b Figure 20-2 : Commande Ajouter un nouvel lment

3 La bote de dialogue Ajouter un nouvel lment souvre et vous pouvez ajouter un chier de ressources avec une extension .resx.

m Figure 20-3 : Bote de dialogue Ajouter un nouvel lment

4 Visual Web Developer permet ensuite de modier les chiers .resx grce un diteur spcique complet et simple dutilisation. Les ressources sont associes des cls, cest--dire des identiants uniques partir desquels vous pourrez rcuprer leurs valeurs. En ce qui concerne les chanes de caractres, les ressources sont prsentes dans une grille de donnes qui affiche les cls, les valeurs ainsi quune colonne de commentaires si vous voulez donner des dtails.

m Figure 20-4 : diteur de ressources pour les chanes de caractres

Lajout dune nouvelle ressource se fait trs facilement grce une ligne vide en bas de la grille prvue cet effet.
Le guide du codeur 303

20

Site multilingue avec stockage des ressources en base de donnes

Ressources globales
Le rpertoire App_GlobalRessources insrer la racine du site permet de dnir les ressources globales, comme les messages derreur ou les plans de site.

Ressources localises
Le rpertoire App_LocalRessources doit tre plac dans chacun des rpertoires du site web o se trouve une page localiser. Vous pouvez alors localiser les proprits des contrles dune page Default.aspx en crant le chier Default. aspx.resx correspondant.

Autres types de ressources


Une ressource peut tre associe non seulement du texte mais aussi dautres chiers, comme des images ou des chiers audio. Lditeur de ressources permet dassocier et de visualiser ces diffrents types de chiers.

b Figure 20-5 : Slecteur de type de ressource de lditeur

Un menu Ajouter une ressource permet galement dajouter facilement les diffrents types de ressources possibles, comme ici une image. Il vous sera demand la cl que vous voulez lui attribuer et votre diteur dimages par dfaut se lancera.

b Figure 20-6 : Menu Ajouter une ressource

Dans ce chapitre, nous nous intresserons essentiellement aux chanes de caractres qui reprsentent la majeure partie des ressources localiser.

304 Le guide du codeur

Expressions de ressource

20

20.4 Expressions de ressource


Il existe plusieurs syntaxes dclaratives qui permettent de spcier les ressources associes un contrle ou ses proprits. De nombreuses proprits de contrle serveur peuvent tre localises. Il faut pour cela que la proprit possde lattribut Localizable avec la valeur true. Il suffit alors dutiliser la bonne expression pour relier la proprit la ressource laquelle elle doit tre associe. Vous allez dcouvrir les diffrentes manires de dclarer une expression de ressource pour une proprit localisable. Mais auparavant, faisons un point sur ce concept dexpression en prsentant ce sur quoi elles reposent, cest--dire les Expression Builders.

Expression Builders
Les Expression Builders sont une fonctionnalit de parsing qui permet aux dveloppeurs dutiliser une syntaxe dclarative an daffecter certaines proprits de contrle. Les Expression Builders supports par dfaut sont notamment les suivants :
Expression Builders utilisables dans les proprits des contrles serveurs Expression Builder Description

Resources Connectionstrings

resources: Resourcekey %>.

Utilis pour rcuprer une ressource. Exemple : <%$ Utilis pour accder une chane de connexion. Exemple : <%$ connectionstrings: ConnectionStringName %>. Utilis pour accder un paramtre dapplication. Exemple : <%$ appsettings: AppKey %>.

Appsettings

La syntaxe utiliser contient le prxe $, ce qui la distingue des mthodes de liaison de donnes (#) et dinterprtation de code (=). Vous pouvez implmenter vos propres Expression Builders si vous voulez avoir disposition ce genre de fonctionnalit de syntaxe dclarative. Vous devrez pour cela hriter des classes ExpressionBuilder et ExpressionBuilderEditor. Cette fonctionnalit tant explicite, passons maintenant aux expressions qui nous intressent tout particulirement, cest--dire les expressions de ressource.

Le guide du codeur 305

20

Site multilingue avec stockage des ressources en base de donnes

Expressions implicites
Les expressions implicites servent dclarer un prxe de ressource associ un contrle.
<asp:Control ID="Id" runat="server" meta:resourcekey="prefixe de ressource" />

Vous pouvez ensuite utiliser ce prxe pour spcier les proprits que vous voulez affecter. Il vous suffira de dclarer une ressource dont la cl sera constitue de ce prxe et de la proprit du contrle que vous voulez localiser, le tout spar par un point. Par exemple, pour localiser la proprit Text dun contrle Label pour lequel vous avez affect lattribut meta:resourcekey la valeur MonLabel, vous utiliserez comme cl de ressource MonLabel.Text. Vous aurez ainsi accs lensemble des proprits localisables tout en nayant fourni quun seul prxe.

Expressions explicites
Les expressions explicites utilisent une syntaxe qui permet daffecter aux proprits des cls de ressource globale ou locale. La syntaxe de dclaration est la suivante :
<%$ Resources:[fichier resX global,] cl de ressource%>

Voici un exemple de laffectation de la proprit Text dun contrle Label par une ressource globale :
<asp:Label ID="Label1" runat="server" Text=<%$ Resources: monFichierResX, maCl%> />

Pour comprendre un peu mieux cette syntaxe, consultez la section suivante sur les Expression Builders.

Assistant daffectation des ressources


Un Assistant est galement fourni dans lditeur de proprits en mode Design pour faciliter laffectation des ressources aux proprits des contrles. Pour y avoir accs, slectionnez le contrle dont vous voulez localiser les proprits, puis affichez la fentre Proprits. Une zone ddition spciale nomme (Expressions) de la catgorie Donnes permet alors dafficher lAssistant laide dun bouton :
b Figure 20-7 : Proprits (Expressions) dun contrle

306 Le guide du codeur

Expressions de ressource

20

Cet Assistant dispose de nombreuses fonctionnalits intressantes qui permettent dassocier des cls de ressource globale ou locale chaque proprit localisable du contrle en cours ddition. Si vous avez utilis la syntaxe avec lAssistant Expression Builder, lAssistant saura rcuprer les attributs que vous avez congurs et affichera des icnes diffrentes devant les proprits localises.

m Figure 20-8 : Assistant de ressources

Dans lditeur de proprits, si vous associez une expression de ressource la proprit, elle saffiche de manire un peu diffrente dans la liste :
b Figure 20-9 : Proprit Text associe une expression de ressource

Si le cher .resx contient des cls de ressource, une liste vous permettra de slectionner la cl que vous voulez associer la proprit en affichant toutes celles disponibles dans le chier.

b Figure 20-10 : Liste des ressources disponibles

Si, comme nous vous lavons conseill, vous avez plutt affect lattribut meta:resourcekey, lAssistant affiche alors un texte qui indique que les proprits ne peuvent pas tre dites. Vous pouvez nanmoins distinguer les proprits inscrites dans le chier .resx grce une icne spcique.
Le guide du codeur 307

20

Site multilingue avec stockage des ressources en base de donnes

m Figure 20-11 : Assistant de ressources dun contrle dont lattribut meta:resourcekey est dni

20.5 Fonctionnalits intressantes relatives la localisation


Accs par programmation aux ressources
Vous pouvez rcuprer les valeurs des ressources que vous avez cres dans votre code grce deux mthodes : GetGlobalResourceObject et GetLocalResourceObject. Elles prennent en paramtre la cl de la ressource :
Button1.Text = GetLocalResourceObject("Button1.Text").ToString() Image1.ImageUrl = CType(GetGlobalResourceObject _ ("RessourcesGlobales", "LogoUrl"), String)

Localisation de plans de site


Les proprits des nuds des plans de site peuvent galement tre localises. Pour ajouter un plan de site, cliquez du bouton droit sur la racine du site dans lExplorateur de solutions, puis slectionnez la commande Ajouter un nouvel lment. La bote de dialogue Ajouter un nouvel lment souvre alors. Vous pouvez ajouter un chier de plan de site, avec une extension .sitemap.

308 Le guide du codeur

Fonctionnalits intressantes relatives la localisation

20

m Figure 20-12 : Ajout dun plan de site

Fournisseur de navigation par dfaut Le fournisseur de navigation par dfaut est charg de rcuprer le chier web.sitemap situ la racine du site web. Si vous appelez votre plan de site comme cela et si vous le placez au bon endroit, vous navez pas lajouter dans la section de conguration des fournisseurs de navigation.

Vous pouvez utiliser un chier de ressources pour que les titres et les descriptions des pages dans vos contrles de navigation soient traduits. La syntaxe utiliser pour localiser un nud ressemble beaucoup aux expressions de ressource mais varient un peu car elle est adapte au chier XML :
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/ SiteMap-File-1.0" enableLocalization="true"> <siteMapNode url="~/default.aspx" title="$resources: SiteMap, Home, Accueil" description=""> </siteMapNode> </siteMap>

Le guide du codeur 309

20

Site multilingue avec stockage des ressources en base de donnes

Pour cela, vous devez activer la localisation en affectant la value true lattribut enableLocalization du nud racine du plan de site. Vous pouvez utiliser un chier de ressources locales ou aller chercher vos cls dans un chier de ressources globales. Pour les ressources globales, la syntaxe employer est :
$resources:ClassName, KeyName, DefaultValue

Vous avez galement la possibilit de spcier lattribut resourcekey, qui la mme fonction que lattribut meta:resourcekey mais pour les nuds XML.

Gnration automatique de ressources locales


Visual Web Developer intgre une fonctionnalit de gnration automatique des ressources locales contenues dans une page. Cela permet de gnrer de manire simple lensemble des ressources relatives une page. Il suffit pour cela de faire basculer lditeur de la page en cours en mode Design, plutt quen mode Source, puis de cliquer sur le bouton Gnrer la ressource locale de la barre doutils Mise en forme.
b Figure 20-13 : Bouton Gnrer la ressource locale de la barre doutils Mise en forme

Un chier .resx correspondant au nom de la page en cours sera alors automatiquement cr. Vous retrouverez dans ce chier la totalit des ressources affectes aux proprits des contrles. Ces proprits seront galement modies pour correspondre la syntaxe daffectation des ressources. En effet, si vous navez spci aucune expression de ressource pour une proprit localisable, lattribut meta:resourcekey sera ajout automatiquement avec comme valeur lidentiant du contrle. Mme la directive de page subira cette modication, ce qui permettra entre autres de pouvoir localiser le titre de la page. Vous naurez alors plus qu vous servir de ce chier comme modle an de crer les chiers de localisation pour les autres cultures.

Barre doutils Mise en forme Si la barre doutils Mise en forme nest pas disponible, cliquez du bouton droit sur un emplacement libre de la zone des barres doutils. Un menu apparat alors dans lequel vous pouvez slectionner cette barre.

310 Le guide du codeur

Fonctionnalits intressantes relatives la localisation

20

Il est donc prfrable de ne raliser cette action que lorsque vous tes certain que vous nallez plus ajouter des contrles la page. Lavantage lors du dveloppement de vos pages est que vous devez uniquement vous soucier de placer les textes qui seront traduire dans des proprits ou des contrles localisables. An de mieux contrler le nom des ressources, veillez nanmoins spcier lattribut meta:resourcekey de chaque contrle. La localisation peut alors tre dlgue nimporte quelle personne sachant se servir de lditeur de ressources, et donc sans connaissance requise en programmation.

Auto-dtection de la culture du navigateur


Vous pouvez facilement adapter le comportement de votre application la culture de lutilisateur en cours en vous basant sur le langage du navigateur Internet quil utilise pour y accder. Pour cela, il suffit de spcier les attributs culture et uiCulture avec la valeur auto dans la directive de page. Vous pouvez galement prciser une culture par dfaut en lajoutant aprs un deux-points (:) :
<%@ Page Culture="auto:fr-FR" %>

Voici les quelques tapes suivre an de dclarer plusieurs cultures pour votre navigateur et de basculer entre elles pour effectuer vos tests. Cette procdure montre comment congurer Internet Explorer, mais tous les navigateurs Internet ont cette mme fonctionnalit. 1 Dans le menu Outils, cliquez sur la commande Options Internet. Dans la fentre qui souvre, sous longlet Gnral, cliquez sur le bouton Langues situ en bas.

m Figure 20-14 : Fentre Options Internet

Le guide du codeur 311

20

Site multilingue avec stockage des ressources en base de donnes

2 La bote de dialogue Langues souvre alors avec la liste des cultures disponibles. Des boutons Monter et Descendre permettent de placer les cultures dans lordre de prfrence.

b Figure 20-15 : Bote de dialogue Langues

3 Le bouton Ajouter ouvre une liste partir de laquelle vous pouvez slectionner les cultures que vous voulez ajouter et les ordonner pour placer en tte celle que vous prfrez.

b Figure 20-16 : Liste des cultures disponibles susceptibles dtre ajoutes

Initialisation de la culture dune page


Pour initialiser la culture dune page si, par exemple, vous lavez stocke par un mcanisme de persistence personnalis (session, prol, viewstate, cookie), le moyen le plus indiqu est de substituer rednir la mthode Initialize Culture dune page. Il suffit alors dindiquer la culture utiliser via les

312 Le guide du codeur

Implmentation dun fournisseur de ressources

20

proprits CurrentCulture et CurrentUICulture de la classe System.Threa ding.Thread.CurrentThread, qui correspondent la culture en cours. Voici un exemple sur lequel vous pouvez vous baser pour crire ce genre de code dinitialisation de la culture :
Protected Overrides Sub InitializeCulture() System.Threading.Thread.CurrentThread.CurrentCulture _ = System.Globalization.CultureInfo. _ CreateSpecificCulture("fr-FR") System.Threading.Thread.CurrentThread. _ CurrentUICulture = New System.Globalization. _ CultureInfo("fr-FR") MyBase.InitializeCulture() End Sub

20.6 Implmentation dun fournisseur de ressources


Vous allez maintenant passer limplmentation du fournisseur de ressources qui va permettre de stocker les ressources dans une base de donnes. Le principe est de crer une classe qui hrite de la classe abstraite ResourceProviderFactory et dy implmenter vos propres mthodes de stockage et de rcupration des ressources. Ensuite, il suffit de modier dans le web.config lattribut resourceProviderFactoryType de la section globalization an dindiquer au site web que vous utilisez, non plus le mcanisme de localisation par dfaut, mais le vtre.
<globalization resourceProviderFactoryType="SQLResourceProviderFactory"/>

Avant dentrer dans le dtail des dveloppements effectuer, vous allez tout dabord crer la base de donnes destine stocker les ressources.

Accs aux donnes


An de stocker les ressources, vous allez crer la base de donnes SQLExpress nomme Localisation et la table Resource correspondante qui stockera les ressources. 1 Vous allez tout dabord ajouter le dossier ASP .NET App_Data et y ajouter votre base de donnes.

Le guide du codeur 313

20

Site multilingue avec stockage des ressources en base de donnes

m Figure 20-17 : Bote de dialogue Ajouter un nouvel lment

Cette table servira la fois aux ressources globales et aux ressources locales puisque ce qui les diffrencie nest en ralit que le nom de la classe de ressource globale. La structure de la table est donc prvue pour recevoir lensemble des informations spciques aux expressions de localisation. Les champs sont les suivants :
virtualPath : le nom de la page pour une ressource locale. className : le nom de la classe pour une ressource globale. cultureName : le code de la culture. resourceName : la cl de la ressource. resourceValue : la valeur de la ressource.

b Figure 20-18 : Structure de la table Resource

314 Le guide du codeur

Implmentation dun fournisseur de ressources

20

2 Aprs avoir cr la table, utilisez lExplorateur de serveur pour naviguer dans la base et slectionner la table Resource.

b Figure 20-19 : Affichage de la base de donnes dans lExplorateur de serveur

3 Vous pouvez ensuite afficher les donnes de la table en cliquant dessus du bouton droit et en slectionnant la commande Afficher les donnes de la table.

b Figure 20-20 : Commande Afficher des donnes de la table

4 Il suffit alors dajouter les ressources dont vous voulez disposez laide de la grille de donnes qui affiche chaque enregistrement ainsi que les colonnes.

m Figure 20-21 : Affichage des donnes de la table

Le guide du codeur 315

20

Site multilingue avec stockage des ressources en base de donnes

ResourceProviderFactory
Deux mthodes principales doivent notamment tres substitues : CreateLocal
ResourceProvider et CreateGlobalResourceProvider.

Cette classe est assez simple puisquelle utilise un objet SQLResourceProvider qui englobe toute la logique de rcupration des ressources :
Public NotInheritable Class SQLResourceProviderFactory Inherits ResourceProviderFactory Public Overrides Function CreateLocalResourceProvider _ ( ByVal virtualPath As String) As IResourceProvider virtualPath = _ System.IO.Path.GetFileName(virtualPath) Return New SQLResourceProvider(virtualPath, _ Nothing) End Function Public Overrides Function _ CreateGlobalResourceProvider ( _ ByVal className As String) As IResourceProvider Return New SQLResourceProvider(Nothing, className) End Function End Class

SQLResourceProvider
La classe SQLResourceProvider implmente linterface IResourceProvider et doit donc fournir limplmentation de la mthode GetObject, qui renverra une ressource, et de la proprit ResourceReader, qui renverra un numrateur de ressources.

SQLResourceHelper
Cette classe daide la rcupration et au stockage des ressources est charge de raliser les accs en base. Elle contient donc une mthode GetResources de rcupration des ressources. Son prototype est le suivant :
Public Shared Function GetResources( _ ByVal virtualPath As String, _ ByVal className As String, _ ByVal cultureName As String, _ ByVal designMode As Boolean, _ ByVal serviceProvider As IServiceProvider) As IDictionary

Selon les paramtres passs (si leur valeur est nulle ou non), cette mthode renvoie des ressources globales ou locales pour une certaine culture. Par
316 Le guide du codeur

Implmentation dun fournisseur de ressources

20

exemple, la rcupration dune ressource locale ncessitera le nom du chier, et non le nom de la classe, tandis que pour une ressource globale, ce sera linverse.

SQLDesignTimeResourceProviderFactory
Pour que la fonctionnalit de gnration automatique soit galement prise en charge par votre fournisseur de ressources, vous devez crer une classe SQLDesignTimeResourceProviderFactory qui hrite de DesignTimeResourceProviderFactory dans lespace de noms System.Web.UI.Design. Cette classe peut tre aussi simple que ResourceProviderFactory puisquelle aussi dlgue toutes ces oprations complexes deux classes, DesignTime GlobalResourceProvider et DesignTimeLocalResourceProvider.
Public Class SQLDesignTimeResourceProviderFactory Inherits DesignTimeResourceProviderFactory Public Overrides Function _ CreateDesignTimeGlobalResourceProvider(_ ByVal serviceProvider As IServiceProvider, _ ByVal applicationKey As String) _ As IResourceProvider Return New DesignTimeGlobalResourceProvider _ (applicationKey) End Function Public Overrides Function _ CreateDesignTimeLocalResourceProvider( _ ByVal serviceProvider As IServiceProvider) _ As IResourceProvider If _localResourceProvider Is Nothing Then _localResourceProvider = _ New DesignTimeLocalResourceProvider _ (serviceProvider) End If Return _localResourceProvider End Function Public Overrides Function _ CreateDesignTimeLocalResourceWriter(_ ByVal serviceProvider As IServiceProvider) _ As IDesignTimeResourceWriter Return New DesignTimeLocalResourceProvider _ (serviceProvider) End Function End Class

Aprs toutes ces tapes, votre fournisseur de ressources stockes dans une base de donnes est maintenant effectif. Il ne reste plus qu crer les pages et

Le guide du codeur 317

20

Site multilingue avec stockage des ressources en base de donnes

ajouter les ressources pour localiser les proprits des contrles que vous voudrez traduire pour diffrentes cultures.

20.7 Check-list
La localisation des sites web a t considrablement simplie avec le Framework ASP .NET 2.0. Il fournit dsormais nativement une fonctionnalit de dclaration des ressources par culture dans des chiers XML et un mcanisme daffectation de ces ressources des proprits de contrle grce une syntaxe dclarative. Vous pouvez de plus implmenter vos propres mthodes de stockage et de rcupration des ressources. Dans ce chapitre, nous avons abord les sujets suivants :
j j j j j j j j

la localisation dun site web laide de chier .resx ; laccs dclaratif et impratif aux ressources dans les pages web ; laccs par programmation aux ressources ; la localisation de plans de site ; linitialisation de la culture dune page ; la gnration automatique de ressources locales ; lauto-dtection de la culture dun navigateur ; limplmentation dun fournisseur de ressources pour stocker des ressources dans une base.

318 Le guide du codeur

Ch apit re

21 Atlas

Prsentation dAtlas ................................... Installation ................................................ Cration dun site web Atlas ........................ Syntaxe du code Atlas ................................ Utilisation du contrle UpdatePanel .............. Utilisation du contrle AutoCompleteExtender . Check-list ..................................................

320 321 324 328 329 333 336

21

Atlas

Atlas est un Framework gratuit qui permet de dvelopper des applications web de nouvelle gnration, plus riches, plus interactives et multinavigateurs. Aprs une prsentation dAtlas, vous utiliserez les contrles Atlas travers quelques exemples. Vous dcouvrirez avec quelle facilit il est possible de dvelopper des fonctionnalits qui ncessitaient auparavant des connaissances avances de langages ct client, comme JavaScript.

21.1 Prsentation dAtlas


Atlas se prsente comme une extension du Framework .NET 2.0. Il permet aux dveloppeurs de crer des applications web riches, qui tirent avantage la fois des fonctionnalits du navigateur et du code serveur.

Ajax et XMLHttpRequest
Ce type de dveloppement quutilise Atlas est fortement li au concept dAjax (Asynchronous JavaScript and XML). Ce terme est maintenant largement employ et parfois mme usurp. Il reprsente la fois la technologie dappel de procdure de manire asynchrone et un ensemble de technologies. Les navigateurs volus sont capables dutiliser lobjet XMLHttpRequest, qui peut tre appel laide de code JavaScript pour faire des appels au serveur. Cela permet notamment de raliser des rafrachissements partiels de page. Le problme principal que Ajax tente de rsoudre est enracin dans le protocole HTTP lui-mme. Les navigateurs communiquent en effet via HTTP avec les serveurs web pour rcuprer le contenu des pages et publier leurs donnes. Le protocole est sans tat, ce qui signie que la conservation de la saisie de lutilisateur entre chaque appel de page est la charge du serveur.

Bibliothque de scripts clients


La bibliothque de scripts clients dAtlas est divise en plusieurs parties. Le script principal comprend les couches infrieures sur lesquelles le reste est construit. On trouve ensuite la couche de compatibilit internavigateur. Il sagit dune abstraction permettant dcrire des scripts sans se soucier de savoir sils vont fonctionner sur tous les navigateurs. En outre, grce cette couche, Atlas pourra voluer en fonction des amliorations des navigateurs. Le systme de types se trouve au-dessus de cette couche de compatibilit. Il permet de dvelopper du JavaScript avec une approche oriente objet. Vous pouvez ainsi crer des espaces de noms et des classes. Lhritage est galement pris en charge ainsi que les interfaces, les dlgus et les numrations, en dautres termes la plupart des concepts que vous retrouvez dans les langages du Framework .NET.
320 Le guide du codeur

Installation

21

La bibliothque de classes de base complte la bibliothque de scripts. Vous retrouverez donc des classes et espace de noms habituels. Les fonctionnalits du Framework Atlas ne se limitent pas une bibliothque de scripts Ajax. On y trouve aussi des fonctionnalits ct serveur qui permettent damliorer facilement les applications ASP .NET existantes.

Contrles Atlas
Larchitecture dAtlas se compose dun modle de composants et de contrles. Les contrles serveurs permettent notamment dviter les rafrachissements de page. Le contrle ScriptManager modie le comportement de publication client tandis que le contrle UpdatePanel gre le cycle de vie de la page ct serveur avant deffectuer les changements ncessaires. Affectez la proprit EnablePartialRendering du ScriptManager true :
<atlas:ScriptManager EnablePartialRendering="true" runat="server" />

Ltat de la page est rendu persistant au travers des requtes de rendu partiel. Le code HTML est quant lui mis jour laide de code JavaScript agissant sur le Document Object Model (DOM). Atlas supporte galement la srialisation des donnes des web services en JSON. Les donnes JSON peuvent tre dsrialises directement vers les objets JavaScript plus ou moins complexes. Cela simplie laccs aux services web partir du navigateur.

21.2 Installation
Tout dabord, vous devez installer Atlas sur votre machine de dveloppement. Pour cela, tlchargez lexcutable dinstallation dAtlas. Vous le trouverez facilement sur le site officiel http://atlas.asp.net. Vous y trouverez en outre de nombreux articles, les dernires actualits ainsi que des exemples dapplications et dautres ressources. Voici les diffrentes tapes pour procder linstallation du Framework Atlas. 1 Lancez lexcutable AtlasSetup.msi. LAssistant dinstallation souvre.

Le guide du codeur 321

21

Atlas

m Figure 21-1 : Lancement de lAssistant dinstallation dAtlas

2 Cliquez sur Suivant puis accepter le contrat dutilisation. 3 Cliquez de nouveau sur Suivant. LAssistant vous demande si vous souhaitez installer le modle de projet Atlas pour Visual Studio.

m Figure 21-2 : Case cocher Installer le modle de projet Visual Studio Atlas

4 Cliquez sur Suivant. Une case cocher vous propose denregistrer lextension de chier .asbx dans IIS.

322 Le guide du codeur

Installation

21

m Figure 21-3 : Ajout de lextension de chier .asbx dans IIS

Lextension .asbx dsigne les chiers Atlas quon appelle "bridges". Il sagit de composants qui communiquent avec des services web situs en dehors de votre application. 5 Terminez linstallation. Les chiers associs sont installs dans le rpertoire C:\Program Files\Microsoft ASP.NET\Atlas. 6 Si vous avez choisi dinstaller le modle de projet Visual Studio Content, lAssistant dinstallation se lance. Le premier cran affiche les modles qui vont tre installs et vous permet de ne slectionner que ceux qui vous intressent.

m Figure 21-4 : Liste des projets installer Le guide du codeur 323

21

Atlas

7 Vous pouvez ensuite cliquer sur Terminer pour excuter linstallation. Les liens situs derrire chaque projet install fournissent des informations sur le droulement de linstallation.

m Figure 21-5 : cran rcapitulatif de linstallation

21.3 Cration dun site web Atlas


Aprs avoir install le modle de projet Visual Studio, vous pouvez crer un nouveau site web Atlas. 1 Pour cela, cliquez du bouton droit sur la racine de la solution, puis slectionnez la commande Ajouter un nouveau site web du menu Ajouter. 2 Dans la catgorie Mes modles, slectionnez le modle Atlas Web Site.

m Figure 21-6 : cran rcapitulatif de linstallation

324 Le guide du codeur

Cration dun site web Atlas

21

3 Slectionnez lemplacement du site, le langage Visual Basic, puis cliquez sur OK. Le modle de site web Atlas Web inclut lassembly Microsoft.Web.Atlas.dll dans son dossier Bin ainsi quun chier Web.config qui contient des sections spciques permettant dactiver les fonctionnalits dAtlas.

Conguration du Web.cong
Les sections de conguration personnalises permettent de dclarer les nouvelles sections que vous pouvez utiliser, comme les services dauthentication et de prol asynchrones.
<configSections> <sectionGroup name="microsoft.web" type= "Microsoft.Web.Configuration.MicrosoftWebSectionGroup"> <section name="converters" type="Microsoft.Web.Configuration.ConvertersSection" requirePermission="false"/> <section name="webServices" type= "Microsoft.Web.Configuration.WebServicesSection" requirePermission="false"/> <section name="authenticationService" type= "Microsoft.Web.Configuration.AuthenticationServiceSection" requirePermission="false"/> <section name="profileService" type="Microsoft.Web.Configuration.ProfileServiceSection" requirePermission="false"/> </sectionGroup> </configSections>

Il est galement intressant dimporter les espaces de noms contenant les nouveaux contrles serveurs intgrs au Framework Atlas. Cela vite dinclure les directives Register dans chaque page qui utilisera ces contrles.
<pages> <controls> <add namespace="Microsoft.Web.UI" assembly="Microsoft.Web.Atlas" tagPrefix="atlas"/> <add namespace="Microsoft.Web.UI.Controls" assembly="Microsoft.Web.Atlas" tagPrefix="atlas"/> </controls> </pages>

Les chiers .asmx sont associs un nouvel handler (un gestionnaire de requtes) an que les serveurs proxy JavaScript puissent fonctionner.

Le guide du codeur 325

21

Atlas

<httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" type="Microsoft.Web.Services.ScriptHandlerFactory" validate="false"/> <add verb="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" validate="false"/> <add verb="*" path="atlasglob.axd" type="Microsoft.Web.Globalization.GlobalizationHandler" validate="false"/> <add verb="*" path="*.asbx" type="Microsoft.Web.Services.ScriptHandlerFactory" validate="false"/> </httpHandlers>

Des modules de service sont ajouts.


<httpModules> <add name="ScriptModule" type="Microsoft.Web.Services.ScriptModule"/> <add name="BridgeModule" type="Microsoft.Web.Services.BridgeModule"/> <add name="WebResourceCompression" type= "Microsoft.Web.Services.WebResourceCompressionModule"/> </httpModules>

Ajout des contrles Atlas la bote outils


Pour utiliser facilement les contrles Atlas dans votre site, vous allez les ajouter la bote outils de Visual Studio. 1 de la bote outils. 2 Nommez cet onglet Atlas. 3 Slectionnez la commande Ajouter un onglet
b Figure 21-7 : Cration de longlet Atlas

Slectionnez la commande Choisir les lments de longlet que vous venez de crer.

La fentre qui souvre affiche lensemble des contrles disponibles. Ceux accompagns dune case cocher slectionne sont dj ajouts un onglet de la bote outils. Cliquez sur le bouton Parcourir puis recherchez lemplacement Files\Microsoft ASP.NET\Atlas\v2.0.50727\Atlas pour slectionner lassembly qui contient les contrles Atlas que vous voulez avoir disposition.
C:\Program
326 Le guide du codeur

Cration dun site web Atlas

21

m Figure 21-8 : Slection de lassembly Microsoft.Web.Atlas.dll

4 La fentre slectionne les nouveaux contrles contenus dans cet assembly et les coche pour ajouter leurs rfrences dans la bote outils. Cliquez sur OK.

m Figure 21-9 : Importation des contrles serveurs Atlas

5 Les contrles Atlas sont alors ajouts longlet.

Le guide du codeur 327

21

Atlas

b Figure 21-10 : Liste des contrles Atlas

Avant dutiliser le Framework Atlas dans des pages web, voyons les diffrentes syntaxes du code Atlas.

21.4 Syntaxe du code Atlas


Il existe trois faons dcrire du code Atlas.

Mode impratif
Le code impratif nest ni plus ni moins que lutilisation du Framework JavaScript Atlas dans vos pages. Cette mthodologie ncessite une connaissance avance du langage JavaScript et des diffrents lments du Framework Atlas. Ce mode dutilisation est cependant ncessaire au dveloppement de contrles serveurs Atlas.
<input id="button" type="button" onclick="GetValues" /> <script type="text/javascript" src="WebServiceAtlas.asmx/js"></script> <script type="text/javascript"> function GetValues() { WebServiceAtlas.getValues(GetValues_CallBack); } function GetValues_CallBack(result){ // } </script>

Mode dclaratif
Le mode dclaratif consiste ajouter une balise de type "text/xmlscript" permettant la description du comportement de votre page. Ce mode de travail
328 Le guide du codeur

Utilisation du contrle UpdatePanel

21

par description est certainement le plus comprhensible pour quelquun dbutant avec Atlas. Il permet la mise en place de comportement ct client au sein dune page de faon simple et rapide.
<input id="button" type="button" value="OK" /> <script type="text/xml-script"> <page> <dataSource id="dataSource" serviceURL="WebServiceAtlas.asmx" /> <button id="buttonAction" targetElement="button"> <click> <invokeMethod target="dataSource" method="GetValues" /> // </click> </button> </page> </script>

Mode serveur
Les contrles serveurs disponibles dans le Framework Atlas sont pour la plupart des extenders, cest--dire des contrles qui vont tendre le comportement de contrles dj existants. Par exemple, AutoCompleteExtender, dont vous verrez un exemple dutilisation plus loin dans ce chapitre, permet la mise en place dune zone de saisie qui propose lutilisateur de complter sa frappe par le biais de suggestions, au fur et mesure de la saisie. Il tend le comportement dune TextBox en passant par une mthode de Web Service pour rcuprer les suggestions en fonction de ce qui est dj saisi.
<asp:TextBox ID="TextBox1" runat="server" /> <atlas:AutoCompleteExtender ID="AutoComplete" runat="server"> <atlas:AutoCompleteProperties TargetControlID="TextBox1" Enabled="true" ServicePath="WebService.asmx" ServiceMethod="GetValues" /> </atlas:AutoCompleteExtender>

21.5 Utilisation du contrle UpdatePanel


Le contrle UpdatePanel indique quelles sections de la page doivent tre mises jour indpendamment. Lorsquun vnement qui doit normalement dclencher une publication est lanc, cette publication est en ralit excute de manire asynchrone.

Le guide du codeur 329

21

Atlas

Le contrle UpdatePanel peut contenir des lments Triggers ainsi quun ContentTemplate :
<atlas:UpdatePanel ID="UpdatePanel1" runat="server"> <Triggers> </Triggers> <ContentTemplate> </ContentTemplate> </atlas:UpdatePanel>

Le code dclaratif lintrieur du ContentTemplate est rafrachi lorsque le ScriptManager gre une publication asynchrone. Les triggers dclarent quant eux les vnements et les proprits que lUpdatePanel doit grer grce aux lments ControlValueTrigger et ControlEventTrigger.

Horloge
Vous allez maintenant raliser une horloge en utilisant le contrle UpdatePanel. Il sagit dun exemple typique propos ceux qui dbutent en programmation JavaScript. Vous aurez ainsi loccasion de constater quel point il est facile de raliser ce genre de fonctionnalit laide de contrle Atlas. Vous allez utiliser pour cela le contrle Atlas TimerControl, qui est une sorte de compteur rebours. Il possde une proprit Interval qui spcie un intervalle de temps en millisecondes et un vnement Tick qui se produit aprs chaque intervalle. 1 Pour commencer, dposez un contrle UpdatePanel dans votre page partir de la bote outils Atlas que vous avez cre prcdemment.

Importation dassembly lors du dpt dun contrle Si vous tiez parti dun site web normal, le dpt du contrle UpdatePanel aurait eu pour effet dimporter directement lassembly Microsoft.Web.Atlas.dll puisquil est ncessaire son fonctionnement et quils ont t associs au moment de lajout dans la bote outils.

2 Affichez le smart tag puis cliquez sur le lien Add Script Manager pour ajouter un contrle ScriptManager.

330 Le guide du codeur

Utilisation du contrle UpdatePanel

21

b Figure 21-11 : Smart tag du contrle ScriptManager

3 lintrieur de la balise ContentTemplate de lUpdatePanel, insrez le code serveur qui affiche lheure courante au format hh:mm:ss.
<ContentTemplate> <%=DateTime.Now.ToLongTimeString()%> </ContentTemplate>

4 Activez ensuite la proprit EnablePartialRendering du contrle ScriptManager.

b Figure 21-12 : Activation de la proprit EnablePartialRendering dun contrle ScriptManager

5 Dposez un contrle TimerControl dans la page, en dehors de lUpdatePanel et spciez un intervalle de 1 000 millisecondes, soit 1 seconde, dans sa proprit Interval. 6 En mode Design, slectionnez lUpdatePanel puis cliquez sur le bouton de la proprit Triggers pour ouvrir la bote de dialogue qui gre les dclencheurs.

m Figure 21-13 : Bote de dialogue de gestion des dclencheurs

7 Un bouton New Trigger ouvre une nouvelle bote de dialogue qui permet dajouter facilement un dclencheur. Slectionnez dabord le type de

Le guide du codeur 331

21

Atlas

dclencheur. Vous pouvez le baser sur le changement dune proprit ou sur le dclenchement dun vnement dun contrle situ en dehors de lUpdatePanel. 8 Ajoutez un trigger qui gre lvnement Tick du contrle Timer. Pour cela, vous disposez de deux liens situs lintrieur dune phrase qui permet de comprendre quel type de trigger va tre ajout. Le premier propose les contrles possibles :

m Figure 21-14 : Contrles disponibles pour le trigger

Le second propose les vnements associs au contrle slectionn :

m Figure 21-15 : vnements associs au contrle slectionn

Cela a pour effet dajouter un trigger qui gre lvnement Tick du Timer dans la collection des triggers de lUpdatePanel. Au nal, voici le code que vous obtenez :

332 Le guide du codeur

Utilisation du contrle AutoCompleteExtender

21

<atlas:ScriptManager ID="ScriptManager" runat="server" EnablePartialRendering="true" /> <atlas:UpdatePanel ID="UpdatePanel" runat="server"> <ContentTemplate> <%=DateTime.Now.ToLongTimeString()%> </ContentTemplate> <Triggers> <atlas:ControlEventTrigger ControlID="Timer" EventName="Tick" /> </Triggers> </atlas:UpdatePanel> <atlas:TimerControl ID="Timer" runat="server" Enabled="true" Interval="1000" />

Laffichage de la page web permet de voir que lheure se met bien jour toutes les secondes.

b Figure 21-16 : Affichage de lheure

21.6 Utilisation du contrle AutoCompleteExtender


Passez ensuite la cration de la TextBox avec suggestions automatiques en fonction de la saisie. 1 Ajoutez tout dabord un contrle ScriptManager et le contrle TexBox qui va rcuprer la saisie de lutilisateur. 2 Dclarez ensuite un contrle AutoCompleteExtender. Prcisez quil sapplique la TextBox et quil utilise la mthode GetContacts du service web GetContacts.asmx. Votre code doit ressembler ceci :
<atlas:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server" /> Nom : <asp:TextBox ID="tbName" runat="server" /> <atlas:AutoCompleteExtender ID="ac1" runat="server"> <atlas:AutoCompleteProperties Enabled="true" MinimumPrefixLength="1" ServicePath="GetContacts.asmx" TargetControlID="tbName" ServiceMethod="GetContacts" /> </atlas:AutoCompleteExtender>

Le guide du codeur 333

21

Atlas

Spcication du nombre minimum de lettres saisir La mthode GetContacts du service web sera appele chaque lettre saisie dans le contrle TextBox ds que le nombre de lettres a atteint la limite xe dans la proprit MinimumPrefixLength de lAutoCompleteExtender.

Il ne reste plus qu crer le service web et sa mthode GetContacts.

Cration du service web


1 Ajoutez un nouvel lment GetContacts.asmx de type service web la racine de votre projet.

m Figure 21-17 : Ajout dun service web

2 Le code de ce service web se trouvera dans le dossier App_Code. Ajoutez-lui une mthode GetContacts au format suivant :
<WebMethod()> _ Public Function GetContacts(ByVal prefixText As String, _ ByVal count As String) As String() End Function

334 Le guide du codeur

Utilisation du contrle AutoCompleteExtender

21

Syntaxe de la mthode de rcupration des suggestions La mthode du service web de rcupration des suggestions doit tre exactement celle-ci, avec les mmes noms de paramtre.

3 En ce qui concerne le code de rcupration des noms qui correspondent aux lettres dj saisies, vous pouvez utiliser une liste gnrique dobjets String, par exemple la liste de vos contacts, et un prdicat qui vrie si le dbut de la chane correspond au paramtre prefixText. Dans cet exemple, dclarez une liste manuellement :
Dim l As New List(Of String) Dim names As String() = _ {"Adeline", "Antoine", "Aurlien", "Grgory",} l.AddRange(names)

4 Crez ensuite une classe qui prend en paramtre de constructeur le prxe vrier et dclarez une mthode IsBeginningOf qui vrie si une chane passe en paramtre commence par ce prxe :
Public Class StringFilter Private strPrefix As String = "" Public Sub New(ByVal value As String) strPrefix = value End Sub Public Function IsBeginningOf(ByVal _name As String) _ As Boolean Return _name.StartsWith(strPrefix, _ StringComparison.InvariantCultureIgnoreCase) End Function End Class

5 Vous pouvez ensuite utiliser la fonction FindAll dune liste gnrique qui prend en paramtre un prdicat. En lui passant un prdicat qui vrie si une chane commence par le prxe, vous obtiendrez donc seulement les contacts qui commencent par les lettres saisies. Utilisez alors la mthode ToArray pour renvoyer un tableau de String.
Dim p As System.Predicate(Of String) = _ New Predicate(Of String)(AddressOf _ New StringFilter(prefixText).IsBeginningOf) Return l.FindAll(p).ToArray()

Le guide du codeur 335

21

Atlas

6 Vous pouvez tester votre zone de saisie en entrant quelques lettres. Une liste de tous les contacts correspondants saffichera alors.

b Figure 21-18 : Suggestion des contacts commenant par la lettre "a"

21.7 Check-list
Dans ce chapitre, vous avez appris :
j j j j

installer Atlas ; ajouter des contrles Atlas la bote outils ; utiliser le contrle UpdatePanel ; utiliser le contrle AutoCompleteExtender.

336 Le guide du codeur

Ch apit re

22
Ralisation dun questionnaire laide dun contrle Wizard
Classes et espaces de noms utiliss ............. Contrle Wizard ........................................ Ralisation du questionnaire ........................ Navigation au sein du contrle Wizard .......... Amlioration de lexprience utilisateur ......... Check-list .................................................. 338 338 340 345 346 349

22

Ralisation dun questionnaire laide dun contrle Wizard

Lorsque vous ralisez une application, votre souci principal doit tre de rpondre aux besoins de lutilisateur en lui fournissant des fonctionnalits les plus simples possibles. On parle dans ce cas dexprience utilisateur. Si vous devez afficher une quantit importante de donnes sur un mme cran, cela peut vite devenir assez incomprhensible pour lutilisateur. An de lassister dans la saisie dinformations, il est intressant de dcomposer une opration complique en plusieurs tapes simples et dtailles. De nombreuses fonctionnalits ncessitent dtre dcomposes en plusieurs tapes, que ce soit pour des raisons de dcomposition logique (si lon doit procder une tape avant une autre par exemple) ou dorganisation. Dans cet exemple, vous allez dvelopper un questionnaire laide du contrle Wizard. Vous aurez par ce biais loccasion dapprendre amliorer la saisie de formulaire pour une meilleure exprience utilisateur.

22.1 Classes et espaces de noms utiliss


Lespace de noms System.Web.UI.WebControls sest considrablement enrichi avec lASP .NET 2.0. De nombreux nouveaux contrles sont en effet disponibles et larchitecture a t repense et rorganise an de fournir par exemple des classes de base dont peuvent hriter dautres contrles enfants ou des interfaces implmenter pour ajouter des fonctionnalits intressantes.
CompositeControl, dont hrite le contrle Wizard, est une classe abstraite qui sert dvelopper des contrles personnaliss englobant des contrles enfants ou utilisant les fonctionnalits dautres contrles, tels que les contrles Login ou SiteMapPath.

22.2 Contrle Wizard


Le Framework ASP .NET 1.1 ne disposait pas de contrle permettant de rcolter des informations en plusieurs tapes. Le souci majeur tait notamment la persistance des donnes ainsi quune navigation intuitive. Il sagissait de fournir un contrle simple congurer et qui autorisait en mme temps une personnalisation totale de chaque lment ainsi quun ensemble dvnements permettant de grer les enchanements dcrans et la rcupration des valeurs saisies. Le nouveau contrle serveur Wizard rpond la plupart de ces problmatiques. Le contrle Wizard fournit une navigation au travers dune srie dtapes qui rcuprent linformation de lutilisateur nal.

338 Le guide du codeur

Contrle Wizard

22

Le contrle Wizard peut tre constitu des lments suivants :


j

une collection dtapes (Wizard Steps) qui contient linterface utilisateur pour chacune dentre elles, comme dni par le dveloppeur de pages ; une zone de navigation (Navigation Area) intgre qui dtermine les boutons appropris afficher en fonction de ltape laquelle le Wizard se trouve ; un en-tte (Header) qui peut tre personnalis pour afficher des informations spciques ltape o lutilisateur se trouve. une barre latrale (Side Bar) qui peut tre utilise pour naviguer rapidement travers les diffrentes tapes du contrle.

Wizard Steps
Llment enfant le plus important est bien sr la collection des tapes. Chaque tape dans le contrle Wizard a une proprit StepType qui dtermine le type de fonctionnalit de navigation quoffre ltape. Si vous ne spciez pas de valeur pour la proprit StepType, la valeur par dfaut est Auto. Le tableau suivant rpertorie les diffrentes valeurs possibles de la proprit StepType :
Diffrentes valeurs disponibles pour lnumration WizardStepType Type dtape Description

WizardStepType.Start WizardStepType.Step

Il sagit de la premire tape. Le bouton Prcdent nest donc pas affich. Une tape standard situe entre la premire et la dernire. Les boutons Prcdent et Suivant permettent de naviguer entre les tapes. Le type de cette tape est dtermin selon lordre dans lequel ltape est dclare dans le code de la page. Cest la dernire tape de saisie o lon peut rcuprer les donnes de lutilisateur. Le bouton Terminer apparat. Cest la toute dernire tape. Aucun bouton nest prsent. Vous pouvez vous en servir pour afficher un rsum des tapes par exemple.

WizardStepType.Auto

WizardStepType.Finish

WizardStepType.Complete

Le guide du codeur 339

22

Ralisation dun questionnaire laide dun contrle Wizard

Types dtapes automatiques Si vous utilisez des tapes de type Auto, la premire sera considre comme une tape de dmarrage (Start Step) et la dernire comme une tape de n (Finish Step). Pour ajouter une tape de type Complete, vous devez la dclarer explicitement.

22.3 Ralisation du questionnaire


Passons maintenant la ralisation du questionnaire. Tout dabord, vous allez slectionner un contrle Wizard dans la bote outils et le dposer dans la page.

b Figure 22-1 : Contrle Wizard dans la bote outils de Visual Studio

Par dfaut, le Wizard contient deux tapes standard vides, ce qui permet davoir un premier aperu :
<asp:Wizard ID="Wizard1" Runat="server"> <WizardSteps> <asp:WizardStep Runat="server" Title="Step 1"> </asp:WizardStep> <asp:WizardStep Runat="server" Title="Step 2"> </asp:WizardStep> </WizardSteps> </asp:Wizard>

Ajout des tapes


Le smart tag saffiche avec les diffrentes options de conguration possibles.

b Figure 22-2 : Smart tag dun contrle Wizard

340 Le guide du codeur

Ralisation du questionnaire

22

Une liste permet notamment de slectionner ltape que vous voulez modier et des liens daction permettent de changer facilement le type de ltape en cours ddition.

b Figure 22-3 : Navigation entre les tapes grce une liste du smart tag

Un lien daction permet tout dabord dajouter et de supprimer facilement des tapes laide dun diteur. Vous pouvez ainsi dnir les tapes, les organiser et modier leurs proprits comme leur identiant, leur titre ou encore leur type.

m Figure 22-4 : diteur de collections WizardStep

Il suffit de cliquer sur ltape pour pouvoir diter son contenu. Vous pouvez alors crire du texte ou mme dposer nimporte quel contrle partir de la bote outils. Vous pouvez ainsi obtenir rapidement une tape qui ressemble celle-ci dans Visual Studio :

Le guide du codeur 341

22

Ralisation dun questionnaire laide dun contrle Wizard

m Figure 22-5 : tape 1 du Wizard dans lditeur en mode Design

Au nal, le questionnaire ressemblera ce vous pouvez visualiser en mode Design.

m Figure 22-6 : tape 1 du questionnaire

Mise en forme du Wizard


An de mettre en forme le questionnaire avec un style par dfaut, vous pouvez slectionner une mise en forme automatique laide dun Assistant qui affiche certaines apparences possibles et qui dnit les proprits de style du contrle Wizard.

m Figure 22-7 : Assistant de mise en forme automatique

342 Le guide du codeur

Ralisation du questionnaire

22

Le contrle Wizard possde plusieurs proprits de style correspondant chacun de ces composants.

b Figure 22-8 : Proprits de style du contrle Wizard

Le fait de slectionner un style prdni laide de lAssistant de mise en forme automatique dtermine ces proprits de style. Un contrle Wizard vide auquel est associ le style classique ressemblerait ainsi ceci :
<asp:Wizard ID="Wizard1" runat="server" ActiveStepIndex="0" Height="400px" Width="600px" BackColor="#EFF3FB" BorderColor="#B5C7DE" BorderWidth="1px" Font-Names="Verdana" Font-Size="0.8em"> <StepStyle Font-Size="0.8em" ForeColor="#333333" /> <SideBarStyle BackColor="#507CD1" Font-Size="0.9em" VerticalAlign="Top" /> <NavigationButtonStyle BackColor="White" BorderColor="#507CD1" BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#284E98" /> <SideBarButtonStyle BackColor="#507CD1" Font-Names="Verdana" ForeColor="White" /> <HeaderStyle BackColor="#284E98" BorderColor="#EFF3FB" BorderStyle="Solid" BorderWidth="2px" Font-Bold="True" Font-Size="0.9em" ForeColor="White" HorizontalAlign="Center" /> </asp:Wizard>

Le guide du codeur 343

22

Ralisation dun questionnaire laide dun contrle Wizard

tant donn le nombre important de proprits de style et de leurs attributs, cela peut vite devenir complexe et difficile maintenir. Il est donc conseill de dclarer ces proprits dans un chier dapparence (.skin). Lisez ce sujet le chapitre Site web avec slecteur de thmes.
Renvoi

Vous pourrez ainsi appliquer facilement la mme apparence tous vos contrles
Wizard ou en crer dautres.

Personnalisation du Wizard
Le contrle Wizard contient certains lments congurables comme le HeaderTemplate. Ce modle est lendroit dans lequel vous pouvez spcier ce qui va tre affich dans len-tte du Wizard. Dautres modles, comme le StartNavigationTemplate, le StepNavigationTemplate ou le FinishNavigationTemplate, permettent de personnaliser lapparence des diffrentes tapes. Vous pouvez diter ces modles en mode Design laide de la balise active et dune liste qui affiche les diffrents templates et permet de basculer entre eux.

m Figure 22-9 : dition du HeaderTemplate

Certains sont prdnis et doivent rpondre une structure prcise si vous voulez les rednir. Il en est ainsi du SideBarTemplate, charg dafficher les diffrentes tapes dans une zone latrale et de distinguer ltape en cours. Une autre fonctionnalit intressante est la possibilit de modier la taille du contrle laide des poignes de redimensionnement prvues cet effet, comme vous le feriez pour un formulaire Windows.

b Figure 22-10 : Redimensionnement du contrle Wizard

344 Le guide du codeur

Navigation au sein du contrle Wizard

22

22.4 Navigation au sein du contrle Wizard


Le contrle Wizard tant essentiellement destin afficher des tapes successives, de nombreuses mthodes, vnements et proprits peuvent vous aider personnaliser la navigation et lenchanement des tapes.

Navigation linaire
Si vous souhaitez enregistrer les informations saisies chaque tape, sans laisser la possibilit de revenir en arrire, vous devez affecter la valeur false la proprit AllowReturn de ltape. Vous pouvez alors utiliser le gestionnaire dvnements NextButtonClick an de raliser laction en fonction de ltape quil vient de valider. Si vous voulez passer une tape, selon ce que lutilisateur a saisi, vous pouvez utiliser la mthode MoveTo ou la proprit ActiveStepIndex an de modier dynamiquement ltape suivante dans la navigation.

Navigation personnalise
Sil faut sauter des tapes selon les choix de lutilisateur ou les informations saisies, vous pouvez effectuer ce genre de navigation personnalise laide dun gestionnaire dvnements de lvnement NextButtonClick lintrieur duquel vous testerez si les conditions sont remplies pour passer une tape et indiquerez ensuite lindex de ltape suivante atteindre. Voici par exemple un gestionnaire dvnements qui teste la n de ltape 1 si une case cocher a t slectionne et passe ltape 3 si cest le cas.
Protected Sub Questionnaire_NextButtonClick( _ ByVal sender As Object, _ ByVal e As System.Web.UI.WebControls. _ WizardNavigationEventArgs)_ Handles Questionnaire.NextButtonClick If Questionnaire.ActiveStepIndex = 1 Then If cbSkipStep.Checked Then Questionnaire.ActiveStepIndex = 3 Else Questionnaire.ActiveStepIndex = 2 End If End If End Sub

Le guide du codeur 345

22

Ralisation dun questionnaire laide dun contrle Wizard

Rcapitulatif des rsultats


Aprs avoir cr plusieurs tapes, vous pouvez crire un peu de code pour afficher les choix de lutilisateur :
<asp:WizardStep runat="server" StepType="Finish" Title="Termin" ID="Finish"> Voici un rcapitulatif :<br /><br /> <b>Question 1</b> : <%=Reponse1.SelectedItem.Text%><br /> <b>Question 2</b> : <%=Reponse2.SelectedItem.Text%><br /> <b>Question 3</b> : <%=Reponse3.Text%> </asp:WizardStep>

m Figure 22-11 : cran rcapitulatif des rsultats de ltape Finish

22.5 Amlioration de lexprience utilisateur


Souvent, les dveloppeurs mettent de ct lexprience utilisateur, en se souciant peu de fournir un outil adapt ceux qui vont se servir de leurs applications. leurs yeux, cette tape importante damlioration de lexprience utilisateur nest pas prioritaire, au point den tre parfois occulte. Les dveloppeurs ont, en effet, parfois du mal se mettre la place des utilisateurs et ce qui parat vident aux premiers ne lest pas forcment pour les seconds. Vous allez maintenant dcouvrir quelques astuces simples et bien utiles pour amliorer la saisie de formulaires web. Il sagit de nouvelles fonctionnalits associes aux contrles et aux pages ASP .NET qui apparaissent avec le Framework 2.0. Toutes ces proprits ntaient pas forcment prsentes dans le Framework 1.1 et le retour dexprience des dveloppeurs a fait quelles ont t intgres dans la nouvelle version et surtout quelles ont t penses an dtre facilement congurables.
346 Le guide du codeur

Amlioration de lexprience utilisateur

22

Vous naurez ainsi plus dexcuses pour ne pas fournir des interfaces "user friendly". Voici prsent les diffrents domaines que vous devez intgrer an de dvelopper des formulaires qui permettent de saisir rapidement de linformation et de guider lutilisateur pas pas.

Contrles de validation
Les dveloppeurs sont souvent amens valider une donne saisie par lutilisateur avant de lenregistrer ou de dclencher une action. Les contrles de validation, autrement appels "validateurs", fournissent un moyen simple et efficace de vrier la validit dune entre et, si ncessaire, de renvoyer des messages derreur explicites. Certaines proprits sont communes aux diffrents types de validateurs :
Proprits communes aux contrles validateurs Proprit Description

ControlToValidate ValidationGroup

Lidentiant du contrle valider. Le groupe de validation associ. Si vous avez des zones diffrentes vrier, cela permet de sparer leur validation. Le texte afficher lendroit o le validateur est insr. Par exemple, le caractre "*" pour une donne obligatoire. Un message plus dtaill qui apparat dans le rsum des erreurs rencontres.

Text

ErrorMessage

La validation des champs dun formulaire intervient lorsque lutilisateur dclenche un vnement dont le contrle associ possde une proprit CausesValidation avec la valeur true et qui est reli au groupe de validation. Voici quelques exemples de contrles de validation souvent utiliss pour vrier la saisie de lutilisateur et afficher des messages derreur le cas chant.

RequiredFieldValidator
Le contrle RequiredFieldValidator permet de vrier quune zone de saisie a bien t remplie et ainsi de rendre cette donne obligatoire :
<asp:RequiredFieldValidator id="rfvEmail" runat="server" ControlToValidate="Email" ErrorMessage="Le champ E-mail est obligatoire.">* </asp:RequiredFieldValidator>

Le guide du codeur 347

22

Ralisation dun questionnaire laide dun contrle Wizard

RegularExpressionValidator
Le contrle RegularExpressionValidator sert contrler le format dune donne. Vous pouvez ainsi vrier quune adresse e-mail a bien t saisie sous la forme nom@domaine.ext :
<asp:RegularExpressionValidator ID="revEmail" runat="server" ControlToValidate="Email" ErrorMessage="Le champ E-mail na pas le bon format." ValidationExpression= "\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">! </asp:RegularExpressionValidator>

ValidationSummary
Le contrle ValidationSummary permet de rcuprer lensemble des erreurs survenues et de les afficher dans un rsum un seul endroit. Vous allez en insrer un dans la page matre an que chaque page de donnes puisse sen servir. De ce fait, vous le congurerez pour que le message soit renvoy sous la forme dun message dalerte :
<asp:ValidationSummary ID="vs" runat="server" DisplayMode="List" ShowMessageBox="True" ShowSummary="False"> </asp:ValidationSummary>

b Figure 22-12 : Onglet Validation de la bote outils

Proprits des contrles serveurs relatives lexprience utilisateur


Certaines proprits des principaux contrles serveurs que vous utilisez rgulirement dans un formulaire peuvent vous aider amliorer lexprience utilisateur. En voici quelques exemples avec leur description et les avantages que vous pouvez en tirer.

Bouton par dfaut


La proprit DefaultButton du formulaire de la page ou dun contrle Panel permet de spcier le bouton daction par dfaut, ce qui aura pour effet de dclencher un clic sur ce bouton lorsque lutilisateur appuiera sur la touche [Entre].
348 Le guide du codeur

Check-list

22

La proprit UseSubmitBehavior dun bouton est quivalente : elle le transforme en un bouton de type Submit.

Focus
La proprit DefaultFocus de la page permet dindiquer lidentiant du contrle qui recevra le focus par dfaut, cest--dire celui qui sera prt tre saisi. Vous ferez ainsi gagner du temps lutilisateur sil doit rgulirement intervenir sur des formulaires (ajout rapide, modication). Il prendra en effet rapidement lhabitude des tapes par lesquelles il doit passer pour raliser une action et le fait de pouvoir saisir des informations sans se servir de la souris est apprciable. La proprit SetFocusOnError dun validateur permet, quant elle, de placer le focus sur le contrle si une erreur de validation est dtecte an de pouvoir la corriger immdiatement. La page contient galement une mthode SetFocus, qui prend en paramtre un identiant de contrle.

Proprits daccessibilit
Deux proprits appartiennent la catgorie Accessibilit de chaque contrle serveur web.
b Figure 22-13 : Catgorie Accessibilit dun contrle

La proprit AccessKey permet de spcier une lettre de raccourci. Il suffit ensuite dappuyer la combinaison [Alt]+Lettre de raccourci pour accder au contrle. La proprit TabIndex sert indiquer lordre de tabulation. Vous pouvez ainsi spcier lordre dans lequel les contrles senchanent lors dun appui sur la touche [Tab] en incrmentant lindex dans les proprits TabIndex de chaque contrle "saisissable" de la page. Il est ainsi inutile de suivre lordre dapparition des contrles dans la page.

22.6 Check-list
Lutilisateur nal doit rester au centre des proccupations du dveloppeur. De nombreux nouveaux contrles et amliorations permettent de fournir des fonctionnalits abouties. Le contrle serveur Wizard est extrmement utile pour dcomposer la saisie dinformations ralise par lutilisateur.

Le guide du codeur 349

22

Ralisation dun questionnaire laide dun contrle Wizard

Dans ce chapitre, vous avez dcouvert les fonctionnalits suivantes :


j j j j j j

la dnition des diffrentes tapes du Wizard ; la personnalisation du Wizard ; les proprits de style ; la gestion des vnements ; la rcupration de la saisie de lutilisateur ; lamlioration de lexprience utilisateur dans la saisie de formulaire.

350 Le guide du codeur

Ch apit re

23 Cration dun contrle serveur personnalis


Cration de la librairie de contrles .............. Cration du contrle composite ................... Cration du designer .................................. Check-list .................................................. 352 357 365 367

23

Cration dun contrle serveur personnalis

Le Framework ASP .NET met disposition un ensemble complet de contrles serveurs web dont le but est de faciliter le dveloppement de pages web. La plupart des balises HTML ont en effet leur quivalent en tant que contrle serveur web. Certains autres contrles sont destins encapsuler des fonctionnalits assez complexes. Une multitude de nouveaux contrles font ainsi leur apparition avec la version 2.0 du Framework .NET. Le modle de programmation a galement t revu. Il propose des interfaces et des classes qui permettent de dvelopper facilement des contrles serveurs personnaliss. De nouveaux espaces de noms et de nouvelles classes ont par exemple t crs pour sparer les diffrentes fonctionnalits auxquelles on fait appel lors du dveloppement de contrles comme le design dans Visual Studio ou encore le rendu dans le navigateur. Dans ce chapitre, vous allez apprendre dvelopper un contrle serveur composite, cest--dire un contrle qui en contient dautres pour en fournir un seul un peu plus volu. Notre exemple sera celui dun contrle qui permet de saisir facilement une date. Vous aurez loccasion de dcouvrir en mme temps des techniques de programmation assez avances qui faciliteront au nal lutilisation de ce contrle par les dveloppeurs, comme la cration dun smart tag associ ou lutilisation dditeurs de proprits.

23.1 Cration de la librairie de contrles


La premire tape consiste crer la librairie qui va contenir le contrle. Pour cela, ajoutez tout dabord votre solution un projet de type Bibliothque de contrles web que vous appellerez Controls.

m Figure 23-1 : Ajout dun projet Bibliothque de contrles web

352 Le guide du codeur

Cration de la librairie de contrles

23

Vous pouvez ensuite afficher les proprits de votre librairie laide du formulaire MyProject. Pour louvrir, vous pouvez soit double-cliquer sur le dossier MyProject, soit cliquer dessus du bouton droit puis slectionner la commande Ouvrir, soit cliquer du bouton droit sur le projet puis slectionner la commande Proprits.

b Figure 23-2 : Commande Ouvrir du dossier MyProject

Linterface se compose de plusieurs onglets qui vous aideront personnaliser la librairie selon vos besoins. Voici un aperu des principaux onglets et des options quils permettent de congurer.

Conguration de la librairie
Onglet Application
Longlet Application permet notamment de grer le nom de lassembly qui sera gnr ainsi que lespace de noms racine.

m Figure 23-3 : Onglet Application

Onglet Compiler
Longlet Compiler sert grer les options de compilation. Deux congurations de gnration sont disponibles par dfaut :
j

Debug, pour gnrer lassembly avec un chier de dbogage (.pdb) associ ; Release, pour une version sans chier de dbogage et donc plus performante.

Le guide du codeur 353

23

Cration dun contrle serveur personnalis

m Figure 23-4 : Onglet Compiler

Onglet Rfrences
Longlet Rfrences permet de cocher les espaces de noms que vous voulez importer par dfaut pour ne pas avoir introduire dinstruction Imports en haut de vos pages.

Proposition des classes Si vous oubliez dimporter un espace de noms qui contient une classe que vous voulez utiliser ou que celle-ci est mal orthographie, lditeur de code de Visual Basic vous proposera automatiquement, laide dune balise, les classes qui peuvent correspondre celle que vous dsirez.

354 Le guide du codeur

Cration de la librairie de contrles

23

m Figure 23-5 : Onglet Rfrences

Vous devez galement faire rfrence lassembly System.Design.dll pour avoir disposition lespace de noms System.Web.UI.Design et ses classes associes. Pour cela, cliquez sur le bouton Ajouter puis sur la commande Rfrence.

b Figure 23-6 : Bouton Ajouter/Rfrence

La mme commande est accessible partir de lExplorateur de solutions : cliquez du bouton droit sur le projet et slectionnez la commande Ajouter une rfrence.

b Figure 23-7 : Commande Ajouter une rfrence

Une bote de dialogue de slection avec plusieurs onglets vous propose alors les assemblys auxquels vous pouvez faire rfrence.

Le guide du codeur 355

23

Cration dun contrle serveur personnalis

m Figure 23-8 : Bote de dialogue Ajouter une rfrence

Fichier AssemblyInfo.vb
Il est stock dans le dossier MyProject. Pour y accder, affichez tous les chiers du projet laide du bouton situ dans la barre du haut, disponible lorsque le projet est slectionn.
b Figure 23-9 : Bouton Afficher tous les chiers

Ce dossier contient les designers qui permettent dafficher les onglets et les diteurs de ressources ou de settings.

b Figure 23-10 : Fichiers du dossier MyProject

Le chier AssemblyInfo.vb permet de spcier certaines informations sur lassembly qui va tre gnr, comme le nom, lditeur ou la version, laide de diffrents attributs. Un attribut sert dnir ce que lon appelle une mtadonne sur une certaine partie de code. Les attributs sont associs diffrentes fonctionnalits :
j j

les attributs dinformation, pour apporter des prcisions sur la donne ; les attributs de permission, pour dnir les droits daccs llment ;

356 Le guide du codeur

Cration du contrle composite

23

j j

les attributs de personnalisation, pour dnir un comportement particulier ; les attributs systme.

Ils peuvent tre placs devant une classe, une mthode, un membre ou tout autre lment de code. Leur syntaxe de dclaration est toujours la mme :
<Attribut1(), _ Attribut2(param)> _ Class | Property | Function |

Lattribut TagPrefix, par exemple, permet de spcier le prxe par dfaut de la librairie de contrle, qui sera appliqu tous vos contrles personnaliss, pour empcher quils prennent celui par dfaut (cc1).
<assembly: TagPrefix("Namespace.MyControls", "prefix")>

Un contrle dpos dans lditeur ajoutera la directive Register et la balise du contrle avec la syntaxe suivante :
<%@ Register Assembly="Controls" Namespace="Controls" TagPrefix="prefix" %> <prefix:MyControl ID="MyControl" runat="server" />

23.2 Cration du contrle composite


Vous pouvez maintenant crer votre contrle composite. Ajoutez donc une classe DatePicker votre librairie.

m Figure 23-11 : Ajout de la classe DatePicker Le guide du codeur 357

23

Cration dun contrle serveur personnalis

Vous allez raliser un contrle qui permet de saisir une date. Il sera compos dune zone de texte dans laquelle il sera possible de faire une saisie manuelle et dune image qui affichera un calendrier partir duquel vous pourrez slectionner une date. Voici les tapes de dveloppement successives dcomposes en plusieurs parties pour mieux comprendre le rle de chacune.

Hritage de la classe
Tout dabord, votre classe doit hriter de la classe abstraite CompositeControl :
Public Class DatePicker Inherits CompositeControl End Class

Ajout des contrles enfants


Ajoutez ensuite les trois contrles en tant que membres privs. Les contrles ImageButton et Calendar sont dclars WithEvents car vous allez leur associer des vnements.
Private tbDate As TextBox Private WithEvents imgBtnCalendar As ImageButton Private WithEvents calendar As Calendar

Substituez la mthode CreateChildControl pour y crer les contrles et les ajouter au contrle composite :
Protected Overrides Sub CreateChildControls() Controls.Clear() tbDate = New TextBox tbDate.ID = "tbDate" Controls.Add(tbDate) imgBtnCalendar = New ImageButton imgBtnCalendar.ID = "imgBtnCalendar" Controls.Add(imgBtnCalendar) calendar = New Calendar calendar.ID = "calendar" calendar.Visible = False Controls.Add(calendar) End Sub

358 Le guide du codeur

Cration du contrle composite

23

Ajout des proprits


Ajoutez les proprits publiques que vous voulez rendre congurables par les dveloppeurs. Les valeurs de ces proprits seront stockes dans ltat daffichage (ViewState). Voici par exemple la proprit Text :
Public Property [Text]() As String Get Dim obj As Object = ViewState("Text") If Not IsNothing(obj) Then Return CType(obj, String) End If Return "" End Get Set(ByVal Value As String) ViewState("Text") = Value End Set End Property

Vous mettrez galement disposition une proprit ImageUrl, qui permettra dassocier lURL de limage lImageButton, et une proprit SelectedDate, qui renverra la date slectionne.

Attributs de classe
Congurez prsent les attributs de la classe. Il est intressant dimporter lespace de noms System.ComponentModel, qui contient de nombreux attributs dont vous aurez besoin. Ces attributs servent congurer diffrentes options. Ils ncessitent parfois certains paramtres.
<DefaultProperty("Text"), _ ToolboxData( _ "<{0}:DatePicker runat=server></{0}:DatePicker>"), _ ToolboxBitmap(GetType(DatePicker), "DatePicker.bmp"), _ Designer(GetType(DatePickerDesigner))> _ Public Class DatePicker

DefaultProperty
Lattribut DefaultProperty permet de spcier la proprit par dfaut du contrle.

ControlValueProperty
Lattribut ControlValueProperty est utilis pour dterminer quil sagit de la proprit par dfaut lorsque le contrle est slectionn en tant que ControlParameter dune source de donnes (DataSource). Vous pouvez spcier le nom, le type et la valeur par dfaut.
Le guide du codeur 359

23

Cration dun contrle serveur personnalis

ToolboxBitmap
Lattribut ToolboxBitmap permet dafficher une icne spcique pour le contrle dans la bote outils de Visual Studio an de remplacer licne utilise par dfaut. Pour cela, vous devez avoir disposition une image bitmap de 16 16 pixels en 16 couleurs. Vous pouvez copier une image ou la dessiner vous-mme.

m Figure 23-12 : Ajout dune image bitmap

Placez-la dans la racine de votre projet puis dclarez-la comme ressource incorpore dans la proprit Action de gnration.

b Figure 23-13 : Ressource incorpore

Enn, ajoutez lattribut devant le nom de la classe du contrle avec, en paramtre, le type du contrle et le nom de limage associe.
<ToolboxBitmap(gettype(MyControl), "MyControl.bmp")>

360 Le guide du codeur

Cration du contrle composite

23

ToolboxData
Lattribut ToolboxData sert personnaliser les balises gnres par Visual Studio quand vous ajoutez une instance de votre contrle dans lditeur. Le {0} sera remplac par le prxe spci.
<ToolboxData( _ "<{0}:DatePicker runat=""server""></{0}:DatePicker>")>

Attributs de proprit
Les proprits peuvent tre personnalises avec des nombreux attributs, qui ont notamment des impacts sur lditeur de proprits. Voici les attributs associs la proprit Text :
<Description("Le texte du bouton."), _ Category("Appearance"), _ DefaultValue(""), _ Browsable(True), _ Bindable(True), _ Localizable(True)> _ Public Property [Text]() As String

Le tableau suivant prsente la plupart des attributs de proprit :


Attributs appliqus des proprits Attribut Description

BrowsableAttribute CategoryAttribute DescriptionAttribute

Spcie si une proprit ou un vnement doivent tre affichs dans lExplorateur de proprits. Spcie le nom de la catgorie dans laquelle regrouper une proprit ou un vnement. Dnit un petit bloc de texte afficher en bas de lExplorateur de proprits lorsque lutilisateur slectionne une proprit ou un vnement. Spcie si une proprit est intressante lier. Spcie la proprit par dfaut pour le composant. Cette proprit est slectionne dans lExplorateur de proprits lorsquun utilisateur clique sur le contrle. Affecte une valeur par dfaut simple une proprit. Spcie lditeur utiliser pour modier une proprit.

BindableAttribute DefaultPropertyAttribute

DefaultValueAttribute EditorAttribute

Le guide du codeur 361

23

Cration dun contrle serveur personnalis

Attributs appliqus des proprits Attribut Description

LocalizableAttribute

Spcie quune proprit peut tre localise. Toutes les proprits qui possdent cet attribut sont automatiquement rendues persistantes dans le chier de ressources lorsquun utilisateur choisit de localiser un formulaire. Spcie si (et comment) une proprit affiche dans lExplorateur de proprits doit tre persistante dans le code. Spcie le convertisseur de type utiliser pour convertir le type de la proprit dans un autre type de donne. Spcie lvnement par dfaut pour le composant. Il sagit de lvnement qui est slectionn dans lExplorateur de proprits lorsquun utilisateur clique sur le composant.

DesignerSerialization VisibilityAttribute TypeConverterAttribute

DefaultEventAttribute

Ajout dun diteur de proprits


Pour ajouter un diteur spcique la proprit ImageUrl, vous pouvez utiliser lattribut Editor avec comme type dditeur un ImageUrlEditor :
EditorAttribute(GetType( _ System.Web.UI.Design.ImageUrlEditor), GetType( _ System.Drawing.Design.UITypeEditor)

Lorsque vous utiliserez votre contrle, lditeur de proprits vous proposera de slectionner lURL de limage partir dune bote de dialogue.

m Figure 23-14 : Bote de dialogue Slectionner une image

362 Le guide du codeur

Cration du contrle composite

23

diteurs de proprits Il existe de nombreux autres diteurs de proprits dans lespace de noms

System.Web.UI.Design. Vous pouvez galement dvelopper votre propre


diteur.

Gestion du rendu du contrle


Vous devez ensuite substituer la mthode OnPreRender dans laquelle vous initialiserez les proprits par dfaut de contrles enfants, comme ladresse de limage.
Protected Overrides Sub OnPreRender(ByVal e As EventArgs) MyBase.OnPreRender(e) tbDate.Columns = 8 tbDate.Enabled = Enabled imgBtnCalendar.AlternateText = Text If Not String.IsNullOrEmpty(ImageUrl) Then imgBtnCalendar.ImageUrl = ImageUrl End If End Sub Protected Overrides Sub Render( _ ByVal writer As HtmlTextWriter) MyBase.Render(writer) End Sub

Gestion des vnements


Il faut galement ajouter deux mthodes :
j j

Sur le clic de limage, il faut afficher le calendrier. Lors de la slection dune date dans le calendrier, il faut le cacher et afficher cette date dans la TextBox.

Vous devez pour cela ajouter deux mthodes de gestion dvnements et associer les vnements ces gestionnaires :
Dans la mthode CreateChildControls AddHandler imgBtnCalendar.Click, _ AddressOf onImageButtonClick AddHandler calendar.SelectionChanged, _ AddressOf onSelectionChanged
Le guide du codeur 363

23

Cration dun contrle serveur personnalis

Gestionnaires dvnements Private Sub onImageButtonClick( _ ByVal sender As System.Object, _ ByVal e As System.Web.UI.ImageClickEventArgs) calendar.Visible = True End Sub Private Sub onSelectionChanged( _ ByVal sender As System.Object, ByVal e As System.EventArgs) tbDate.Text = calendar.SelectedDate.ToShortDateString calendar.Visible = False OnDateChanged(EventArgs.Empty) End Sub

Ajout dune image par dfaut


Vous pouvez ajouter une image par dfaut en tant que ressource web. Les ressources web sont une nouveaut en ASP .NET 2.0 et permettent dintgrer facilement des chiers dans votre librairie de contrles et de les utiliser. Vous devez dabord procder de la mme faon que pour licne, en ajoutant une image et en la transformant en ressource incorpore. Dclarez ensuite la ressource au niveau de lassembly dans le chier AssemblyInfo.vb, laide de lattribut WebResource : <assembly: WebResource("Calendar.gif", "image/gif")>

Vous pourrez ainsi nommer la ressource (attention, il faut lui ajouter comme prxe lespace de noms) et prciser son type MIME. Pour vous servir de la ressource, utilisez la mthode GetWebResourceUrl, qui rcupre lURL daccs la ressource :
imgBtnCalendar.ImageUrl = _ Page.ClientScript.GetWebResourceUrl( _ Me.Gettype, "Calendar.jpg")

Ajout dans un projet


Votre contrle est termin. Vous pouvez crer un site web et utiliser le contrle dans une page. Visual Studio a ajout une rfrence au contrle sous longlet Composants Controls de la bote outils. Il est ainsi facile de le glisserdposer dans votre page.

b Figure 23-15 : Onglet Composants Controls de la bote outils

364 Le guide du codeur

Cration du designer

23

Lorsque vous afficherez la page dans votre navigateur, vous pourrez cliquer sur limage et slectionner une date grce au calendrier

b Figure 23-16 : Contrle DatePicker

23.3 Cration du designer


Si vous dsirez prsent faciliter la personnalisation des proprits de votre contrle, vous pouvez lui associer un smart tag, autrement dit une balise active. Un smart tag correspond un volet de lditeur de Visual Studio. Il sert afficher les tches courantes associes un contrle. Les balises actives permettent aux composants et aux contrles dafficher des informations contextuelles et des commandes pour les utilisateurs. La plupart des contrles serveurs possdent donc un smart tag, accessible grce une petite che place en haut droite des contrles. Vous allez tout dabord crer la classe choisie prcdemment avec lattribut
Designer.

Substituez ensuite la proprit ActionLists de type DesignerActionListCollection, qui donne accs la liste des lments du smart tag.
Private lists As DesignerActionListCollection Public Overrides ReadOnly Property ActionLists() _ As DesignerActionListCollection Get If lists Is Nothing Then lists = New DesignerActionListCollection() lists.Add( _ New DatePickerActionList(Me.Component)) End If Return lists End Get End Property

Elle fait appel une classe DatePickerActionList. Cette classe peut tre interne puisquelle nest pas utilise ailleurs. Elle doit hriter de la classe System.
Le guide du codeur 365

23

Cration dun contrle serveur personnalis

ComponentModel.Design.DesignerActionList.
Public Class DatePickerActionList Inherits System.ComponentModel.Design.DesignerActionList

Rednissez la mthode GetSortedActionItems. Elle va remplir les lments du smart tag.


Public Overrides Function GetSortedActionItems() _ As DesignerActionItemCollection Dim items As New DesignerActionItemCollection() items.Add(New DesignerActionHeaderItem("Proprits")) items.Add( _ New DesignerActionPropertyItem( _ "Text", _ "Texte", _ "Appearance", _ "Texte")) Return items End Function

Vous pouvez ajouter diffrents lments qui ont chacun leur spcicit. Ainsi, un smart tag permet non seulement dexposer des proprits et de les regrouper par catgories, comme dans la fentre de proprits standard de Visual Studio, mais galement den amliorer laffichage et lefficacit. Voici les diffrentes classes que vous pouvez utiliser pour ajouter un lment une liste dlments dun smart tag.
Classes utilises pour crer des lments dans un smart tag Classe Description

DesignerActionItem DesignerActionList DesignerActionService

Reprsente un lment de panneau sur un panneau des balises actives. Dnit une liste dlments utiliss pour crer un panneau des balises actives. tablit un service au moment du design, qui gre la collection dobjets DesignerActionItem pour les composants. Reprsente un lment de texte statique sur un panneau. Reprsente un lment de panneau associ une proprit dans une classe drive de DesignerActionList.

DesignerActionTextItem DesignerActionPropertyItem

366 Le guide du codeur

Check-list

23

Classes utilises pour crer des lments dans un smart tag Classe Description

DesignerActionMethodItem

Reprsente un lment de panneau associ une mthode dans une classe drive de DesignerActionList. Reprsente un lment den-tte statique sur un panneau des balises actives.

DesignerActionHeaderItem

Vous obtenez ainsi un smart tag permettant de modier facilement la proprit Text.

b Figure 23-17 : Smart tag du contrle DatePicker

23.4 Check-list
Dans ce chapitre, vous avez dcouvert des nouvelles mthodes de dveloppement des contrles serveurs personnaliss. Vous pouvez dvelopper simplement des contrles qui correspondent vos propres besoins et qui encapsulent des fonctionnalits intressantes. Voici un aperu des notions que vous avez pu acqurir :
j j j j j j j

cration dun contrle composite ; affectation dattributs de classe et de proprit ; association dun diteur de proprits ; ajout et utilisation de ressources web ; association dune icne un contrle serveur personnalis ; designer de contrle ; cration de smart tag.

Le guide du codeur 367

Ch apit re

24
Fichiers compresss et modles de projets Visual Studio
Classes et espaces de noms utiliss ............. Utilitaire de compression de chiers ............. Utilisation de chiers compresss par Visual Studio ....................................... Check-list .................................................. 370 370 373 386

24

Fichiers compresss et modle de projets Visual Studio

Pour comprendre quel point le Framework .NET 2.0 est vaste et permet de dvelopper la plupart des applications couramment utilises par un ordinateur, vous allez raliser un utilitaire de compression et de dcompression de chiers. Cette fonctionnalit de compression de chiers ntait pas disponible dans la version 1.1 du Framework, mais comme vous le verrez tout au long de ce chapitre, il est dsormais facile de raliser ce genre de tche. La compression permet de minimiser la taille de chiers et de rpertoires pour pouvoir par exemple les transfrer plus facilement ou encore lorsque lespace de stockage est limit. Lenvironnement de dveloppement intgr Visual Studio utilise lui-mme de nombreux chiers compresss. Nous aurons loccasion dexpliquer de quels genres de chiers Visual Studio se sert pour, par exemple, grer ses modles de projets et de chiers. Nous ferons galement le point sur la fonctionnalit dexportation de modles de projets, disponible dans les dernires versions de Visual Studio.

24.1 Classes et espaces de noms utiliss


Lespace de noms System.IO.Compression contient les nouvelles classes auxquelles vous ferez appel tout au long de ce chapitre. Seuls deux algorithmes de compression sont pris en charge : Deate et Gzip. Si vous tes habitu manipuler des chiers grce aux nombreuses classes mises disposition par lespace de noms System.IO, vous naurez aucun souci pour comprendre comment fonctionne la compression de chiers.

24.2 Utilitaire de compression de chiers


Lapplication WinForm que vous allez dvelopper permettra de compresser un chier au format GZIP puis de le dcompresser.

Cration du formulaire
Le formulaire WinForm contient les contrles suivants :
j j

des zones de saisie pour slectionner le chemin du chier ; des boutons douverture de bote de dialogue dexploration pour trouver plus facilement un chier ;

370 Le guide du codeur

Utilitaire de compression de chiers

24

des boutons qui dclenchent la compression ou la dcompression.

Linterface utilisateur obtenue est basique :

m Figure 24-1 : Formulaire de lutilitaire de compression

Pour faciliter la recherche de chiers sur le disque an que lutilisateur nait pas saisir manuellement le chemin physique du chier, vous pouvez dposer un composant OpenFileDialog dans votre formulaire. Pour ne lister que certains types de chiers, vous pouvez congurer les paramtres ad hoc, comme les extensions de chiers acceptes. La proprit Filter permet par exemple dtre sr que le chier slectionn dans la zone de saisie du chier dcompresser a bien une extension .gzip. La valeur passer correspond au libell descriptif que vous voulez voir afficher, suivi du modle de nom de chier respecter, le tout spar par le caractre "|", par exemple : Fichier gzip|*.gzip, dans ce cas.

b Figure 24-2 : Proprit Filter dun composant OpenFileDialog

Le code pour ouvrir la bote de dialogue et rcuprer sa valeur ressemble celui-ci :


Private Sub BrowseSource_Click(ByVal sender _ As System.Object, ByVal e As System.EventArgs) _ Handles btnBrowseFile.Click If Me.OpenFileDialog.ShowDialog = DialogResult.OK Then Me.tbFileToZip.Text = Me.OpenFileDialog.FileName End If End Sub

Dautres botes de dialogue existent pour raliser ce genre dopration, comme slectionner un emplacement denregistrement de chier (SaveFileDialog) ou slectionner un dossier (FolderBrowserDialog). Elles sont disponibles sous longlet Botes de dialogue de la bote outils.
Le guide du codeur 371

24

Fichiers compresss et modle de projets Visual Studio

b Figure 24-3 : Onglet Botes de dialogue de la bote outils

Compression dun chier


La compression consiste transformer le chier en un ux an de stocker son contenu dans un tableau doctets, puis dclarer un ux de compression et y crire la totalit du chier.
Dim zipFileName As String = Path.GetFileName(fileToZip) & _ ".gzip" Rcupration du fichier compresser dans un flux Dim sourceStream As FileStream = _ New FileStream(fileToZip, FileMode.Open, _ FileAccess.Read, FileShare.Read) Dim buffer As Byte() = New Byte(sourceStream.Length) {} Dim length As Integer = sourceStream.Read(buffer, 0, _ buffer.Length) Ouverture du flux de sortie Dim destinationStream As FileStream = _ New FileStream(zipFileName, FileMode.OpenOrCreate, _ FileAccess.Write) Cration dun flux de compression Dim compressedStream As GZipStream = _ New GZipStream(destinationStream, _ CompressionMode.Compress, True) criture des donnes compresses vers le fichier de destination compressedStream.Write(buffer, 0, buffer.Length)

Le chier compress dans larchive au format GZIP portera le mme nom que larchive, mais sans lextension .gzip. Cest pourquoi il est prfrable de nommer larchive avec le nom de chier original accompagn de lextension .gzip. Ainsi, aprs avoir t dcompress, le chier portera bien le nom original et ne perdra pas son extension initiale.

372 Le guide du codeur

Utilisation de chiers compresss par Visual Studio

24

Dcompression dun chier


La dcompression ralise lopration inverse. Le morceau de code le plus important est donc :
decompressedStream = New GZipStream(sourceStream, _ CompressionMode.Decompress, True)

On dclare le ux de dcompression dont on va servir pour, tout dabord, lire le contenu du chier compress, puis lenregistrer dans un chier qui sera donc la copie de loriginal. Les chiers compresss (que ce soit dans un format ou dans un autre) sont prsents dans tous les logiciels avancs ds quil sagit de stocker des donnes dans un minimum despace. Voyons quels genres de chiers compresss vous pouvez retrouver dans Visual Studio. Par l mme, vous comprendrez mieux le fonctionnement des projets et de leurs lments, et dcouvrirez quil est possible dtendre Visual Studio en fonction de vos propres besoins ou de partager vos ressources.

24.3 Utilisation de chiers compresss par Visual Studio


Visual Studio inclut par dfaut de nombreux modles prdnis de projets ou dlments de projet. la cration de chaque projet, vous slectionnez le modle de projet qui convient le mieux votre application pour dvelopper un site web, une bibliothque de classes ou de contrles ou encore une application WinForm. Vous ajoutez ensuite les lments de projet appropris, comme des pages des formulaires WebForm ou WinForm, des classes ou tout autre chier pris en charge par Visual Studio. En plus des modles installs disponibles et accessibles grce aux botes de dialogue Nouveau projet et Ajouter un nouvel lment, vous pouvez accder aux modles que vous avez crs ou dautres qui ont t dvelopps, comme des Starters Kits.

ProjectTemplates et ItemTemplates
Le rpertoire principal de Visual Studio est C:\Program Files\Microsoft Visual
Studio 8\.

Par dfaut, les modles de projets et dlments de projet Visual Basic sont stocks dans les sous-rpertoires Common7\IDE\VWDExpress\ItemTemplates\ Web\VisualBasic\1036 et Common7\IDE\VWDExpress\ProjectTemplates\Web\ VisualBasic\1036.
Le guide du codeur 373

24

Fichiers compresss et modle de projets Visual Studio

Vous y retrouverez par exemple lensemble des lments que vous pouvez ajouter un site web :

b Figure 24-4 : lments de projet web

Identicateur de paramtres rgionaux Le nombre 1036 qui gure dans certains noms de dossier correspond en fait lidenticateur de paramtres rgionaux (LCID) de la culture franaise. De nombreux autres dossiers portent le nombre 1033 rserv la culture anglaise.

Templates Visual Studio


Une fonctionnalit intressante fait son apparition dans les nouvelles versions de Visual Studio. Vous avez en effet la possibilit de crer vos propres modles de projets en exportant un projet existant dont vous voudriez vous servir comme base pour de futurs projets. Voici les diffrentes tapes qui permettent de crer un modle de projet : 1 La commande Exporter le modle du menu Fichier ouvre un Assistant qui va vous aider personnaliser lexportation de votre modle de projet.

b Figure 24-5 : Commande Exporter le modle du menu Fichier

374 Le guide du codeur

Utilisation de chiers compresss par Visual Studio

24

2 La premire tape est la slection du type de modle exporter. Vous avez le choix entre exporter un projet ou un lment de projet. Vous pouvez galement choisir le langage cible utiliser.

m Figure 24-6 : Assistant dexportation de modle

3 Si vous exportez un lment de projet, deux tapes supplmentaires de conguration sont ncessaires. La premire sert slectionner llment exporter dans une arborescence des chiers disponibles prcds par des cases cocher de slection.

m Figure 24-7 : Assistant dexportation de modle : Slectionner llment exporter

Le guide du codeur 375

24

Fichiers compresss et modle de projets Visual Studio

4 Lautre tape intermdiaire permet de slectionner des rfrences dont vous voulez vrier lexistence et de les inclure, si elles nexistent pas, lors de linsertion de llment. Vous vous assurez ainsi quil ny aura pas derreur de compilation pour cause de rfrence manquante.

m Figure 24-8 : Assistant dexportation de modle : Slectionner les rfrences aux lments

5 La dernire tape Slectionner les options du modle permet de spcier certaines informations sur le modle exporter, comme son nom, sa description ou une icne autre que celle par dfaut.

m Figure 24-9 : Assistant dexportation de modle : Slectionner les options du modle

376 Le guide du codeur

Utilisation de chiers compresss par Visual Studio

24

Lemplacement du chier ZIP gnr se situe dans [Mes documents]\Visual Studio 2005\My Exported Templates. Si vous dcompressez larchive obtenue, vous retrouverez lensemble des chiers qui constituent le projet ainsi quun chier avec une extension .vstemplate.

b Figure 24-10 : Fichiers contenus dans le modle de projet

Fichier vstemplate
Chaque modle inclut un chier avec une extension .vstemplate, dot de mtadonnes, qui fournit Visual Studio les informations requises pour afficher le modle dans les botes de dialogue Nouveau projet et Ajouter un nouvel lment et crer un projet ou un lment partir du modle.

Structure dun chier .vstemplate Le chier .vstemplate des modles de projets se compose de trois lments fondamentaux :
j j

VSTemplate dsigne le type de modle (de projet ou dlment). TemplateData dnit la catgorie dans laquelle sera situ le modle de projet et les proprits daffichage de la bote de dialogue Nouveau projet ou Ajouter un nouvel lment. TemplateContent regroupe lensemble des chiers inclus dans le modle.

La structure XML dun chier .vstemplate est donc la suivante :


<VSTemplate Type="Project" Version="2.0.0" xmlns="http://schemas.microsoft.com/ developer/vstemplate/2005"> <TemplateData> </TemplateData> <TemplateContent> </TemplateContent> </VSTemplate>

Le guide du codeur 377

24

Fichiers compresss et modle de projets Visual Studio

Assistants En plus des lments XML fondamentaux dun modle, vous pouvez utiliser les lments WizardExtension et WizardData pour ajouter les fonctionnalits personnalises lAssistant de modle qui cre un projet ou un lment partir du modle. Pour cela, vous devez crer vous-mme un assembly qui implmente linterface IWizard, et en faire rfrence dans le chier .vstemplate. ProjectSubType Llment ProjectSubType peut avoir les valeurs suivantes :
j j j j j

Windows pour les applications WinForm ; Office pour les applications Visual Studio Tools For Office ; Database pour les bases de donnes ; Smart Devices pour les applications destines aux priphriques mobiles ; Web pour les sites web.

Voici un exemple de chier .vstemplate pour un lment de projet :


<VSTemplate Version="2.0.0" Type="Item" Version="2.0.0"> <TemplateData> <Name>Nom du fichier</Name> <Description>Description</Description> <Icon>icone.ico</Icon> <ProjectType>VBasic</ProjectType> <ProjectSubType>Windows</ProjectSubType> <DefaultName>defaultName.vb</DefaultName> </TemplateData> <TemplateContent> <ProjectItem>Modele.vb</ProjectItem> </TemplateContent> </VSTemplate>

Ce tableau prsente les diffrents lments XML que peut contenir un chier .vstemplate :
lments dun chier .vstemplate lment lment enfant Attribut

Assembly BuildOnLoad CreateInPlace CreateNewFolder CustomParameter Name, Value

378 Le guide du codeur

Utilisation de chiers compresss par Visual Studio

24

lments dun chier .vstemplate lment lment enfant Attribut

CustomParameters DefaultName Description EnableLocationBrowseButton Folder FullClassName Hidden Icon LocationField LocationFieldMRUPrefix Name NumberOfParentCategories ToRollUp Project ProjectCollection ProjectItem (modle

CustomParameter Package | ID ProjectItem | Folder Name

Package | ID

Package | ID

Folder | ProjectItem ProjectTemplateLink | SolutionFolder

File | TargetFileName | ReplaceParameters

dlment)
ProjectItem (modle de

SubType | ReplaceParameters | TargetFileName TargetFileName | ReplaceParameters | OpenInEditor | OpenOrder | OpenInWebBrowser | OpenInHelpBrowser ProjectName

projet)

ProjectSubType ProjectTemplateLink ProjectType PromptForSaveOnCreation ProvideDefaultName Reference References ShowByDefault SolutionFolder ProjectTemplateLink | SolutionFolder Name Assembly Reference

Le guide du codeur 379

24

Fichiers compresss et modle de projets Visual Studio

lments dun chier .vstemplate lment lment enfant Attribut

SortOrder SupportsCodeSeparation SupportsLanguageDropDown SupportsMasterPage TemplateContent ProjectCollection | Project | Rfrences | ProjectItem | CustomParameters Name | Description | Icon | ProjectType | ProjectSubType | TemplateID | TemplateGroupID | SortOrder | CreateNewFolder | DefaultName | ProvideDefaultName | PromptForSaveOnCreation

TemplateData

|
EnableLocationBrowseButton | Hidden | DisplayInParentCategories | LocationFieldMRUPrefix

|
NumberOfParentCategories ToRollUp | CreateInPlace | BuildOnLoad | ShowByDefault | LocationField | SupportsMasterPage | SupportsCodeSeparation | SupportsLanguageDropDown TemplateGroupID TemplateID VSTemplate TemplateData | TemplateContent | WizardExtension | WizardData Assembly | FullClassName Type | Version

WizardData WizardExtension

Name

380 Le guide du codeur

Utilisation de chiers compresss par Visual Studio

24

Fichiers dinstallation .vsi


Les chiers dinstallation (.vsi) de Visual Studio sont utiliss pour changer facilement un contenu Visual Studio. Il sagit en ralit dun chier .zip renomm qui contient les chiers que vous voulez mettre disposition, mais galement un chier spcial avec une extension .vscontent, qui doit rpondre un schma XML prcis. Ce chier .vscontent fait de larchive .vsi un vritable programme dinstallation, qui permet dinstaller votre contenu un emplacement appropri dtect automatiquement par Visual Studio.

lments dun chier .vscontent


Llment racine peut contenir un ou plusieurs lments Content qui servent dnir les contenus installer.
lments dun chier .vscontent lment Description

FileName DisplayName Description

Sert dnir les chiers copier. Nom du contenu afficher dans le programme dinstallation de contenu de Visual Studio. Description du contenu qui saffiche en tant quinfo-bulle dans le programme dinstallation de contenu de Visual Studio. Type de contenu parmi les valeurs suivantes : VSTemplate : si le contenu est un Starter Kit ou un modle Visual Studio. Code Snippet : si le contenu est un extrait de code. Toolbox Control : si le contenu est un contrle de bote outils. Addin : si le contenu est un complment. Macro Project : si le contenu est un projet de macro. Version du contenu. Peut contenir aucun ou plusieurs lments Attributes. Information sur le contenu. Il utilise des attributs de nom et de valeur pour ajouter les informations de contenu personnalises. Exemple : <Attributes>

FileContentType

ContentVersion Attributes Attribute

<Attribute name="TemplateType" value="Project"/> </Attributes> Un contenu dot dune valeur FileContentType de Code Snippet requiert lattribut lang, qui spcifie le langage de programmation de lextrait de code : VB, CSHARP, JSHARP ou XML.

Le guide du codeur 381

24

Fichiers compresss et modle de projets Visual Studio

Cration dun chier dinstallation


Vous devez dnir des valeurs et des attributs spciques dans le chier .vscontent an de dterminer comment et quel emplacement installer le modle. Dans le chier .vscontent, vous devez effectuer les oprations suivantes : 1 Spciez dans llment FileName le nom de chier compress qui contient le modle. 2 Attribuez llment FileContentType la valeur VSTemplate. 3 Ajoutez les lments Attribute suivants : ProjectType : spcie le type de projet, savoir Visual Basic, Visual C#, Visual J# ou Visual Web Developer. ProjectSubType : spcie la sous-catgorie dans laquelle sera plac le modle dans la bote de dialogue Nouveau projet. TemplateType : spcie le type de modle, savoir Project pour les modles de projets, ou Item pour les modles dlments de projet. Lexemple de code suivant montre quoi doit ressembler le chier .vscontent qui va servir congurer linstallation du modle que vous venez de crer dans la catgorie racine Visual Basic de la bote de dialogue Nouveau projet :
<VSContent xmlns="http://schemas.microsoft.com/ developer/vscontent/2005"> <Content> <FileName>Modele.zip</FileName> <DisplayName>Modle de site web</DisplayName> <Description>Modle de site web</Description> <FileContentType>VSTemplate</FileContentType> <ContentVersion>1.0</ContentVersion> <Attributes> <Attribute name="TemplateType" value="Project"/> <Attribute name="ProjectType" value="Visual Web Developer"/> <Attribute name="ProjectSubType" value="VisualBasic"/> </Attributes> </Content> </VSContent>

Aprs avoir enregistr ce chier au mme emplacement que le modle de projet, ajoutez-les une archive compresse puis renommez-la avec une

382 Le guide du codeur

Utilisation de chiers compresss par Visual Studio

24

extension .vsi. Le chier apparat alors avec une icne signiant quil est reconnu par Visual Studio.

b Figure 24-11 : Fichier VSI

Installation partir dun chier .vsi


Linstallation du modle sur un autre poste est simple. Il suffit dexcuter le chier dinstallation et de suivre les tapes. 1 La premire tape affiche le ou les lments qui vont tre installs. Vous avez la possibilit de ne slectionner que ceux qui vous intressent.

m Figure 24-12 : Slection du contenu installer

2 Si le projet na pas t sign, un message dalerte vous le signale.

b Figure 24-13 : Message dalerte "Signature introuvable" Le guide du codeur 383

24

Fichiers compresss et modle de projets Visual Studio

3 Si vous excutez une seconde fois cette installation ou si un chier .zip du mme nom que le modle existe dj, une bote de dialogue vous demande de quelle faon vous voulez agir. Sil sagit dun remplacement, nous conseillons de choisir Remplacer le chier portant le mme nom.

b Figure 24-14 : Bote de dialogue Le chier existe

4 Enn, validez linstallation et observez le droulement de lopration.

m Figure 24-15 : Droulement de linstallation

5 Si vous cliquez sur le lien Installation termine, une fentre rcapitulative souvre indiquant notamment les rpertoires dans lesquels le modle a t copi.

384 Le guide du codeur

Utilisation de chiers compresss par Visual Studio

24

b Figure 24-16 : Rapport sur ltat dinstallation

Starter Kits
Un Starter Kit nest autre quun modle de projet un peu amlior. La diffrence est notamment quun Starter Kit inclut souvent en complment une documentation dtaille de lapplication mise disposition.

Recherche et partage de Starter Kits


Dans la bote de dialogue Nouveau projet, vous trouverez une liste de Starter Kits installs avec Visual Studio. Vous pourrez rechercher et tlcharger des Starter Kits partir de sites web qui prennent en charge les services Web Visual Studio.

Utilisation de Starter Kits pour crer des projets


Visual Studio 2005 inclut plusieurs Starter Kits utiliser comme exemple. Pour crer un projet partir dun Starter Kit inclus dans Visual Studio, slectionnez la commande Nouveau/Fichier du menu Fichier. Dans la liste Types de projet de la bote de dialogue Nouveau projet, dveloppez les nuds correspondant au langage de programmation souhait, puis cliquez sur Starter Kits. Slectionnez un Starter Kit, entrez le nom du nouveau projet et cliquez sur OK.

Le guide du codeur 385

24

Fichiers compresss et modle de projets Visual Studio

m Figure 24-17 : Ajouter un nouveau projet Starter Kit

24.4 Check-list
Le Framework 1.1 ne permettait pas de compresser et de dcompresser des chiers. Dsormais, cela est possible grce aux nouvelles classes de lespace de noms System.IO.Compression. Lutilisation des chiers compresss est couramment rpandue pour rpondre diffrentes problmatiques doptimisation. Mme Visual Studio a recours certains chiers compresss pour stocker ces modles de projets. Vous avez dcouvert les diffrentes faons de crer vos propres modles de projets et appris les accompagner de programme dinstallation ou personnaliser leur ouverture. Plus prcisment, les fonctionnalits abordes ont t les suivantes :
j j j j j

la cration dun modle de projet ou dlment de projet (.vstemplate) ; la cration dun chier .vscontent ; la cration dun programme dinstallation .vsi ; lexcution dun programme dinstallation ; la cration dun projet partir dun Starter Kit.

386 Le guide du codeur

Check-list

24

Toutes ces fonctionnalits rentrent dans une dmarche de partage de linformation et dempaquetage de solutions prtes lemploi. Cela vous oblige notamment faire le point sur vos mthodologies de dveloppement et vous questionner sur les diffrentes faons de rutiliser des lments intressants que vous avez mis en place an de gagner du temps par la suite.

Le guide du codeur 387

Ch apit re

25 Cration dun client FTP


Protocole FTP ........................................... Serveur FTP .............................................. Client FTP ................................................. Check-list .................................................. 390 390 399 407

25

Cration dun client FTP

Le protocole de transfert de chiers FTP est couramment utilis pour tlcharger des chiers. Pour vous connecter un serveur FTP, vous avez recours un logiciel appel "client FTP", qui permet de grer facilement les chiers qui sy trouvent. Dans ce chapitre, vous apprendrez tout dabord installer un serveur FTP et le congurer puis utiliser un client FTP. Enn, vous crerez une classe daide pour la connexion un serveur FTP, et des oprations de base au moyen des classes de lespace de noms System.Net.

25.1 Protocole FTP


Le protocole FTP rpond certaines normes et les oprations que vous pouvez effectuer lorsque vous vous connectez un serveur FTP sont codies. En dautres termes, FTP rpond une syntaxe de commandes et de codes de rponse prcise. Les diffrentes oprations possibles sont :
j j

j j j

la connexion au serveur FTP ; le tlchargement de chiers du serveur vers la machine locale (download) ; le tlchargement de chiers de la machine locale vers le serveur (upload) ; la cration et la suppression de rpertoires ; le listage de rpertoires ; la navigation entre les rpertoires (affectation du rpertoire courant).

25.2 Serveur FTP


Installation dun serveur FTP
Pour effectuer des tests, il faut un serveur FTP disposition sur lequel effectuer les requtes. Nous allons tout dabord vous prsenter un exemple de serveur FTP qui possde toutes les fonctionnalits de base de ce genre de logiciel. Le logiciel FileZillaServer est un serveur FTP gratuit, tlchargeable partir du site http://sourceforge.net/projects/filezilla. http://sourceforge.net regroupe de nombreux projets open source. Aprs avoir rcupr lexcutable, ralisez les tapes dinstallation et de conguration suivantes : 1 Lancez lexcutable dinstallation.

390 Le guide du codeur

Serveur FTP

25

b Figure 25-1 : Excutable dinstallation de FileZillaServer

2 Le premier cran vous demande daccepter les termes du contrat de licence utilisateur.

m Figure 25-2 : Contrat de licence utilisateur

3 Lcran suivant vous permet de slectionner les composants qui vont tre installs, notamment le serveur FTP et une interface dadministration.

m Figure 25-3 : Slection des composants installer

Le guide du codeur 391

25

Cration dun client FTP

4 LAssistant vous demande ensuite de spcier le rpertoire dinstallation.

m Figure 25-4 : Slection du rpertoire dinstallation

5 Slectionnez le mode de dmarrage du serveur FTP et son port.

m Figure 25-5 : Conguration des paramtres de dmarrage du serveur

Vous avez le choix entre installer un service (cest loption prfrable) qui dmarre automatiquement avec Windows ou manuellement ou de ne pas installer de service.
392 Le guide du codeur

Serveur FTP

25

m Figure 25-6 : Slection du mode de dmarrage du serveur

6 Indiquez si linterface dadministration doit tre dmarre manuellement ou quand un utilisateur se connecte et si elle dmarre pour tous les utilisateurs ou seulement pour celui en cours.

m Figure 25-7 : Slection du mode de dmarrage : la connexion de lutilisateur

Dmarrage du serveur aprs linstallation Laissez les cases Starts Server after setup completes et Starts Interface after setup completes coches an que le serveur et linterface dadministration dmarrent la n de linstallation.

7 Le dernier cran vous montre la progression de linstallation et les composants qui sont installs.

Le guide du codeur 393

25

Cration dun client FTP

m Figure 25-8 : cran de progression de linstallation

8 Linterface dadministration se lance alors comme prvu. Il sagit en ralit dune fentre partir de laquelle vous pouvez voir lactivit de votre serveur FTP, cest--dire les commandes qui lui sont demandes et les rponses quil renvoie. Elle affiche ce quon appelle les logs (journaux) du serveur.

m Figure 25-9 : Interface dadministration du serveur FTP FileZilla

394 Le guide du codeur

Serveur FTP

25

Cette interface indique notamment quelle est connecte au serveur et quelle est dans lattente de lauthentication dun utilisateur.

Cration dun utilisateur


Vous allez maintenant crer un utilisateur qui pourra accder votre serveur FTP. Vous indiquerez son identiant (login), son mot de passe et dnirez les rpertoires de la machine quil peut visiter, en lecture et/ou en criture, ou dans lesquels il ne peut naviguer. Vous spcierez au besoin le taux de transfert maximum ne pas dpasser. En outre, vous tes libre dautoriser les connexions provenant de certaines adresses ou plages dadresses IP, quil vous faudra prciser. Voici les tapes de cration dun utilisateur : 1 Dans le menu Edit, slectionnez la commande Users pour grer les utilisateurs du serveur.

b Figure 25-10 : Commande Edit/Users

2 La fentre de gestion des utilisateurs souvre. Aucun utilisateur nest prsent pour le moment dans la liste situe droite.

m Figure 25-11 : Interface dadministration du serveur FTP FileZilla

Le guide du codeur 395

25

Cration dun client FTP

Cliquer sur le bouton Add.

4 La bote de dialogue dajout dun utilisateur souvre. Saisissez le nom dutilisateur test.

b Figure 25-12 : Bote de dialogue dajout dun utilisateur

5 test est ajout dans la liste des utilisateurs. Vous pouvez lactiver en cochant la case Enable account et spcier son mot de passe en cochant la case Password et en le saisissant.

m Figure 25-13 : Activation du compte et affectation du mot de passe

6 Slectionnez la page Shared folders pour lui attribuer des rpertoires quil peut visiter.

396 Le guide du codeur

Serveur FTP

25

m Figure 25-14 : Page Shared folders

7 Pour ajouter un rpertoire, cliquez sur le bouton Add. Une bote de dialogue souvre.

b Figure 25-15 : Slection dun rpertoire que lutilisateur peut visiter

8 Slectionnez le rpertoire et spciez les droits de lutilisateur, comme la cration ou la suppression de rpertoires ou la lecture ou lcriture de chiers.

Le guide du codeur 397

25

Cration dun client FTP

m Figure 25-16 : Affectation des droits de lutilisateur dans un rpertoire

Vous pouvez galement choisir ce rpertoire comme tant celui par dfaut grce au bouton Set as home dir. 10 La page Speed Limits permet de limiter le taux de transfert sur le tlchargement de chiers.

m Figure 25-17 : Page Speed Limits

398 Le guide du codeur

Client FTP

25

11 La page IP Filter permet dindiquer des adresses ou des plages dadresses IP pour lesquelles laccs est autoris.

m Figure 25-18 : Page IP Filter

25.3 Client FTP


Voici un aperu, ct client, du logiciel de gestion de transfert FTP FileZilla. Son interface est un peu plus volue que la prcdente et permet de tlcharger des chiers sur un serveur vers votre machine locale, ou inversement duploader des chiers dans un rpertoire du serveur. Ce logiciel prsente deux avantages : il est traduit en franais et il est simple dutilisation grce une interface graphique efficace compose dExplorateurs, de fentres de logs, de progression des transferts, etc. (voir Figure 25-19). Vous pouvez facilement naviguer dans les rpertoires de votre machine et du serveur, et glisser-dplacer des chiers entre lun et lautre. Voici quelques fonctionnalits intressantes de FileZilla. On les retrouve habituellement dans de ce genre de logiciel.

Le guide du codeur 399

25

Cration dun client FTP

m Figure 25-19 : Interface graphique de FileZilla

Connexion rapide
Grce une barre compose de plusieurs zones de saisie, vous pouvez vous connecter facilement un serveur FTP en fournissant vos informations de connexion, cest--dire essentiellement ladresse du serveur, votre nom dutilisateur et votre mot de passe. Dans ce cas, ladresse du serveur FTP est ftp://localhost.

m Figure 25-20 : Barre de connexion rapide

Le bouton Connexion Rapide enregistre les dernires adresses auxquelles vous avez essay de vous connecter.

b Figure 25-21 : Bouton de connexion rapide

400 Le guide du codeur

Client FTP

25

Enregistrer une connexion


Si vous vous connectez souvent une adresse FTP prcise, vous pouvez choisir de lenregistrer dans le gestionnaire de sites qui stocke plusieurs connexions et vous permet de les grer et de vous connecter facilement aux serveurs FTP correspondants. Pour enregistrer une connexion, procdez aux tapes suivantes : 1 Cliquez sur le bouton daffichage du gestionnaire de sites.

2 La fentre de gestion des sites saffiche, avec la liste des sites enregistrs dun ct et un formulaire de conguration des connexions permettant de spcier notamment les informations de connexion.

m Figure 25-22 : Gestionnaire de sites

Le bouton Nouveau Site permet dajouter une nouvelle connexion que vous devez ensuite congurer. 4 Vous pouvez la dsigner comme la connexion par dfaut en activant le bouton radio site par dfaut. 5 Cliquez enn sur Enregistrer et quitter.

Le guide du codeur 401

25

Cration dun client FTP

6 Votre connexion est dsormais enregistre. Vous y accderez facilement en cliquant sur la che situe ct du bouton du gestionnaire de sites.
b Figure 25-23 : Connexion un site enregistr dans le gestionnaire de sites

Fentre daffichage du journal des messages


La fentre daffichage du journal des messages permet de visualiser les messages changs entre le client et le serveur. On distingue trois types de messages :
j j

Etat indique ltat du serveur ou lopration quil est en train de raliser. Rponse indique une rponse du serveur, avec comme prxe un code de trois chiffres. Commande indique une commande du client FTP.

Voici une liste dinstructions changes entre le client et le serveur FTP au moment de la connexion dun utilisateur et du listage dun rpertoire :
Etat : Connexion localhost Etat : Connect localhost. Attente du message daccueil. Rponse : 220-FileZilla Server version 0.9.16c beta Rponse : 220-written by Tim Kosse (Tim.Kosse@gmx.de) Rponse : 220 Please visit http://sourceforge.net/projects/filezilla/ Commande : USER test Rponse : 331 Password required for test Commande : PASS **** Rponse : 230 Logged on Commande : FEAT Rponse : 211-Features: Rponse : MDTM Rponse : REST STREAM Rponse : SIZE Rponse : MLST type*;size*;modify*; Rponse : UTF8 Rponse : CLNT Rponse : 211 End Commande : CLNT FileZilla Rponse : 200 Dont care Commande : OPTS UTF8 ON Rponse : 200 UTF8 mode enabled Commande : SYST Rponse : 215 UNIX emulated by FileZilla Etat : Connect Etat : Rcupration de la liste de rpertoires

402 Le guide du codeur

Client FTP

25

Commande : PWD Rponse : 257 "/" is current directory. Commande : TYPE A Rponse : 200 Type set to A Commande : PASV Rponse : 227 Entering Passive Mode (127,0,0,1,5,109) Commande : LIST Rponse : 150 Connection accepted Rponse : 226 Transfer OK Etat : Succs du listage du rpertoire Commande : PWD Rponse : 257 "/" is current directory. Commande : TYPE A Rponse : 200 Type set to A

Du ct du serveur, vous avez des messages de logs quivalents au moment de la connexion :


(000001) 11/08/2006 21:16:39 - (not logged in) (127.0.0.1)> Connected, sending welcome message (000001) 11/08/2006 21:16:39 - (not logged in) (127.0.0.1)> USER test (000001) 11/08/2006 21:16:39 - (not logged in) (127.0.0.1)> 331 Password required for test (000001) 11/08/2006 21:16:39 - (not logged in) (127.0.0.1)> PASS **** (000001) 11/08/2006 21:16:39 - test (127.0.0.1)> 230 Logged on

Classe FTPClient
Vous pouvez prsent raliser la classe FTPClient daide la connexion un serveur, au passage de commandes et la rcupration des rponses. Vous pourrez ensuite faire une interface utilisateur adquate et utiliser cette classe et ses mthodes. Lutilisation de cette classe pour raliser des oprations de base telles que la connexion un serveur, la rcupration et lupload dun chier, devra tre simple :
Dim ftp As New FTPclient("ftp://localhost", "test", "test") ftp.Download("/MonFichier.txt", "C:\MonFichier.txt") ftp.Upload("C:\MonFichier.txt", "/MonFichier.txt")

Pour dvelopper cette classe, vous utiliserez en majeure partie lespace de noms System.Net. Voici une explication de ces diffrents membres et mthodes.

Le guide du codeur 403

25

Cration dun client FTP

Constructeur
Le constructeur prend en paramtre les informations de connexion :
Private _host As String Private _username As String Private _password As String Sub New(ByVal Host As String, ByVal Username As String, _ ByVal Password As String) _host = Host _username = User _password = Password End Sub

Mthode GetRequest
Pour effectuer une commande FTP, vous devez utiliser un objet FtpWebRequest. Pour rcuprer facilement un tel objet, vous allez crer la mthode GetRequest, qui prend une adresse FTP en paramtre. Vous utiliserez cette mthode de cette faon :
Dim ftp As Net.FtpWebRequest = _ GetRequest(Hostname & sourceFilename)

Le code de la fonction est le suivant :


Private Function GetRequest(ByVal URI As String) _ As FtpWebRequest Dim result As FtpWebRequest = _ CType(FtpWebRequest.Create(URI), FtpWebRequest) result.Credentials = New Net.NetworkCredential(Username, Password) result.KeepAlive = False Return result End Function

Lobjet NetworkCredential permet de passer les informations de connexion de lutilisateur.

Mthode Download
La mthode prend en paramtre le chemin relatif du chier source sur le serveur et le chemin physique :
Public Function Download(ByVal sourceFilename As String, _ ByVal localFilename As String) As Boolean

404 Le guide du codeur

Client FTP

25

Vous devez envoyer la commande de tlchargement au serveur. Il faut donc spcier la requte le type de commande, en affectant la proprit Method qui correspond au type de commande effectuer :
ftp.Method = Net.WebRequestMethods.Ftp.DownloadFile

La structure WebRequestMethods contient lensemble des types de commandes possibles.

b Figure 25-24 : Gestionnaire de sites

Aprs avoir cr un objet FileInfo pour le chier de destination, vous pouvez rcuprer la rponse de la requte dans un ux et remplir le chier :
Using response As FtpWebResponse = _ CType(ftp.GetResponse, FtpWebResponse) Using responseStream As Stream = _ response.GetResponseStream Using fs As FileStream = fi.OpenWrite Try Dim buffer(2047) As Byte Dim read As Integer = 0 Do read = _ responseStream.Read(buffer, 0, buffer.Length) fs.Write(buffer, 0, read) Loop Until read = 0 responseStream.Close() fs.Flush() fs.Close() Catch ex As Exception fs.Close() fi.Delete() Throw End Try End Using responseStream.Close() End Using response.Close() End Using

Le guide du codeur 405

25

Cration dun client FTP

Mthode Upload
Dune manire similaire, dveloppez la mthode Upload, qui prend en paramtre le chemin du chier uploader et le chemin relatif du chier de destination sur le serveur :
Public Function Upload(ByVal localFilename As String, _ Optional ByVal targetFilename As String = "") As Boolean

Le type de requte est cette fois UploadFile :


ftp.Method = Net.WebRequestMethods.Ftp.UploadFile

En outre, vous ncrivez plus, mais vous lisez le chier source et vous envoyez son contenu dans un ux :
ftp.ContentLength = fi.Length Const BufferSize As Integer = 2048 Dim content(BufferSize - 1) As Byte Dim dataRead As Integer Using fs As FileStream = fi.OpenRead() Try Using rs As Stream = ftp.GetRequestStream Do dataRead = fs.Read(content, 0, BufferSize) rs.Write(content, 0, dataRead) Loop Until dataRead < BufferSize rs.Close() End Using Catch ex As Exception Finally fs.Close() End Try End Using

Mthode GetResponse
Pour la plupart des commandes, le serveur renvoie un message. La mthode GetResponse permet de rcuprer facilement ce message :
Private Function GetResponse(ByVal ftp As FtpWebRequest) _ As String Dim result As String = "" Using response As FtpWebResponse = _ CType(ftp.GetResponse, FtpWebResponse) Dim size As Long = response.ContentLength

406 Le guide du codeur

Check-list

25

Using datastream As Stream = _ response.GetResponseStream Using sr As New StreamReader(datastream) result = sr.ReadToEnd() sr.Close() End Using datastream.Close() End Using response.Close() End Using Return result End Function

Vous pourrez notamment lutiliser de la manire suivante :


ftp.Method = Net.WebRequestMethods.Ftp.DeleteFile Dim strResponse As String = GetResponse(ftp)

25.4 Check-list
Au cours de ce chapitre, vous avez utilis diffrentes classes de lespace de noms System.Net pour crer une classe daide qui permet de raliser les oprations FTP de base. Voici ce que vous avez galement dcouvert :
j j

j j j j j

linstallation dun serveur FTP ; la cration dun compte utilisateur FTP et la conguration de ses droits daccs ; lutilisation dun client FTP et de ses fonctionnalits de base ; la connexion un serveur FTP ; le tlchargement de chiers (upload et download) ; la gestion des rpertoires ; le listage des chiers.

Le guide du codeur 407

Ch apit re

26 Annexes

Glossaire .................................................. 410 Rfrences web ......................................... 418

26

Annexes

26.1 Glossaire
.NET
Plateforme de dveloppement multilangage cre par Microsoft.

.NET Compact Framework


Environnement indpendant du matriel pour lexcution de programmes sur des priphriques informatiques soumis des contraintes de ressources. Il hrite de larchitecture .NET Framework complte du Common Language Runtime, prend en charge un sous-ensemble de la bibliothque de classes .NET Framework et contient des classes exclusivement conues pour le .NET Compact Framework. Les priphriques pris en charge incluent les Assistants numriques personnels (PDA), tels que les PC de poche, les tlphones mobiles, les dcodeurs, les priphriques informatiques automobiles et les priphriques incorpors personnaliss crs avec le systme dexploitation Microsoft Windows CE .NET.

Accs aux donnes


Partie du dveloppement permettant le stockage et la restitution de linformation saisie.

ADO .NET
Technologie du Framework .NET permettant la gestion complte de laccs aux donnes.

Appartenance (membership)
Fonctionnalit de gestion des utilisateurs dune application web.

Application dinterface multidocument (MDI)


Application qui comporte un formulaire principal pouvant accueillir dautres formulaires. Ces derniers, considrs comme des formulaires enfants, ne peuvent safficher que dans le formulaire parent. Si lapplication contient des menus ou des barres doutils, ces lments sont gnralement partags entre le formulaire parent et ses enfants.

ASP .NET
Technologie de dveloppement de sites et de services web du Framework .NET.

Assembly
Rsultat de la compilation dune bibliothque de classes en un chier avec une extension .dll.
410 Le guide du codeur

Glossaire

26

Authentication
Notion de scurit. tape par laquelle un utilisateur doit passer avant daccder une zone scurise. Lauthentication peut se faire grce la saisie dinformations de connexion, comme un identiant et un mot de passe, ou en fonction des droits daccs attribus sur un ordinateur ou un rseau.

BCL (Base Class Library)


Librairies de classes de base, qui distribuent les blocs fondamentaux tout dveloppement dapplication .NET

CAB
Fichier compress contenant une application installer.

Cache ou Mise en cache


Mise en mmoire dinformations ou de pages, qui vise amliorer les performances dune application.

Chane de connexion (connection string)


lment fournir pour spcier les informations de connexion une base de donnes.

Conforme CLS (CLS-compliant)


Code exposant publiquement les fonctionnalits de langue (et elles seules) gurant dans la Common Language Specication. La conformit CLS peut sappliquer aux classes, interfaces, composants et outils. Voir aussi : Common Language Specication (CLS).

Classes unies
Bibliothque de classes, dinterfaces et de types de valeurs, incluse dans le kit de dveloppement .NET Framework SDK de Microsoft. Cette bibliothque, qui permet daccder aux fonctionnalits du systme, est le fondement des applications, composants et contrles du Framework .NET. Voir aussi : Common Language Specication, Conformit CLS.

Cl trangre
Champ dune table indiquant une liaison entre deux tables.

Cl primaire
Champ dune table permettant didentier de faon unique un enregistrement.

Le guide du codeur 411

26

Annexes

ClickOnce
Technologie .NET de dploiement et de mise jour intgre dans les applications Windows.

CLR (Common Language Runtime)


Moteur dexcution interne du Framework Microsoft .NET. Il prend en charge le code manag en fournissant des services comme lintgration du multilangage, la gestion du cycle de vie des objets, la scurit daccs au code, la gestion des ressources, le dbogage.

CLS ou Common Language Specication


Spcication de langage commune. Ensemble des spcications quun langage doit respecter, notamment en ce qui concerne la programmation objet, pour pouvoir tre intgr la plateforme .NET.

Code Behind
Code dune page web dans un chier de classe spar du chier correspondant lapparence.

Code manag (managed code)


Code excut par lenvironnement du Common Language Runtime, et non directement par le systme dexploitation. Les applications de code manag bncient des services Common Language Runtime tels que les oprations de ramasse-miettes automatiques, la vrication du type au moment de lexcution, la prise en charge de la scurit, etc. Grce ces services, les applications de code manag ont un comportement uniforme, indpendant de la plateforme (et du langage).

Code non manag (unmanaged code)


Code directement excut par le systme dexploitation, hors de lenvironnement du Common Language Runtime. Le code non manag doit fournir ses propres oprations de ramasse-miettes, de vrication du type, de prise en charge de la scurit, etc., contrairement au code manag, qui reoit ces services du Common Language Runtime. Voir aussi : Code manag.

Composant
Objet qui na pas de reprsentation graphique et qui nest donc pas visible sur le rendu nal du formulaire lors de son excution.

412 Le guide du codeur

Glossaire

26

Concepteur de projet
Interface de lenvironnement Microsoft Visual Basic 2005 Express, permettant de paramtrer divers lments associs un projet .NET, le tout organis par onglets.

Concepteur de vues
Espace de lenvironnement Microsoft Visual Basic 2005 Express, donnant un aperu graphique du formulaire.

Conteneur de donnes
Objet de lespace de noms System.Data, permettant une reprsentation dle de la base de donnes en mode dconnect.

Contrle
Objet qui saffiche, directement visible sur le formulaire en mode Design. Il existe diffrents types de contrles.

Contrle dvnement
Contrle qui gnre un vnement dans le cadre dune interaction avec lutilisateur.

Contrle daffichage
Contrle qui permet dafficher du texte titre dinformation.

Contrle de saisie
Contrle qui permet lutilisateur de saisir des valeurs.

Conteneur
Contrle qui peut contenir dautres contrles

Contrle personnalis
Contrle hritant de la classe System.Windows.Form.Control, dont on rcrit entirement le comportement (logique mtier) et le rendu graphique (il devra surcharger la mthode Paint).

Contrle utilisateur ou composite


Contrle hritant de la classe System.Windows.Form.UserControl, qui est compos dun ensemble de contrles prexistants et dont on peut personnaliser le comportement mtier.

Le guide du codeur 413

26

Annexes

CSS (Cascading Style Sheet)


Feuille de style en cascade. Fichier de dclaration de style pour des balises HTML.

CTS (Common Type System)


Systme de type commun. Spcication dterminant la faon dont le Common Language Runtime dnit, utilise et gre les types.

Dbogueur (debugger)
Fonctionnalit qui permet de drouler pas pas lexcution dun programme pour vrier que le comportement du code correspond bien aux attentes du dveloppeur. Les valeurs des variables peuvent galement tre inspectes. Un dbogueur sert notamment placer les points darrt au niveau des sections de code par lesquelles il faut passer.

EDI (environnement de dveloppement intgr)


Logiciel qui prend en charge une technologie de dveloppement. Il peut proposer des fonctionnalits qui permettent de programmer des applications plus facilement, comme des diteurs de code, des botes de dialogue, des Assistants, des pages daide, des fentres de conguration et diffrents autres outils associs (compilateur, dbogueur).

Entrepts de donnes
Mthodes de stockage de linformation, systme de gestion de bases de donnes, chiers plats, chiers XML, etc.

Explorateur de serveurs
Fentre de lenvironnement Microsoft Visual Basic 2005 Express affichant larborescence dune base de donnes.

Explorateur de solutions
Fentre de lenvironnement Microsoft Visual Basic 2005 Express affichant larborescence de la solution .NET ouverte.

Fournisseur (provider)
Ensemble de classes encapsulant toute la logique qui permet de mettre en place une fonctionnalit avance pour un site web. Le modle de base de fournisseur et les fournisseurs par dfaut peuvent tre tendus pour rpondre vos besoins.

414 Le guide du codeur

Glossaire

26

Fournisseurs manags
Objets manags permettant la communication avec diffrents systmes de gestion de bases de donnes. Ils permettent laccs SQL Server, Oracle ou toute source de donnes de type ODBC ou OLEDB.

Framework
Ensemble de bibliothques fournissant des briques logicielles qui permettent le dveloppement rapide dapplications.

Gestionnaire dvnements
Code au sein dun programme, qui rpond une action provoque par lutilisateur. On peut dlguer la gestion des vnements Microsoft Visual Basic 2005 Express (mots-cls Handles et WithEvents) ou le grer soi-mme par code (mots-cls AddHandler, RemoveHandler, AddressOf).

HTML (HyperText Markup Language)


Langage balises hypertextes, qui permet dcrire des pages web affichables dans un navigateur Internet.

HTTP (HyperText Transfer Protocol)


Protocole de transfert de donnes utilis notamment pour accder des pages web ou des services web.

IDE (Integrated Development Environment)


Voir EDI.

IL
Voir MSIL.

Intellisense
Fonctionnalit de compltion de code. Lditeur peut ainsi proposer tour tour les espaces de noms, puis les classes, puis les membres et enn les paramtres disponibles en fonction du texte que lon a commenc saisir.

JIT (Just in Time)


Technique de compilation de code qui vise amliorer les performances.

Librairie de classes
Ensemble de classes.

Le guide du codeur 415

26

Annexes

Localisation ou Globalisation
Traduction des diffrents composants dune application pour ladapter plusieurs cultures.

Microsoft SQL Server Express 2005


Version gratuite du systme de gestion de bases de donnes de Microsoft.

Mono
Le projet Mono vise fournir une implmentation libre de la plateforme de dveloppement Microsoft .NET.

MSI (Microsoft Windows Installer)


Excutable dinstallation dun logiciel.

MSIL (Microsoft Intermediate Language)


Langage bas niveau des instructions processeur dexcution dun code .NET compil, quel que soit le langage de dveloppement utilis.

Page matre (master page)


Page web qui sert de modle dautres.

Paramtre dapplication
Variables persistantes de programme qui ont une porte globale au sein de lapplication. Ces variables sont dans la plupart des cas en lecture seule.

Paramtre utilisateur
Variable persistante spcique lutilisateur, gnralement utilise pour stocker les prfrences de lutilisateur.

Plan de site (sitemap)


Fichier dans lequel on dnit la hirarchie des pages dun site web (URL, titre, description).

PostBack
Publication dune page web, rafrachissement.

Procdure stocke
Ordre SQL stock et excut au sein du systme de gestion de bases de donnes.

416 Le guide du codeur

Glossaire

26

Prol
Stockage de donnes personnalises relatives un utilisateur dun site web.

Projet Bibliothque de classes


Type de projet .NET regroupant un ensemble de classes, gnralement ordonnes par thme ou fonctionnalit, gnrant au nal un assembly exploitable.

Projet WinForm
Projet .NET permettant de concevoir des applications Windows Forms.

Ramasse-miettes (garbage collector)


Systme de gestion automatique de la mmoire. Il est responsable du recyclage des ressources mmoire pralablement alloues puis inutilises.

Service web
Programme qui fournit des informations par le biais dun ux XML via un protocole web.

SQL (Stuctured Query Language)


Langage utilis pour la communication avec un systme de gestion de bases de donnes.

Thme ASP .NET


Ensemble de chiers spciant lapparence graphique des lments dune page web. Il peut contenir des feuilles de style CSS, des images et des chiers dapparence (skin). Un site web ASP .NET peut avoir plusieurs thmes diffrents.

Runtime
Moteur dexcution de code.

Smart tag
lment qui permet daccder aux tches courantes dun contrle en mode dition.

SMTP (Simple Mail Transfer Protocol)


Protocole de transfert de-mails.

ViewState
Fonctionnalit qui permet de stocker ltat des contrles dune page web entre deux publications.
Le guide du codeur 417

26

Annexes

Visual Web Developper


EDI de la gamme Visual Studio permettant de dvelopper des sites web ASP .NET.

Web.cong
Fichier de conguration XML dun site web ASP .NET.

WebPart
Contrle de page web qui peut tre personnalis par lutilisateur.

XHTML (eXtended Markup Language)


Langage balises tendu.

26.2 Rfrences web


Coach VB2005
www.microsoft.com/france/msdn/vbasic/decouvrez/coach.mspx Votre coach Visual Basic vous guide la dcouverte du dveloppement Windows sur la plateforme .NET de Microsoft. tape par tape, suivez votre coach. Il vous accompagne au travers dun cursus dinitiation et de prise en main des concepts, des technologies et des outils.

Blogs
Blogs des auteurs
j j j

Patrice Lamarche : http://blogs.developpeur.org/patrice/. Antoine Griffard : http://blogs.developpeur.org/tonio/. Mauricio Daz Orlich : www.madd0.com/.

m Figure 26-1 : Les blogs du rseau CodeS-SourceS

418 Le guide du codeur

Rfrences web

26

Blogs anglais
j j j

MSDN Blogs US : http://blogs.msdn.com/default.aspx. MSDN-ASP .NET US : http://weblogs.asp.net/. Microsoft Belgique : www.microsoft.com/belux/fr/msdn/community/blogs.mspx.

Blogs francophones
j j

Blogs du rseau CodeS-SourceS : http://blogs.developpeur.org/. Microsoft France : http://blogs.microsoft.fr/.

Communauts
Vous trouverez dans ce qui suit, la liste des communauts, avec un bref descriptif de leurs crateurs.

ASP-PHP .NET
www.asp-php.net/ Plateforme ouverte aux rdacteurs de tous horizons, la communaut ASP-PHP .NET aborde les diffrents langages majeurs dInternet, tout en restant "ni catgoriquement pour lun, ni farouchement contre lautre !". Regroupant une large gamme de tutoriaux, de scripts et darticles, ASP-PHP .NET se veut pdagogique, oriente vers la formation des visiteurs dbutants, et objective quant aux comparaisons technologiques. Son forum reste une aide prcieuse pour tous les visiteurs du fait de la qualit des intervenants issus de technologies diverses et varies.

m Figure 26-2 : Communaut ASP-PHP .NET

Le guide du codeur 419

26

Annexes

C2i.fr
www.c2i.fr/ C2i.fr fut tout dabord un site consacr Visual Basic (4, 5 et 6). Ds juin 2000, des articles sur la plateforme .NET de Microsoft sont publis, consacrs toutes les technologies .NET (WinForm, WebForm, Web Service, Compact Framework), aussi bien en VB .NET quen C#. Ce fut le premier site francophone dvelopp en ASP .NET. Vous trouverez sur C2i.fr un l quotidien dinformations sur .NET, des articles, des forums actifs o poser vos questions.

CodePPC
www.codeppc.com La communaut CodePPC est compose de dveloppeurs qui programment ou qui veulent programmer pour la plateforme Pocket PC. La majorit des membres est francophone, mme si des contacts sont nous avec des personnes des tats-Unis, du Japon et de certains pays dEurope. Le but est de proposer des articles clairs, simples et pratiques pour aider au maximum les dveloppeurs crer des applications pour cette plateforme. Un forum permet aux membres de poser leurs questions et daider les autres. Des programmes avec leurs sources sont aussi disponibles ; leur analyse est lun des meilleurs moyens de progresser.

CodeS-SourceS
www.codes-sources.com La communaut de rfrence avec plus de quatorze langages reprsents : VB, VB .NET, ASP, ASP .NET, SQL, C/C++, C#, assembleur, Flash, Delphi, ColdFusion, PHP, JavaScript, Java, Scripting Graphique, Scripting IRC, Pocket PC & Palm. Le rseau CodeS-SourceS est une communaut de dveloppeurs francophones de cultures informatiques varies. Cette communaut regroupe plus de six cent mille membres travers une ide simple : "partager ses connaissances".

m Figure 26-3 : Rseau de communauts CodeS-SourceS

420 Le guide du codeur

Rfrences web

26

Developpez.com
www.developpez.com Developpez.com apporte aux dveloppeurs une multitude de news, de cours, de tutorats, darticles, de FAQ, doutils, de composants et dexemples de codes rdigs par des rdacteurs bnvoles passionns, qui dsirent partager leurs connaissances. Developpez.com a pour vocation daider nimporte quel dveloppeur, quels que soient son niveau et le langage de programmation quil utilise, mais focalise cependant ses efforts sur la formation et laide au professionnels.

Dotnet-Project
www.Dotnet-Project.com Dotnet-Project est le nouveau site de la communaut Dotnet en France. Il est le fruit de la collaboration entre Nix de CodeS-SourceS, Rdo de ASP-PHP, Kevin de Dotnet-fr, Richard de C2i et Aleksandar Lukic. Vous y trouverez des projets complets raliss principalement avec la technologie .NET. Le plus souvent possible, leurs sources sont disponibles. Vous trouverez actuellement les starters kits traduits en franais. Le but est principalement de promouvoir le travail de chacun. Pour cela, des espaces sont mis en place pour mettre en valeur les projets les plus mritants, mais galement leurs auteurs. Les dveloppeurs seront intresss, mais aussi les chefs de projets, qui trouveront ici des solutions toutes faites ou modier lgrement pour les intgrer leurs projets et passer la vitesse suprieure !

Labo-dotnet
www.labo-dotnet.com Le laboratoire des technologies de dveloppement Microsoft .NET a t cr par des lves ingnieurs de Sup-Info Paris (www.supinfo.com) dans le but de rpondre la question suivante : "Quelles comptences sont ncessaires pour faire dun dveloppeur un vritable expert des technologies de dveloppement .NET ?".

b Figure 26-4 : Site du Laboratoire .NET

Le guide du codeur 421

26

Annexes

Tech Head Brothers


www.TechHeadBrothers.com Tech Head Brothers est un portail francophone dinformations, darticles et dastuces techniques haut de gamme sur les technologies orientes dveloppeur de Microsoft. Fond et anim depuis 2001 par Laurent Kemp (MVP .NET) et Mathieu Kemp (MVP .NET).

m Figure 26-5 : Communaut Tech Head Brothers

INETA (International .NET Association)


www.ineta.org Cette association but non lucratif a pour vocation de fdrer lensemble des groupes dutilisateurs intresss par la plateforme de Microsoft .NET. Sa mission est de proposer une assistance et des ressources utiles aux communauts ou aux groupes dutilisateurs qui promeuvent et informent techniquement leurs membres sur les technologies .NET. LINETA est forme dun bureau de responsables de groupes dutilisateurs, lus par leurs pairs. Elle est soutenue par Microsoft Corporation et autres sponsors.

422 Le guide du codeur

Rfrences web

26

m Figure 26-6 : INETA

Communauts des experts Microsoft


RD (Microsoft Regional Director)
msdn.microsoft.com/isv/rd/ Experts et partenaires privilgis Microsoft lchelle mondiale, les cent vingt-neuf Regional Directors sont des experts sur les technologies de dveloppement Microsoft, dsigns par Microsoft pour intervenir lors des vnements techniques en partenariat.

b Figure 26-7 : Microsoft Regional Director

MVP (Microsoft Most Valuable Professional)


https://mvp.support.microsoft.com/Default.aspx Ce programme rcompense les utilisateurs les plus actifs et les plus enthousiastes, dsireux de partager leurs comptences techniques et leurs savoir-faire avec leurs pairs. Il vise reconnatre lapport des membres de la communaut les plus entreprenants, dont lexpertise, diffuse en ligne et par ailleurs, enrichit lexprience de tous et permet de distinguer les communauts techniques concernant les produits Microsoft.

Le guide du codeur 423

26

Annexes

b Figure 26-8 : Microsoft Most Valuable Professional

MVS (Microsoft Most Valuable Student)


www.microsoft.com/france/education/sup/etudiants/mvs/default.asp Le titre de Most Valuable Student (MVS) rcompense les tudiants faisant preuve dune expertise et dune implication exceptionnelles autour des produits ou technologies Microsoft.

b Figure 26-9 : Microsoft Most Valuable Student

Liens Microsoft
Visual Studio
Retrouvez lensemble de la gamme Visual Studio 2005 ladresse www.microsoft .com/france/msdn/vstudio/default.mspx.

Microsoft Developper Network


j

Librairie MSDN2 version franaise : http://msdn2.microsoft.com/fr-fr/ library/default.aspx. Librairie MSDN2 version amricaine : http://msdn2.microsoft.com/en-us/ library/default.aspx.

424 Le guide du codeur

Ch apit re

27

Index

27

Index

A
AccessKey, 349 ActionLists, 365 ActiveStepIndex, 345 Add, 256 AddHandler, 187 AddressOf, 187 Ajax, 320 AllowDrop, 232 AllowReturn, 345 Ancrer dans le conteneur parent, 34, 79 AppearanceEditorPart, 251 Application, 229 Application Programming Interface (API), 230 ApplicationSettings, 148 App_GlobalRessources, 304 App_LocalRessources, 304 App_Themes, 272 Array ConstrainedCopy, 51 ToBase64String, 51 AspNetSqlProleProvider, 261 Aspnet_regsql.exe, 218 AssemblyInfo.vb, 356 AutoCompleteExtender, 333

BinaryFormatter, 58, 70 Deserialize, 70 Serialize, 70 BindingNavigator, 66 BindingSource, 66 AddingNew, 69 AllowNew, 69 List, 70 Bitmap, 30 Bridge, 323

C
CatalogPart, 248 CausesValidation, 347 Chane de connexion, 19 ChildNode Nud enfant, 284 Cl de chiffrement, 49 CollapseImageUrl, 289 CompositeControl, 338, 358 ConnectionString, 196, 219 ContentPlaceHolder, 93 ContextMenuStrip, 227 Contrle Login, 133 Timer, 139 utilisateur, 156 ControlValueProperty, 359 Couleur de fond, 156 CreateGlobalResourceProvider, 316 CreateLocalResourceProvider, 316 CryptoStream, 51 CryptoStreamMode Write, 51

B
BackgroundWorker, 178 Balise active, 78 Base de donnes Cration, 18 Table, 20 Base de registre, 234 BehaviorEditorPart, 252 Bibliothque externe, 152

426 Le guide du codeur

Index

27

D
Data Source, 196 DataTable GetChanges, 27 DeclarativeCatalogPart, 248 DefaultButton, 348 DefaultFocus, 349 DefaultProperty, 359 DefaultProvider, 257 Dplacement dune fentre sans bordure, 147 Dsrialisation, 58 DesignerActionListCollection, 365 DesignTimeResourceProvider Factory, 317 Directory, 37 GetFiles, 37 Document XML, 200 DotMSN, 152 DragDrop, 233 DragEventArgs, 233 DragOver, 233 Drives, 172

Extension de lespace de noms My, 143

F
Feuille de style en cascade, 275 FileSystem, 172 FixedDialog, 225 Flux RSS, 200 FolderBrowserDialog, 31 Form ActiveMdiChild, 85 BringToFront, 84 Dock, 79 FormClosing, 27 Invoke, 159 IsMdiContainer, 78 MdiChildren, 83 MdiParent, 82 Name, 31 Text, 31 Format de texte enrichi, 76 FormBorderStyle, 145, 225 FormClosing, 236 FormClosingEventArgs, 229 Formulaire de dmarrage, 80 parent MDI, 77 FormView, 112 Fournisseur de prols, 255 FreeTextBox, 123 FTPClient, 403 FtpWebRequest, 404

E
EditorPart, 250 EditorZone, 250 EnableLocalization, 310 Encoding, 50 Enregistrer des paramtres dapplication, 148 Espace de noms My, 136 ExecuteNonQuery, 197 ExpandImageUrl, 289 Explorateur de disques, 170 de serveur, 315 Expression Builder, 305

G
Gadget Live.com, 211 Gestion des prols, 219
Le guide du codeur 427

27

Index

des raccourcis clavier, 192 GetDirectories, 175 GetGlobalResourceObject, 308 GetLocalResourceObject, 308 Globalization lment, 301 Espace de noms, 300 GridView, 101 GroupBox Enabled, 26

K
KeyDown, 192

L
LayoutEditorPart, 251 LeafNode Nud feuille, 284 LineImagesFolder, 289 List Sort, 73 ListBox, 175, 226 ListView, 34, 155, 170 EnsureVisible, 39 Grand ImageList, 34 LargeImageList, 34 MultiSelect, 34 SelectedIndexChanged, 38 Localizable, 305 Login, 133 LstFolders, 175

H
HorizontalAlignment, 89 HTTPHandler, 116

I
IComparer, 71 Iframe, 216 Image, 30 FromFile, 37 RotateFlip, 40 Save, 41 ImageList, 34, 171 ImageSize, 34 View, 34 Vue, 34 ImageSet, 289 ImageUrl, 289 ImportCatalogPart, 249 InitializeCulture, 312 Interface graphique Synchronisation interthread, 159 Interface multidocument, 76 Interval, 139 IV, 49

M
MailMessage, 53 Manifeste gadget, 217 MaximizeBox, 225 MDI, 76 MemoryStream, 50 MenuItem PerformClick, 86 MenuStrip, 32 Meta Resourcekey, 306 Method WebRequestMethods, 405 MigrateAnonymous, 264 Mise en forme automatique, 271

428 Le guide du codeur

Index

27

MoveTo, 345 MsgBox, 229 My.Computer.Info, 137

Proprit, 255

R N
NetworkCredential, 404 NextButtonClick, 345 NotifyIcon, 227 Really Simple Syndication, 200 Rfrence, 153 Registry, 234 RegistryKey, 234 RegularExpressionValidator, 348 RequiredFieldValidator, 347 ResourceProviderFactory, 313 ResourceProviderFactoryType, 313 Resources, 305 ResX, 301 Rfc2898DeriveBytes, 50 GetBytes, 51 Rich Text Format, 76 RichTextBox, 76 Copy, 88 Cut, 88 LoadFile, 84 Paste, 88 Redo, 88 SaveFile, 86 SelectAll, 88 SelectionAlignement, 89 SelectionColor, 90 Undo, 88 RijndaelManaged CreateDecryptor, 52 CreateEncryptor, 51 IV, 51 Key, 51 RootNode Nud racine, 285 RotateFilpType, 40 RSS, 200 RTF, 76

O
ObjectDataSource, 99 Opacity, 146 OpenFileDialog, 84

P
Page matre, 93 PageCatalogPart, 249 Parameters, 197 ParentNode Nud parent, 284 Path, 84 GetFileName, 84 Persistance, 259 Personalizable, 247 PictureBox, 35, 226 Refresh, 40 Plan de site Localisation, 308 PopulateNodesFromClient, 294 PopulateOnDemand, 293 Prole, 255 ProgressBar, 138 Properties, 256 PropertyGridEditorPart, 250

Le guide du codeur 429

27

Index

S
Salt, 49 SaveFileDialog, 31, 85 SelectedIndexChanged, 231 Srialisant, 254 Srialisation, 58 XML, 97 Serializable, 60 SetFocus, 349 SetFocusOnError, 349 ShowInTaskBar, 229 Sitemap, 95 SiteMapDataSource, 96, 295 Smart tag Balise active, 365 SmtpClient, 53 SendAsync, 53 SendCompleted, 53 Source de donnes, 63 SplitButton, 185 SplitContainer, 33 IsSplitterFixed, 33 SqlCommand, 122, 196 SqlConnection, 122, 196 StartFromCurrentNode, 296 StartingNodeOffset, 296 StartingNodeUrl, 296 StatusStrip, 33, 155 StepType, 339 String IsNotNullOrEmpty, 86 StyleSheetTheme, 276 SupportedDisplayModes, 243 Synchronisation de linterface graphique, 159 System.Data, 122 System.Data.SqlClient, 122, 195 System.IO, 170 System.Net, 403 System.Net.Mail, 102
430 Le guide du codeur

System.UI.WebControls.Web Parts, 238 System.Windows.Forms, 170 System.XML, 235 System.Xml.Serialization, 98 SystemParametersInfo, 230 TabControl, 65, 155, 186 TabIndex, 349 TabPage, 186 TextBox Multiline, 156 UseSystemPasswordChar, 156 Thme, 272, 276 global, 277 Thread, 158 ToolStrip, 35, 185 Dock, 35 GripStyle, 35 ToolStripMenuItem Image, 32 ShortcutKeys, 32 ToolStripSplitButton, 186 ToolStripStatusLabel, 155 ToolStripTextBox, 186 TreeNode, 285 TreeNodePopulate, 293 TreeView, 94 Try Catch, 122

U
User32.dll, 230 UseSubmitBehavior, 349

V
Validateur, 347 ValidationSummary, 348 Vecteur dinitialisation, 49

Index

27

ViewState, 359 Vscontent, 381 Vstemplate, 377, 382

Windows Sharepoint Services WSS, 238 Wizard, 338

W
Web.cong, 256 WebBrowsable, 247 WebBrowser, 187 WebDescription, 247 WebDisplayName, 247 WebPartDisplayMode, 242 WebPartManager, 241 WebParts (lment), 238 WebPartZone, 241 Windows Management Instrumentation, 141

X
XmlDataSource, 202, 295 XmlDocument, 235 XmlHttpRequest, 320 XmlSerializer, 98 XmlTextWriter, 235

Z
ZoneTemplate, 250

Le guide du codeur 431

Notes

Notes

Notes

Notes

Notes

Notes

Notes

Notes

Notes

Notes

Notes

Notes

Notes

Notes

Notes

Compos en France par Jouve 11, bd de Sbastopol - 75001 Paris

Vous aimerez peut-être aussi