Académique Documents
Professionnel Documents
Culture Documents
2006 Micro Application 20-22, rue des Petits-Htels 75010 Paris 1re dition - Septembre 2006
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.
: dans les programmes, indique un retour la ligne d aux contraintes de la mise en page.
Met laccent sur un point important, souvent dordre technique quil ne faut ngliger aucun prix.
1.4.
1.5.
1.6.
2.3.
2.4.
3.3.
3.4.
Sommaire
4.2.
4.3.
4.4.
5.3.
5.4.
6.4. 6.5.
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.
8.3.
8.4.
9.3.
9.4. 9.5.
9.6.
Sommaire
10
11
12
13
Sommaire
14
15
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
18
19
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
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
. . . 348 . . . 349
23
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
25
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
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
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
18 Le guide du codeur
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
<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.
Cliquez du bouton droit sur le dossier Tables pour en ajouter une nouvelle. Crez les champs de votre base conformment limage suivante :
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
Pour nir, appelez votre table DVD en modiant la proprit (Nom) dans le volet des proprits.
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.
Maintenant que votre source de donnes est congure, vous pouvez concevoir linterface graphique de votre application.
Le guide du codeur 21
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.
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
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.
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
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
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.
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
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
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.
30 Le guide du codeur
Interface utilisateur
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
se trouvent les chiers que vous souhaitez parcourir ainsi que le nom dune image lorsque vous voudrez lenregistrer.
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.
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
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.
Le guide du codeur 33
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.
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.
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.
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
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
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
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
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
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
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.
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.
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.
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
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
Dock Fill
46 Le guide du codeur
Interface utilisateur
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
Fill Fill
Le guide du codeur 47
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.
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
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.
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
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.
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
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.
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
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
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.
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
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
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
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
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.
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.
Dans lAssistant qui se lance, slectionnez le choix Objet et cliquez sur Suivant.
Le guide du codeur 63
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.
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.
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.
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
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.
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.
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
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.
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.
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
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
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
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
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
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.
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
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.
Le guide du codeur 77
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
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.
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.
Le guide du codeur 79
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
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
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.
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
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
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
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
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
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
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
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
Cration de linterface .................................. 92 Cration de menus ....................................... 94 Gestion des liens ......................................... 96 Page Contact ............................................ 101 Check-list .................................................. 103
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.
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.
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
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>
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.
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
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.
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
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
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
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
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.
Page Contact
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.
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.
Ch apit re
Classes et espaces de noms utiliss ............. Accs aux donnes .................................... Interface utilisateur ................................... Ralisation ................................................ Check-list ..................................................
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.
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.
Interface utilisateur
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 :
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.
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
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"
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
</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
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.
Ch apit re
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.
des menus.
Pour dbuter ce nouveau projet, crez un nouveau site web et ajoutez la hirarchie de pages suivantes :
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.
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
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
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.
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.
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
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
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
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.
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.
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.
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.
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
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.
Gestion de la scurit
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.
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.
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.
Gestion de la scurit
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.
Tout le monde
RedacteurActualites RedacteurDossiers
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.
Gestion de la scurit
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.
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.
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.
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.
Espace de noms My
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.
Moniteur de performances
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.
Espace de noms My
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.
Moniteur de performances
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.
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
/(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"
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
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
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
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.
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
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.
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()
Liez prsent ce menu contextuel au formulaire en modiant la proprit ContextMenuStrip et en slectionnant le menu que vous venez de crer.
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 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
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.
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.
Ch apit re
10
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.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.
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.
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.
10
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.
Interface utilisateur
10
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.
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
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
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.
10
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).
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
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
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
10
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.
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
10
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.
Ralisation
10
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.
10
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.
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.
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
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.
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)
11
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.
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))
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.
11
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.
11
Explorateur de disques
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 :
11
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
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.
Composant BackgroundWorker
11
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
11
Explorateur de disques
Lapplication est prsent fonctionnelle et linterface graphique ne se ge plus lors de longs traitements.
Check-list
11
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.
Ch apit re
12 Navigateur Internet
Classes et espaces de noms utiliss ............. Conguration ............................................ Interface utilisateur ................................... Ralisation ................................................ Check list .................................................
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.
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
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.
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.
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.
Ralisation
12
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
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
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
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
12
Navigateur Internet
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.
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.
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.
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
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.
Ch apit re
13 Aggrgateur RSS
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>
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é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 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.
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
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
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.
Ralisation
13
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.
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.
Ralisation
13
Placez-donc un contrle Repeater sur votre formulaire et dnissez la source de donnes utilise par ce contrle laide du smart tag du contrle.
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>
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>
Lorsque vous excutez votre page web, elle doit afficher le ux RSS de la version franaise du site ASP .NET.
Ralisation
13
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.
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 />
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.
Ch apit re
14
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.
Conguration du systme
14
lURL indique que tous les sous-domaines de ces sites seront galement considrs comme des 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).
14
14
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.
14
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
<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
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
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>
14
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
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
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
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>
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.
Ch apit re
15
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.
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.
Interface utilisateur
15
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.
15
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.
Interface utilisateur
15
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.
15
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.
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
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.
15
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.
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
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
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
15
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.
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
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.
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)
15
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.
Ch apit re
16 WebParts
Classes et espaces de noms utiliss ............. Conguration ............................................ Construction de lapplication ........................ Ajout dune proprit "personnalisable" un WebPart ........................................... Check-list ..................................................
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.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.
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
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
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"
Construction de lapplication
16
connectionStringName="LocalSqlServer" applicationName="/WebPart" /> </providers> </personalization> <authorization> <deny users="*" verbs="enterSharedScope" /> <allow users="*" verbs="modifyState" /> </authorization> </webParts>
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.
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.
Construction de lapplication
16
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>
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.
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.
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
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
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.
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
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.
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.
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>
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.
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.
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.
16
WebParts
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
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.
16
AppearanceEditorPart
Le contrle AppearanceEditorPart permet de modier plusieurs proprits dinterface utilisateur relatives lapparence dun contrle WebPart, comme sa taille ou son titre.
LayoutEditorPart
Le contrle LayoutEditorPart permet de modier plusieurs proprits dinterface utilisateur concernant la disposition dun contrle WebPart dans une zone.
16
WebParts
BehaviorEditorPart
Le contrle BehaviorEditorPart permet de modier plusieurs proprits dinterface utilisateur concernant le comportement et les autorisations dun contrle WebPart.
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).
Ch apit re
17
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.
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.
Conguration
17
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
17
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.
Conguration
17
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
17
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.
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
17
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
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.
17
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.
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]"
17
/>
domain="domaine.ext"
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
17
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
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
17
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.
Ch apit re
18
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.
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.
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
m Figure 18-3 : Fentre Proprits dun contrle dune page aspx en mode Design
18
correspondante en slectionnant la commande Options du menu Outils. Les options relatives aux diffrents diteurs se trouvent dans le menu diteur de texte.
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.
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.
18
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.
Personnaliser un environnement de dveloppement Nhsitez pas parcourir lensemble des options de Visual Studio an de congurer votre environnement de dveloppement selon vos souhaits.
18
Une bote de dialogue souvre alors et propose plusieurs styles prcongurs. La slection dun style permet de visualiser le rendu que vous obtiendrez.
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>
18
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.
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.
Thmes
18
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.
18
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.
Vous pouvez alors ajouter lextension .skin et lassocier lditeur de contrle utilisateur.
Thmes
18
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.
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" />
18
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" />
18
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
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.
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
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).
18
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
ou
Partial Class _Default Inherits Base.Page
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
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.
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.
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.
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.
19
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.
ValuePath
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.
19
4 Vous pouvez notamment modier la proprit SelectAction, qui vous permet de spcier laction effectuer au moment de la slection du nud.
19
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.
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.
19
Lapparence du contrle dans lditeur en mode Design est mise jour pour reter les changements de style qui vous avez effectu.
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.
19
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.
Ressources embarques Ces images sont stockes dans lassembly System.Web en tant que ressources embarques.
personnalis.
19
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
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.
ValueField
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 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
19
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.
19
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
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.
19
19
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.
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
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.
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.
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.
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"/>
20
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.
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
20
3 La bote de dialogue Ajouter un nouvel lment souvre et vous pouvez ajouter un chier de ressources avec une extension .resx.
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.
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
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.
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.
Dans ce chapitre, nous nous intresserons essentiellement aux chanes de caractres qui reprsentent la majeure partie des ressources localiser.
Expressions de ressource
20
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
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.
20
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.
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.
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.
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
m Figure 20-11 : Assistant de ressources dun contrle dont lattribut meta:resourcekey est dni
20
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>
20
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.
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.
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.
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.
20
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.
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.
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
Avant dentrer dans le dtail des dveloppements effectuer, vous allez tout dabord crer la base de donnes destine stocker les ressources.
20
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.
20
2 Aprs avoir cr la table, utilisez lExplorateur de serveur pour naviguer dans la base et slectionner la table Resource.
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.
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.
20
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
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
20
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.
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 ..................................................
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.
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.
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.
21
Atlas
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.
Installation
21
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.
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.
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.
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>
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
21
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.
21
Atlas
Avant dutiliser le Framework Atlas dans des pages web, voyons les diffrentes syntaxes 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
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
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.
21
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>
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.
7 Un bouton New Trigger ouvre une nouvelle bote de dialogue qui permet dajouter facilement un dclencheur. Slectionnez dabord le type de
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 :
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 :
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.
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.
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
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()
21
Atlas
6 Vous pouvez tester votre zone de saisie en entrant quelques lettres. Une liste de tous les contacts correspondants saffichera alors.
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.
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
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.
Contrle Wizard
22
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
22
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.
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>
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.
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 :
22
Ralisation du questionnaire
22
Le contrle Wizard possde plusieurs proprits de style correspondant chacun de ces composants.
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>
22
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.
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.
22
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
22
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>
22
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>
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.
22
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.
Ch apit re
23
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
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.
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.
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.
23
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.
23
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.
La mme commande est accessible partir de lExplorateur de solutions : cliquez du bouton droit sur le projet et slectionnez la commande Ajouter une rfrence.
Une bote de dialogue de slection avec plusieurs onglets vous propose alors les assemblys auxquels vous pouvez faire rfrence.
23
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.
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 ;
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
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
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
23
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
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.
Placez-la dans la racine de votre projet puis dclarez-la comme ressource incorpore dans la proprit Action de gnration.
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")>
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
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
23
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.
DefaultEventAttribute
Lorsque vous utiliserez votre contrle, lditeur de proprits vous proposera de slectionner lURL de limage partir dune bote de dialogue.
23
diteurs de proprits Il existe de nombreux autres diteurs de proprits dans lespace de noms
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
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
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")
Cration du designer
23
Lorsque vous afficherez la page dans votre navigateur, vous pourrez cliquer sur limage et slectionner une date grce au calendrier
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
ComponentModel.Design.DesignerActionList.
Public Class DatePickerActionList Inherits System.ComponentModel.Design.DesignerActionList
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
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
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.
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.
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
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.
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 ;
24
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.
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
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.
24
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.
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
Vous y retrouverez par exemple lensemble des lments que vous pouvez ajouter un site 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.
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.
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.
24
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.
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.
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.
24
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.
Ce tableau prsente les diffrents lments XML que peut contenir un chier .vstemplate :
lments dun chier .vstemplate lment lment enfant Attribut
24
CustomParameters DefaultName Description EnableLocationBrowseButton Folder FullClassName Hidden Icon LocationField LocationFieldMRUPrefix Name NumberOfParentCategories ToRollUp Project ProjectCollection ProjectItem (modle
Package | ID
Package | ID
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
24
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
24
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
<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.
24
Aprs avoir enregistr ce chier au mme emplacement que le modle de projet, ajoutez-les une archive compresse puis renommez-la avec une
24
extension .vsi. Le chier apparat alors avec une icne signiant quil est reconnu par Visual Studio.
24
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.
5 Si vous cliquez sur le lien Installation termine, une fentre rcapitulative souvre indiquant notamment les rpertoires dans lesquels le modle a t copi.
24
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.
24
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.
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.
Ch apit re
25
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.
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).
Serveur FTP
25
2 Le premier cran vous demande daccepter les termes du 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.
25
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
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.
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.
25
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.
Serveur FTP
25
Cette interface indique notamment quelle est connecte au serveur et quelle est dans lattente de lauthentication dun utilisateur.
2 La fentre de gestion des utilisateurs souvre. Aucun utilisateur nest prsent pour le moment dans la liste situe droite.
25
4 La bote de dialogue dajout dun utilisateur souvre. Saisissez le nom dutilisateur test.
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.
6 Slectionnez la page Shared folders pour lui attribuer des rpertoires quil peut visiter.
Serveur FTP
25
7 Pour ajouter un rpertoire, cliquez sur le bouton Add. Une bote de dialogue souvre.
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.
25
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.
Client FTP
25
11 La page IP Filter permet dindiquer des adresses ou des plages dadresses IP pour lesquelles laccs est autoris.
25
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.
Le bouton Connexion Rapide enregistre les dernires adresses auxquelles vous avez essay de vous connecter.
Client FTP
25
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.
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.
25
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
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
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
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.
25
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)
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
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
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
25
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
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
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
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.
Ch apit re
26 Annexes
26
Annexes
26.1 Glossaire
.NET
Plateforme de dveloppement multilangage cre par Microsoft.
ADO .NET
Technologie du Framework .NET permettant la gestion complte de laccs aux donnes.
Appartenance (membership)
Fonctionnalit de gestion des utilisateurs dune application web.
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.
CAB
Fichier compress contenant une application installer.
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.
26
Annexes
ClickOnce
Technologie .NET de dploiement et de mise jour intgre dans les applications Windows.
Code Behind
Code dune page web dans un chier de classe spar du chier correspondant lapparence.
Composant
Objet qui na pas de reprsentation graphique et qui nest donc pas visible sur le rendu nal du formulaire lors de son excution.
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).
26
Annexes
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.
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.
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).
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.
Librairie de classes
Ensemble de classes.
26
Annexes
Localisation ou Globalisation
Traduction des diffrents composants dune application pour ladapter plusieurs cultures.
Mono
Le projet Mono vise fournir une implmentation libre de la plateforme de dveloppement Microsoft .NET.
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.
PostBack
Publication dune page web, rafrachissement.
Procdure stocke
Ordre SQL stock et excut au sein du systme de gestion de bases de donnes.
Glossaire
26
Prol
Stockage de donnes personnalises relatives un utilisateur dun site web.
Projet WinForm
Projet .NET permettant de concevoir des applications Windows Forms.
Service web
Programme qui fournit des informations par le biais dun ux XML via un protocole web.
Runtime
Moteur dexcution de code.
Smart tag
lment qui permet daccder aux tches courantes dun contrle en mode dition.
ViewState
Fonctionnalit qui permet de stocker ltat des contrles dune page web entre deux publications.
Le guide du codeur 417
26
Annexes
Web.cong
Fichier de conguration XML dun site web ASP .NET.
WebPart
Contrle de page web qui peut tre personnalis par lutilisateur.
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/.
Rfrences web
26
Blogs anglais
j j j
Blogs francophones
j j
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.
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".
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 ?".
26
Annexes
Rfrences web
26
26
Annexes
Liens Microsoft
Visual Studio
Retrouvez lensemble de la gamme Visual Studio 2005 ladresse www.microsoft .com/france/msdn/vstudio/default.mspx.
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.
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
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
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
Index
27
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
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
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
Notes
Notes
Notes
Notes
Notes
Notes
Notes
Notes
Notes
Notes
Notes
Notes
Notes
Notes
Notes