Vous êtes sur la page 1sur 91

INSIA

2011 Prendre en main les applications winforms

Utiliser les types et les structures du langage C#

Cours de C#

Page 1 sur 91

INSIA

2011 Prendre en main les applications winforms

Sommaire
1 INTRODUCTION .........................................................................................................................................3 1.1 1.2 2 CONTEXTE FONCTIONNEL ........................................................................................................... 3 CONTEXTE TECHNIQUE ............................................................................................................... 4

DEFINIR LINTERFACE UTILISATEUR DE LAPPLICATION .................................................................5 2.1 2.2 2.3 2.4 CREER LE PROJET ET LA FENETRE PRINCIPALE ............................................................................ 5 DEFINIR LES MENUS ................................................................................................................. 11 POSITIONNER LES CONTROLES DE DONNEES ............................................................................. 32 LOCALISER LAPPLICATION ........................................................................................................ 41

ALIMENTER LA GRILLE AVEC LE CONTENU DUN FICHIER CSV ....................................................48 3.1 3.2 3.3 CREER ET UTILISER LA TABLE EN MEMOIRE ................................................................................ 49 ALIMENTER LA TABLE EN MEMOIRE AVEC LE FICHIER CSV .......................................................... 58 FINALISEZ LE COMPORTEMENT DE LA FENETRE .......................................................................... 80

POUR ALLER PLUS LOIN ...................................................................................................................91 4.1 4.2 LES LIENS UTILES ..................................................................................................................... 91 IDEE/RESSOURCE..................................................................................................................... 91

Cours de C#

Page 2 sur 91

INSIA

2011 Prendre en main les applications winforms

1 Introduction
Cet atelier sinscrit dans le cadre du tutorial du coach C# dont lobjectif est la dcouverte et lutilisation du langage C# 2.0 avec Visual Studio 2005 pour la construction dapplications avec une approche oriente objet. Les exercices de latelier 2 se proposent de vous prsenter lutilisation des types et des structures de bases du langage C# en dveloppant une application simple base de formulaire Windows.

1.1 Contexte fonctionnel


Rappel du contexte fonctionnel du tutorial du coach C# Lobjectif du tutorial du C# est daccompagner les dveloppeurs la prise en main du langage C# dans le cadre de projets de dveloppement. Il sadresse tous ceux qui, connaissant un autre langage ou ayant une exprience de dveloppement, souhaitent aller vers la programmation C#. Ce tutorial se concentre donc sur le langage, en labordant plus du point de vue des besoins des dveloppeurs que de celui dune liste exhaustive des caractristiques techniques. Le guide de rfrence complet du langage C# est disponible en ligne sur le site MSDN de Microsoft ladresse suivante : http://msdn2.microsoft.com/fr-fr/library/67ef8sbd(VS.80).aspx Contexte fonctionnel du deuxime atelier Cet atelier dcrit la grammaire du langage C# et les diffrents types que vous allez ncessairement utiliser dans vos tches de programmation. De plus, est aborde la gestion des blocs de programmation, qui est importante tant du point de vue de la porte des variables que de celui de la gestion de la mmoire. Vous allez donc dvelopper une application base de formulaire pour afficher une liste dinformations, lue dans un premier temps partir dun fichier au format Texte dlimit ou CSV. Cette application prsente une fentre avec une grille de travail sur les donnes : TextBox de rsultat de calcul

Grille de donnes
Menus de sauvegarde et douverture des fichiers CSV

Cours de C#

Barre de navigation

Page 3 sur 91

INSIA

2011 Prendre en main les applications winforms

Pour la programmation de cette partie, vous allez utiliser une approche lancienne , c'est--dire que vous allez utiliser des objets de donnes dfinis la main en lisant un contenu au format texte-dlimit. La programmation que nous allons utiliser confre ce que lon faisait dans un temps pas si ancien, lorsque nous programmions en client/serveur deux niveaux.

1.2 Contexte technique


A la fin de cet atelier, vous saurez comment : Crer une application simple base de formulaire ; Diffrencier les types par valeurs et les types par rfrence ; Dfinir la porte des variables ; Organiser votre code en bloc, afin de limiter les portes des variables ; Utiliser les principales instructions de bouclage et de tests ; Utiliser les principaux oprateurs ; Utiliser des objets fournis par le Framework

Cours de C#

Page 4 sur 91

INSIA

2011 Prendre en main les applications winforms

2 Dfinir linterface utilisateur de lapplication


Dans cet exercice, vous allez apprendre : Crer un projet de dveloppement type formulaire Windows ; Positionner les diffrents contrles graphiques de linterface utilisateur ; Localiser lapplication dans diffrentes langues ;

Objectif Lobjectif de cet exercice est de dbuter le dveloppement dune application base de formulaire en positionnant les lments et contrles de linterface utilisateur , tout en abordant les concepts de base du langage C#. Contexte fonctionnel Vous tes dveloppeur, et vous avez implmenter des crans qui ont t dcrits dans lanalyse fonctionnelle, ou mieux qui ont t conu s par un designer dapplication base de formulaire (on peut rver un peu, non ?). Plus probablement, on vous a donn un bout de feuille issu dune runion et qui dcrit ce quil faudrait faire :

Votre premire tche est de raliser cette interface utilisateur.

2.1 Crer le projet et la fentre principale


Droulement de lexercice : 1. Crez la solution : Lancez Visual C# Dans Visual C# Express, cliquez le menu Fichier > Nouveau projet Cours de C# Page 5 sur 91

INSIA

2011 Prendre en main les applications winforms

La bote de dialogue Nouveau Projet saffiche. Dans cette bote de dialogue, slectionnez le modle de projet Application Windows et indiquez un nom de projet Coach.Editeur ; Modle du projet

Nom du projet

Cliquez le bouton OK. Un projet avec une fentre vide saffiche ;

Cours de C#

Page 6 sur 91

INSIA

2011 Prendre en main les applications winforms Si lexplorateur de solution nest pas visible, pour lafficher dans Visual C# Express cliquez le menu Affichage > Explorateur de solutions ; Dans la barre doutils, cliquez la disquette pour sauvegarder votre solution ; Sauvegarde de la solution

Dans la bote de dialogue Enregistrer un projet, indiquez votre rpertoire de travail, en cochant la case cocher Crer le rpertoire pour la solution ;

Cliquez sur Enregistrer ;

2. Renommez la fentre principale : Dans lExplorateur de Solutions, sur le fichier Form1.cs, faites un clicdroit et slectionnez le menu Renommer ;

Changez le nom de Form1.cs en Main.cs ; Appuyez sur la touche Entre ; La fentre suivante saffiche :

Cours de C#

Page 7 sur 91

INSIA

2011 Prendre en main les applications winforms

Visual Studio vous propose ici de chercher automatiquement dans le projet en cours tous les endroits o il y a une rfrence au nom de la fentre Form1 et de les remplacer par le nouveau nom donn Main. Il va soccuper pour vous de renommer les variables et autres lments, ce qui est trs utile donc. Cliquez le bouton Oui ; En fait, un formulaire Windows est avant tout une classe dobjet (dailleurs tout est classe dobjet dans .Net ). En double cliquant sur le nom de la fentre Main.cs dans lExplorateur de solutions, vous verrez le designer de formulaire qui affiche linterprtation du code de dfinition de la classe. Ce code peut aussi tre affich en cliquant dans la barre doutil de lexplorateur de solutions licne ; Il est possible dafficher le code dun formulaire en suivant dautres chemins : a. Vous faites un clic-droit sur le fichier du formulaire et slectionnez le menu Afficher le code ;

b. Vous slectionnez le fichier du formulaire et vous cliquez le menu Visual C# Express Affichage > Code ;

Un formulaire Windows est compos dau moins deux fichiers dans Visual Studio. Ils sont visibles en cliquant sur licne prcdent le nom du fichier.

Le fichier Main.cs contient tous les codes que vous allez programmer, et le fichier Main.Designer.cs contient tous les codes qui sont gnrs par Visual Studio. Le code gnr est exactement celui que nous devrions dvelopper la main si nous voulions faire lquivalent de ce que fera le gnrateur. Il ny a ainsi aucun code cach et la totalit du code est accessible ! Nhsitez donc pas aller y jeter un coup dil, mais ne vous lancez pas le modifier si vous ne savez pas ce que vous faites, sauf Cours de C# Page 8 sur 91

INSIA

2011 Prendre en main les applications winforms pour corriger des ventuelles erreurs de compilation lies des destructions intempestives de contrles par exemple.

3. Paramtrez la fentre principale : Affichez le formulaire Main.cs en double-cliquant sur son fichier dans lexplorateur de solutions ; Il y a de fortes chances que le formulaire ait dj t ouvert, et dans ce cas vous pouvez cliquer directement sur longlet Main.cs [Design] de la zone de travail ;

En faisant un clic-droit sur ces onglets, vous avez aussi un menu contextuel qui propose des options intressantes comme fermer toutes les documents ouverts sauf celui en cours (utiles lorsquil y a tellement de fichiers ouverts quon est un peu perdu), ou comme ouvrir deux documents en visualisation simultane sur la zone de travail (utile pour comparer et/ou copier-coller facilement du code). Fermeture des documents Visualisation simultane

Sur le formulaire, faites un clic-droit et slectionnez le menu Proprits ;

Dans la fentre Proprits qui est apparue sur la droite, vrifiez tout dabord que vous tes bien sur le bon objet, dont le nom et le type saffiche dans la liste droulante en haut ; Page 9 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms

Liste droulante Si vous avez un formulaire complexe, cette liste droulante est utiliser pour slectionner le bon lment. Dune manire gnrale, cest une bonne pratique que de vrifier le nom du contrle dont vous modifiez les proprits. La barre doutils de la fentre de Proprits possde les boutons suivant : - Le bouton affiche les lments en les triant par catgorie ; - Le bouton affiche les lments en les triant par nom ; - Le bouton dfinit que les lments afficher sont les proprits de lobjet slectionn ; - Le bouton dfinit que les lments afficher sont les vnements de lobjet slectionn cette vue sert ajouter facilement des mthodes de rponses aux vnements (nous verrons cela plus tard) ; - Le bouton affiche une page de proprits complmentaires de lobjet, sil en existe une bien sr. Dans la fentre de Proprits, les proprits affiches en gras sont celles que vous avez modifies. Les autres indiquent les valeurs par dfaut. Pour chacune des proprits dont la valeur indique est diffrente de la valeur par dfaut, Visual C# Express va gnrer une (ou plusieurs) ligne(s) dans le fichier Main.Designer.cs ; Dans la fentre Proprits, slectionnez la proprit Text et tapez la valeur Editeur du Coach C# ; Vous remarquerez que le titre de la fentre a chang

Dans Microsoft .net, la proprit Text rfrence toujours ce qui est affich par le contrle lcran, mme pour les labels ou les boutons. Dans la fentre Proprits, slectionnez la proprit Size (dimension), ouvrez la en cliquant sur , et indiquez la valeur 727 pour Width (largeur) et 427 pour Height (hauteur) ;

Dans la barre doutils de Visual C# Express, cliquez le bouton sauvegarder toutes les modifications ralises ;

pour

Cours de C#

Page 10 sur 91

INSIA

2011 Prendre en main les applications winforms

2.2 Dfinir les menus


Lobjectif de cet exercice est dajouter lapplication deux types de menus : - Une barre de menu standard qui saffiche sous le titre de la fentre ;

Un menu contextuel, qui va safficher quand lutilisateur fera un clic droit sur un icne saffichant dans la zone de notification (en bas droite de lcran )

Nous en profiterons pour programmer nos premires lignes de code dans cette application afin de connecter quelques sous menus (comme Quitter par exemple ). Droulement de lexercice : 1. Ajoutez la barre de menu standard : Visual Studio C# Express propose beaucoup de contrles pour vous aider construire vos crans. Ces contrles sont disponibles dans la Boite outils qui saffiche en standard sur la gauche de votre cran. Si elle nest pas visible, vous pouvez lafficher en cliquant le menu Affichage > Boite outils dans Visual C# Express. Vous pouvez ajouter (ou retirer) des contrles la liste qui est propose. Pour ce faire, faites un clic-droit dans la Boite outils, et le menu suivant saffiche :

Cours de C#

Page 11 sur 91

INSIA

2011 Prendre en main les applications winforms

Slectionner le menu Choisir les lments et la boite de dialogue Choisir des lments de bote outils vous aide slectionner les composants que vous souhaitez ;

Slection directe de la dll

Le bouton Parcourir permet de slectionner directement un assemblage (.dll) qui contiendrait des contrles voulus. Vous pouvez ajouter des composants issus de nombreuses socits tierces Microsoft, ou issus de sites communautaires comme http://www.codeplex.com/. Sur la page daccueil de ce dernier, slectionnez la galerie de contrles et vous avez une liste de contrles et dexemples tlchargeables. La Boite outils affiche uniquement les composants qui sont disponibles compte tenu du contexte en cours. Si vous tes dans une page de code, la Boite outils sera donc vide.

Cours de C#

Page 12 sur 91

INSIA

2011 Prendre en main les applications winforms

Pour afficher le contenu de la Boite outils, vrifier donc bien que vous avez slectionn le formulaire en mode [Design]. Ouvrez le formulaire Main.cs en mode [Design] en double-cliquant sur le fichier Main.cs dans lExplorateur de solutions ; Dans la boite outils, ouvrez longlet Menus et barre doutils en cliquant sur qui prcde le nom de longlet ;

Faites un glisser-dplacer du contrle Menustrip sur le formulaire ; Vous devez voir apparatre deux choses sur votre formulaire : une barre de menu vide sous le titre et un contrle de menu (menuStrip1) dans une nouvelle zone de dpt de contrles en bas de la zone de travail ;

Barre de menu (visuel) Contrle de menu

Zone de dpt de contrles

Cours de C#

Page 13 sur 91

INSIA

2011 Prendre en main les applications winforms Faites un clic-droit sur le contrle menuStrip1 et slectionnez le menu Proprits ;

Dans les proprits du contrle, changez son nom par mainMenuStrip en changeant la valeur de la proprit (Name) ; Cette proprit apparat parmi les premires si vous tes en classement alphabtique (bouton de la barre doutils des proprits) ;

Le langage C# est sensible la casse des mots. Autrement dit MainMenuStrip ne reprsente pas la mme chose que mainMenuStrip. Pensez donc systmatiquement faire attention la faon dont vous nommez vos variables et composants afin dviter les erreurs de compilation. Le meilleur moyen est de suivre un plan de nommage et de notation prcis. Pour tout savoir sur les bonnes pratiques et les conventions concernant le nommage, voici un lien trs intressant : http://msdn2.microsoft.com/fr-fr/library/ms229002(VS.80).aspx Dans la fentre Main.cs en mode [Design], faites un clic-droit sur la barre de menu que vous venez dajouter ; Slectionnez le menu Insrer des lments standard ; Magique Non ? Bon seuls les menus ont t ajouts (cest dj bien), et il reste ajouter le code ;

Cours de C#

Page 14 sur 91

INSIA

2011 Prendre en main les applications winforms Dans la fentre Main.cs en mode [Design], faites un double-clique sur le menu Fichier > Quitter ;

Une mthode quitterToolStripMenuItem_Click de rponse au menu Quitter a t ajoute au code du formulaire Main.cs ;

Code C#
public partial class Main : Form { public Main() { InitializeComponent(); } private void quitterToolStripMenuItem_Click(object sender, EventArgs e) { } }

Dans la mthode quitterToolStripMenuItem_Click, ajoutez le code de fermeture du formulaire this.Close();

Code C#
public partial class Main : Form { public Main() { InitializeComponent(); } private void quitterToolStripMenuItem_Click(object sender, EventArgs e) { // Fermeture du formulaire this.Close(); } }

Dans la barre doutil de Visual C# Express, cliquez le bouton sauvegarder toutes les modifications ralises ;

pour

Cours de C#

Page 15 sur 91

INSIA

2011 Prendre en main les applications winforms Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; LEditeur du coach C# se lance, et en cliquant son menu Fichier > Quitter, il se ferme ! Flicitation, vous venez de russir la premire ligne de code (bon certes, nous navons pas encore affich Hello World , mais cest un bon dbut). Cest quoi this ? Le mot cl this rfrence linstance courante dun objet. Dans notre cas il sagit donc de linstance de la fentre Main qui sera cre lors de lexcution du programme. Pour tout savoir sur le mot cl this, veuillez aller sur le lien : http://msdn2.microsoft.com/fr-fr/library/dk1507sz(VS.80).aspx Mais comment fait le systme pour retrouver la bonne mthode excuter quand on clique sur Quitter ? Ce nest pas le nom de la mthode qui fait foi. En fait, la fonction de prise en charge de lvnement (ou la mthode de rponse lvnement, qui se dit Event Handler en anglais) a t dans notre cas automatiquement paramtre par Visual C# Express dans le fichier Main.Designer.cs lorsque nous avons fait un double clic sur le menu Quitter. Nous allons aller voir la dfinition (faites attention de ne rien modifier ) : - Ouvrez le fichier Main.Designer.cs en double cliquant dessus dans lExplorateur de solutions ; - Dans ce fichier, cherchez la partie qui est automatiquement gnre par Visual C# Express ;

Cest ici quest dfinie la relation entre lvnement et la fonction de prise charge.

Cliquez sur le signe pour visualiser les lignes de code ; Avec la barre de dfilement vertical, survolez le code et localisez la dfinition du menu quitterToolStripMenuItem ;

Nous reviendrons plus dans le dtail sur ces fonctions de prise en charge des vnements (ou Event Handler ), notamment sur le formalisme utiliser. Ce quil faut retenir est quil ny a aucun code cach, et que nous pourrions si nous le dsirerions nommer comme nous le voudrions la fonction de rponse lvnement (avec un beau et original nom comme toto par exemple ! mais cela ne facilite pas la maintenance par la suite). Fermez le fichier de code Main.Designer.cs en cliquant sur le bouton de longlet du fichier ; Page 16 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms Comment visualiser lensemble des vnements disponibles sur le menu Quitter ? - Dans la fentre Main.cs en mode [Design], faites un clic-droit sur le menu Quitter et slectionnez le menu Proprits ;

Dans les Proprits du menu Quitter, cliquez le bouton de la barre doutils pour afficher lensemble des vnements ; Vous devez voir que seul lvnement Click possde une mthode de rponse ;

Par la suite, pensez cliquer sur le bouton de la barre doutils des Proprits pour revenir la liste des proprits ;

Pour ajouter une fonction de rponse un vnement, il suffit daller visualiser la liste des vnements disponibles sur le contrle slectionn (cf. ci-dessus) et de double-cliquer sur le nom de lvnement. Cela va ajouter automatiquement la fonction dans votre fichier de code (par exemple Main.cs), et le paramtrage de lvnement dans le fichier utilis par le designer de Visual C# Express (par exemple Main.Designer.cs). Au lieu de double-cliquer, vous pourriez aussi indiquer un nom quelconque pour la fonction de prise en charge ( toto par exemple), et au moment ou vous allez taper Entre, Visual C# Express va tout crer pour vous. Si vous dtruisez la fonction de rponse de votre fichier de code, il faudra aussi penser retirer le paramtrage de lvnement dans le fichier utilis par le designer, Visual C# Express ne pouvant le faire pour vous car il ne sait pas si la destruction (ou le changement de nom) est conscutif une erreur ou un choix dcid du programmeur. De toute manire, si vous ne le faites pas, vous obtiendrez une erreur de compilation (et oui, le compilateur C# vrifie un maximum de chose). Cours de C# Page 17 sur 91

INSIA

2011 Prendre en main les applications winforms

2. Ajouter un menu contextuel : Nous allons maintenant ajouter un menu contextuel, qui va safficher quand lutilisateur fera un clic droit sur un icne saffichant dans la zone de notification (en bas droite de lcran)

Pour ce faire nous devons suivre quatre tapes : - Ajouter un icne saffichant lors de lexcution dans la zone de notification, et le paramtrer ; - Ajouter un menu contextuel, et le paramtrer ; - Lier licne de notification et le menu contextuel ; - Ajouter le code correspondant aux options du menu contextuel. Ouvrez le formulaire Main.cs en mode [Design] en double-cliquant sur le fichier Main.cs dans lExplorateur de solutions ; Dans la boite outils, ouvrez longlet Contrles communs en cliquant sur qui prcde le nom de lobjet ; Faites un glisser-dplacer du contrle NotifyIcon sur le formulaire ; Vous devez voir apparatre le contrle notifyIcon1 dans la zone de dpt de contrles en bas de la zone de travail ;

Faites un clic-droit sur le contrle notifyIcon1 dans la zone de dpt de contrles, et slectionnez le menu Proprits ; Dans les proprits du contrle, changez son nom par mainNotifyIcon en changeant la valeur de la proprit (Name) ; Cette proprit apparat parmi les premires si vous tes en classement alphabtique (bouton de la barre doutils des proprits) ; Dans les proprits du contrle, changez la proprit Text avec Editeur du Coach C# ; Ce texte apparatra en aide rapide ( tooltip ) lorsque le pointeur de souris sera au dessus de licne ; Dans lExplorateur de solutions, faites un clic-droit sur le projet Coach.Editeur et slectionnez le menu Proprits ; Slectionnez longlet Ressources ; Sur lcran de gestion des ressources, cliquez le menu Ajouter une ressource > ajouter un fichier existant ; Page 18 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms

Par rapport au premier atelier, nous navons pas crer les ressources associes au projet car elles ont t automatiquement cres par le modle que nous avons utilis pour crer le projet. Dans la bote de dialogue Ajouter un fichier existant aux ressources, naviguez jusquau rpertoire des fichiers utiles de lexercice 01 de latelier 02 (par exemple C:\Coach C#\Atelier 02\Fichiers Utiles\Exercice 01) ; Dans la boite de dialogue Ajouter le fichier existant aux ressources, slectionnez le fichier lan_connected.ico et cliquez le bouton Ouvrir ;

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Fermez longlet des ressources du Coach.Editeur en cliquant sur son bouton de fermeture ; Dans lexplorateur de solutions, faites un clic-droit sur le fichier Main.cs et slectionnez le menu Afficher le code ;

Cours de C#

Page 19 sur 91

INSIA

2011 Prendre en main les applications winforms

Localisez dans la dfinition de la classe Main la mthode public Main() ; Il sagit du constructeur de la classe ;

Code C#
namespace Coach.Editeur { public partial class Main : Form { public Main() { InitializeComponent(); } () } }

Constructeur de la classe

Cest quoi un constructeur ? Le constructeur est la mthode membre dune classe que vous allez appeler chaque fois que vous instanciez un nouvel objet :

Type de variable

Nom de variable

Mthode membre appele pour linstanciation

Main main = new Main();

Lobjectif du constructeur est de crer convenablement une instance dobjet, en le configurant dans un tat valide. En C#, le constructeur rpond aux caractristiques suivantes : - Le nom du constructeur est rigoureusement le mme que le nom de la classe ; - Le constructeur na aucun type de retour spcifi (pas mme void). Comme toute mthode membre, il est possible de passer des paramtres au(x) constructeur(s) dune classe. Il est ainsi possible de dfinir plusieurs faons convenables de crer une instance dobjet. Cest notamment visible dans lIntelliSense qui vous propose de slectionner un des diffrents constructeurs disponible, le cas chant : Il y a ici trois faons de crer cet objet

Cours de C#

Page 20 sur 91

INSIA

2011 Prendre en main les applications winforms

Le constructeur qui ne possde aucun paramtre pass est appel le constructeur par dfaut. Dans le constructeur de Main, ajoutez le code pour initialiser licne du contrle mainNotifyIcon avec celui charg en ressource ; Bon, cest le mme code que celui fait latelier N1 (exercice 4.2.2), mais on va se rpter un peu :

Code C#
namespace Coach.Editeur { public partial class Main : Form { public Main() { InitializeComponent(); // Assignation de l'icone de mainNotifyIcon mainNotifyIcon.Icon = Properties.Resources. lan_connected; } () } }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Revenez sur le formulaire Main.cs en mode [Design] en cliquant sur longlet Main.cs [Design] de la zone de travail ; Dans la boite outils, ouvrez longlet Menus et barre doutils en cliquant sur qui prcde le nom de longlet ;

Faites un glisser-dplacer du contrle ContextMenustrip sur le formulaire ; Vous devez voir apparatre deux choses sur votre formulaire : une barre de menu contextuel vide sous le menu standard et un contrle de menu (contextMenuStrip1) dans la zone de dpt de contrles en bas de la zone de travail ; Un menu contextuel ne saffichant pas hors de son contexte (cest une Lapalissade), ds que le contrle du menu contextuel nest plus slectionn dans la zone de dpt de contrles, il disparat de lcran. Pour lafficher de nouveau, il vous suffit de slectionner le contrle dans la zone de dpt de contrles.

Cours de C#

Page 21 sur 91

INSIA

2011 Prendre en main les applications winforms Faites un clic-droit sur le contrle contextMenuStrip1 dans la zone de dpt de contrles, et slectionnez le menu Proprits ; Dans les proprits du contrle, changez son nom par mainNotificationIconContextMenuStrip en changeant la valeur de la proprit (Name) ; Cette proprit apparat parmi les premires si vous tes en classement alphabtique (bouton de la barre doutils des proprits) ; Sur la fentre, juste en dessous des menus standards, cliquez sur la boite de texte Tapez ici qui apparat dans le ContexMenuStrip juste en dessous des menus standards du formulaire ; TextBox Tapez ici

Saisissez dans la boite de texte Maximiser la fentre ;

Recommencez lopration avec les options Restaurer la fentre, Minimiser la fentre, et Quitter lapplication ;

Afin de sortir du mode de saisie des options du menu, faites un simple clic sur une des options dj saisie ; Dplacez le pointeur de souris sur la dernire boite de texte Tapez ici , et vous devez voir apparatre la flche dune liste droulante sur la droite du contrle ;

Cours de C#

Page 22 sur 91

INSIA

2011 Prendre en main les applications winforms

Liste droulante

La liste droulante vous aide insrer un autre type de ligne de menu : le MenuItem correspond une ligne de menu similaire celles que vous venez de saisir, une ComboBox ajoute une liste droulante, et le TextBox vous permet de saisir directement une valeur de menu lors de lexcution de lapplication. Il reste le Separator, que nous allons utiliser, et qui ajoute simplement une ligne grise horizontale dans la liste des menus. Cliquez sur Separator pour insrer une ligne de sparation dans la liste des menus ;

Faites un glisser-dplacer de la ligne de sparation afin de la positionner avant le menu Quitter lapplication ;

Sparateur positionn ici par glisser-dplacer.

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Faites un clic-droit sur le contrle mainNotifyIcon dans la zone de dpt de contrles, et slectionnez le menu Proprits ; Page 23 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms Dans les proprits du contrle, changez la valeur de ContextMenuStrip en utilisant la liste droulante propose, et selectionnez mainNotificationIconContextMenuStrip ;

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; LEditeur du coach C# se lance, et vous devez voir votre icne dans la zone de notification en bas droite de votre cran. Si vous faites maintenant un clic-droit sur votre icne, vous devez voir apparatre le menu contextuel. Reste donc programmer les options du menu.

Bon, si vous avez des erreurs de compilation, cest probablement li la casse car C# est case-sensitive, ou encore un ; qui manque en fin de ligne. Servez-vous des messages derreurs de compilation renvoys par Visual C# Express pour trouver les bonnes corrections. Nous allons maintenant dvelopper les mthodes de rponse aux vnements Click de chacun des menus. Arrtez le mode de dbogage en cliquant le bouton dans la barre doutils Dboguer de Visual C# Express (vous auriez tout aussi bien quitter lapplication de lEditeur du Coach C# en utilisant les menus Fichier > Quitter) Faites un clic sur le contrle mainNotificationIconContextMenuStrip dans la zone de dpt de contrles, afin de lafficher sur le formula ire ; Faites un double-clique sur loption du menu contextuel Quitter lapplication ;

Cours de C#

Page 24 sur 91

INSIA

2011 Prendre en main les applications winforms

Une mthode quitterLapplicationToolStripMenuItem_Click de rponse au menu Quitter lapplication a t ajoute au code du formulaire Main.cs ; Dans cette mthode, ajoutez le code de fermeture du formulaire ; Cest exactement la mme ligne de code que celle que nous avons ajout prcdemment pour rpondre au menu Fichier > Quitter du formulaire Main.cs (rien de difficile donc) ;

Code C#
private void quitterLapplicationToolStripMenuItem_Click(object sender, EventArgs e) { // Fermeture du formulaire this.Close(); }

Revenez sur le formulaire Main.cs en mode [Design] en cliquant sur longlet Main.cs [Design] de la zone de travail ; Faites un double-clique sur loption du menu contextuel Maximiser la fentre, pour ajouter la mthode de rponse ce menu maximiserLaFentreToolStripMenuItem_Click ; La proprit que nous allons utiliser est WindowsState de linstance de la fentre Main en cours (renvoye par this). Cette proprit, accessible en lecture et en criture obtient ou dfinit ltat de la fentre du formulaire. Type de proprits

Le type de cette proprit est FormWindowsState, qui est en ralit une numration de variables valeurs constantes (enum en C#) ; Type enum

Logo dune enum Les trois valeurs possibles proposes par cette numration de valeurs sont : Maximized, Minimized et Normal (en fait, chacune de ces valeurs correspond un entier unique dans la liste des valeurs, mais cest bien plus lisible avec une numration ) : Liste des valeurs Cours de C# Page 25 sur 91 disponibles dans lnumration

INSIA

2011 Prendre en main les applications winforms

Cest quoi un Type? Le Type indique globalement la taille quun objet va utiliser en mmoire, la faon dont on va accder cette mmoire, et tout ce que cet objet peut faire. C# et un langage fortement typ. Autrement dit, tous les objets que vous allez utiliser ou que vous allez crer en C# doivent avoir un type. Le systme de types C# comporte principalement des types valeurs (ou types intrinsques) et des types rfrences. Les variables de type valeur stockent directement des donnes (comme un entier ou une date) car le systme sait exactement la taille allouer pour ces donnes (un int32 fait toujours 32 octets !), alors que les variables de type rfrence stockent les rfrences aux donnes (en gros, ladresse des donnes en mmoire), car le systme ne sais pas ncessairement la taille allouer (quelle est la taille dune liste de clients ?). Les types rfrences sont galement considrs comme des objets.

Cest quoi une variable ? Pour les puristes, une variable est une instance dun type par valeur (type intrinsque). Bon, de mon cot, je dsigne (comme la plupart des dveloppeurs) une variable comme une instance dun type quelconque, par valeur ou par rfrence (voire par pointeur si vous devez intgrer des librairie existante en C++ ). Une variable est compose dun type et dun identificateur (aussi dit nom de la variable) : Type
int counter;

Identificateur

Assigner une variable, cest lui donner une valeur en mmoire, soit sa cration, soit ultrieurement lors de lexcution du programme. Une variable est donc fondamentalement en lecture/criture (do son caractre variable [cqfd]).
int compteur = 5 ; compteur = 6;

A la diffrence dautres langages du march, lassignation des variables est obligatoire en C#. Autrement dit, vous devez ncessairement dfinir la valeur par dfaut que va avoir votre variable, le compilateur ne pouvant le dcider pour vous cela vite bien des bogues difficiles dtecter lors de lexcution. Cest quoi une constante ? Une constante est une variable dont la valeur ne peut pas tre change lors de lexcution du programme (elle est en lecture uniquement). Une constante littrale est juste une valeur, comme 6, 12 ou "Coucou" ; Dailleurs, tapez un point juste aprs la constante littrale "Coucou" , et Cours de C# Page 26 sur 91

INSIA

2011 Prendre en main les applications winforms vous obtenez par lIntelliSense tout ce quil est possible de faire sur une chane de caractres (magique, non ?).

Une constante symbolique est lassignation dun nom une valeur. La dclaration dune constante symbolique est ralise par la ligne suivante :
const int valeurMaximumDuCompteur = 42;

Type

Identificateur

Assignation de la valeur

Cest quoi une numration ? Une numration est un ensemble de constantes symboliques nommes. Code C#
public enum FormWindowState { Normal, Minimized, Maximized }

La valeur des constantes de la liste ntant pas prcise, le compilateur affecte des valeurs entires en commenant 0 ; le code ci-dessus est donc similaire : Code C#
public enum FormWindowState { Normal = 0, Minimized = 1, Maximized = 2 }

Cours de C#

Bon, revenons nos moutons. En faisant le double-clique sur loption du menu contextuel Maximiser la fentre, nous venons dajouter la mthode maximiserLaFentreToolStripMenuItem_Click , qui est en fait la mthode de rponse lvnement click du menu contextuel; Dans cette mthode, ajoutez le code pour maximiser la fentre en cours ; Page 27 sur 91

INSIA

2011 Prendre en main les applications winforms

Code C#
private void maximiserLaFentreToolStripMenuItem_Click(object sender, EventArgs e) { // Maximise la fentre en cours this.WindowState = FormWindowState.Maximized; }

Revenez sur le formulaire Main.cs en mode [Design] en cliquant sur longlet Main.cs [Design] de la zone de travail ; Faites maintenant un double-clique sur loption du menu contextuel Minimiser la fentre, pour ajouter la mthode de rponse ce menu, dans laquelle vous indiquez que ltat de la fentre est minimis (FormWindowState.Minimized) ; Rptez encore lopration pour loption du menu contextuel Restaurez la fentre, et indiquez maintenant que ltat de la fentre est normal (FormWindowState. Normal) ; Le code de rponse des options du menu contextuel doit tre le suivant :

Code C#
private void quitterLapplicationToolStripMenuItem_Click(object sender, EventArgs e) { // Fermeture du formulaire this.Close(); } private void maximiserLaFentreToolStripMenuItem_Click(object sender, EventArgs e) { // Maximise la fentre en cours this.WindowState = FormWindowState.Maximized; } private void restaurerLaFentreToolStripMenuItem_Click(object sender, EventArgs e) { // Restaure la fentre en cours dans son tat normal this.WindowState = FormWindowState.Normal; } private void minimiserLaFentreToolStripMenuItem_Click(object sender, EventArgs e) { // Minimise la fentre en cours this.WindowState = FormWindowState.Minimized ; }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; LEditeur du coach C# se lance, et vous devez voir votre icne dans la zone de notification Page 28 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms en bas droite de votre cran. Si vous faites maintenant un clic-droit sur votre icne, vous devez voir apparatre le menu contextuel, que vous pouvez tester compltement. Magnifique, non ?

Un truc sympathique faire serait de griser les menus contextuels qui sont inutiles en fonction du contexte de la fentre. Par exemple, le menu Maximiser la fentre pourrait tre gris quand la fentre est en tat maximis.

La proprit que nous allons utiliser est Enabled sur chacun des menus contextuel, en indiquant une valeur boolenne true ou false, pour respectivement le rendre actif ou le griser ; O faut-il connecter le code ? Si on regarde le besoin fonctionnel, on a : le menu Maximiser la fentre doit tre gris quand la fentre est en tat maximis ; Bon, on va faire un peu danalyse Lutilisation de la conjonction quand dans lexpression fonctionnelle indique lutilisation dun vnement dclencheur : quand la fentre est en tat maximis (mais depuis quand les analystes-programmeurs doivent connatre la grammaire franaise tout fout le camps, ffff !). Nous allons donc utiliser une fonction de rponse un vnement ( event handler ) ; La conjonction quand dans lexpression fonctionnelle est gnralement suivi de lobjet sur lequel lvnement va porter : quand la fentre est en tat maximis. La fonction de rponse lvnement va donc porter sur la fentre en cours (i.e. sur lobjet Main) ; Lauxiliaire de lexpression fonctionnelle est gnralement ( dans le cas des vnements) suivi du nom francis (au sens large) de lvnement : quand la fentre est en tat maximis. Cest utile lorsquon ne connat pas, priori, le nom de lvnement utiliser. O faut-il connecter le code, donc ? Dans notre cas, nous allons donc chercher sil existe, sur lobjet fentre ( Form ) un vnement comme StateMaximized , ou Maximized , ou encore un autre en relation avec la dimension de la fentre ( Size en anglais), car maximiser une fentre revient en changer la taille ; Et cest l que nous allons Cours de C# Page 29 sur 91

INSIA connecter le code !

2011 Prendre en main les applications winforms

Revenez sur le formulaire Main.cs en mode [Design] en cliquant sur longlet Main.cs [Design] de la zone de travail ; Faites un clic-droit lintrieur de la fentre (en dehors de tout autre contrle, sur la zone grise de la fentre par exemple) et slectionnez le menu Proprits ; Dans la barre doutils de la fentre de Proprits, cliquez le bouton pour afficher la liste des vnements disponibles sur lobjet Main ; Pensez vrifier que vous tes bien sur le bon objet, dont le nom et le type saffiche dans la liste droulante en haut ;

Liste droulante Dans la liste des vnements disponibles, cherchez lvnement qui pourrait correspondre notre besoin ; aidez-vous de laide succincte de chaque vnement qui apparat en bas de la fentre de proprits quand vous faites un simple clic sur un vnement ; Bon, malgr le nombre dvnements disponibles, il ny en a aucun avec State nous allons donc nous rabattre sur SizeChanged Lorsquun vnement est au prtrit (c'est--dire avec ed la fin), alors il est dclench aprs que laction ait eu lieu. Par exemple, SizeChanged est dclench aprs le changement de taille de la fentre, ou encore FormClosed est dclench aprs la fermeture de la fentre. Si lvnement est au prsent progressif (c'est--dire avec ing la fin), lvnement est dclench en tout dbut daction, et il est gnralement possible dinteragir avec cette action. Par exemp le, FormClosing est dclench en dbut de processus de fermeture de la fentre et il est possible dannuler ce processus en laissant la fentre ouverte (ce qui est pratique si vous avez des donnes non sauvegardes ) ; Faites un double-clique sur lvnement SizeChanged dans la fentre de proprits ; Vous venez dajouter la mthode de prise en charge de lvnement Main_SizeChanged au code de lapplication ; Lide de cette mthode est de configurer la proprit Enabled de chacun des menus contextuels vrai (true) ou faux (false), en fonction de ltat de la fentre. Code C#
private void Main_SizeChanged(object sender, EventArgs e) { // Grise les menus en fonction de l'tat de la fentre this.maximiserLaFentreToolStripMenuItem.Enabled =

Dans la mthode Main_SizeChanged, ajoutez le code suivant ;

Cours de C#

Page 30 sur 91

INSIA

2011 Prendre en main les applications winforms


!(this.WindowState == FormWindowState.Maximized);

this.minimiserLaFentreToolStripMenuItem.Enabled = !(this.WindowState == FormWindowState.Minimized); this.restaurerLaFentreToolStripMenuItem.Enabled = !(this.WindowState == FormWindowState.Normal); }

Le code this.WindowState == FormWindowState.Minimized utilise loprateur dgalit == . Pour les types valeurs, l'oprateur d'galit == retourne true si les valeurs des oprandes sont gales et false dans le cas contraire. Pour les types rfrences autres que string, == retourne true si ses deux oprandes font rfrence au mme objet. Pour le type string, == compare les valeurs des chanes. Le code this.WindowState == FormWindowState.Minimized retourne donc true dans le cas o ltat de la fentre est minimis. Mais nous aimerions que le menu contextuel Minimiser la fentre soit gris quand ltat de la fentre est minimis. Nous allons donc utiliser un autre oprateur, celui de ngation logique. L'oprateur de ngation logique ! est un oprateur qui applique une ngation sur loprande. Il est dfini pour un oprande de type boolen et retourne true si, et seulement si, l'oprande est false, et inversement. Le code !(this.WindowState == FormWindowState.Minimized)retourne donc false dans le cas o ltat de la fentre est minimis, et cest justement ce que nous aimerions afin que le menu contextuel Minimiser la fentre soit gris quand ltat de la fentre est minimis. Il nous reste donc assigner la proprit Enabled du contrle correspondant avec cette valeur, en utilisant loprateur dassignation = ; L'oprateur d'assignation = stocke la valeur de l'oprande de droite dans l'emplacement de stockage, la proprit (ou l'indexeur, mais cette notion est pour plus tard dans le coach) stipul par l'oprande de gauche, et retourne la valeur comme rsultat. Les oprandes doivent tre de mme type (ou l'oprande de droite doit tre implicitement convertible au type de l'oprande de gauche). Et voil, la ligne de code :
this.minimiserLaFentreToolStripMenuItem.Enabled = !(this.WindowState == FormWindowState.Minimized);

grise donc le menu contextuel Minimiser la fentre quand la fentre est en tat minimis ! A la diffrence dautres langages du march, en C# loprateur dassignation = est diffrenci de loprateur dgalit ==, ce qui rduit Cours de C# Page 31 sur 91

INSIA

2011 Prendre en main les applications winforms fortement les risques de mauvaise interprtation des expressions. C# propose un large ventail d'oprateurs. Ces derniers sont des symboles qui spcifient les oprations effectuer dans une expression. C# prdfinit les oprateurs arithmtiques et logiques habituels, ainsi que de nombreux autres, comme illustr ladresse suivante : http://msdn2.microsoft.com/fr-fr/library/6a71f45d(VS.80).aspx Reste maintenant griser le menu Restaurez la fentre au lancement de lapplication car la fentre est alors dans un tat normal ; Pour ce faire, nous avons au moins deux moyens : changer la valeur par dfaut de la proprit Enabled du menu contextuel Restaurer la fentre, ou le faire en une ligne de code (bon, on est l pout coder ?) ; Dans le constructeur de Main, ajoutez le code pour griser le menu contextuel :

Code C#
public Main() { InitializeComponent(); // Assignation de l'icone de mainNotifyIcon mainNotifyIcon.Icon = Properties.Resources.lan_connected ; // Griser le menu Restaurer la fentre this.minimiserLaFentreToolStripMenuItem.Enabled = false; }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Testez le tout pour voir comment cela fonctionne bien. Good job guys !

2.3 Positionner les contrles de donnes


Il sagit dans cette exercice de positionner sur le formulaire les diffrents contrles de donnes que nous allons alimenter pour manipuler les donnes. Mais avant de dposer les contrles de donnes, nous allons tout dabord structurer le formulaire laide de tableaux. Si on regarde le document danalyse fonctionnel, on peut (avec de limagination, certes, mais nous sommes des cratifs ) voir une structure de tableaux imbriqus :

Cours de C#

Page 32 sur 91

INSIA

2011 Prendre en main les applications winforms

Premier tableau, en rouge

Deuxime tableau, en violet

Le premier tableau contient une colonne et deux lignes ; la premire ligne de ce tableau contient un deuxime tableau dune seule ligne mais avec trois colonnes. Bref, tout ce beau monde est imbriqu pour structurer linterface utilisateur et proposer un ensemble de cellules desti nes contenir les contrles dinterface (grille, boite de texte, libell, barre de navigation, etc.) Pour structurer linterface, nous allons utiliser le contrle TableLayoutPanel dont lobjectif est de manipuler la disposition des composants et de les organiser automatiquement sous forme de tableau. Pour tout savoir sur le contrle TableLayoutPanel, voici le lien : http://msdn2.microsoft.com/fr-fr/library/3a1tbfwd(VS.80).aspx Droulement de lexercice : 1. Structurez le formulaire sous forme de tableaux : Revenez sur le formulaire Main.cs en mode [Design] (soit en cliquant sur longlet Main.cs [Design] de la zone de travail, soit en doublecliquant sur le fichier Main.cs dans lExplorateur de solutions) ; Dans la boite outils, ouvrez longlet Conteneurs en cliquant sur qui prcde le nom de longlet ;

Cours de C#

Page 33 sur 91

INSIA

2011 Prendre en main les applications winforms Faites un glisser-dplacer du contrle TableLayoutPanel sur le formulaire ; un tableau apparat la surface du formulaire ; SmartTag proposant les actions les plus courantes

Point dancrage pour dplacer le contrle avec la souris.

Affichez la fentre de proprit du contrle que vous venez dinsrer , dont le nom doit tre tableLayoutPanel1 ; Dans la fentre de proprits, configurez la proprit Dock de faon ce que le contrle remplisse toute la surface disponible du formulaire (Fill). Lditeur de proprit affiche une boite de dialogue de slection visuelle des diffrents choix possibles. Cliquez la liste droulante pour afficher les choix. Remplissage de tout lespace disponible. En fait, la mise en forme de base comporte deux fonctions : l'ancrage (Anchor) et le docking (Dock). Par exemple, le contrle TableLayoutPanel a une proprit Anchor qui est un type numr dont les valeurs (qui peuvent tre traites par un ou logique) indiquent de quel(s) bord(s) du contrle parent le contrle TableLayoutPanel gardera une distance constante. Par exemple, en configurant la proprit Anchor AnchorStyles.Bottom, le tableau restera toujours la mme distance du bord infrieur du formulaire, lorsque ce dernier sera redimensionn. Le docking n'est en fait qu'un cas spcial de l'ancrage. La proprit Dock dcrit quel bord du contrle parent un contrle doit se relier. Il y a le docking Haut (Top), Gauche (Left), Droit (Right), Bas (Bottom), ou Plein (Fill). Dans chaque cas, le contrle est dplac aussi prs que possible du bord spcifi et dimensionn de manire remplir ce bord, o il reste lorsque le parent est redimensionn. Le docking est une sorte dancrage avec une distance de zro par rapport au bord. Les deux proprits Anchor et Dock possdent un diteur de proprits visuel.

Dans la fentre de proprits du contrle tableLayoutPanel1, slectionnez la proprit Columns, qui permet de travailler avec la collection de colonnes et de lignes du tableau ; Un bouton saffiche en face de la proprit afin douvrir lditeur de proprit s correspondant ; Page 34 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms Cliquez sur le bouton pour afficher lditeur de proprits ;

Slectionnez la colonne Column2, et cliquez le bouton Supprimer de lditeur de proprits ; Slectionnez la colonne Column1, et indiquez que sa dimension est automatiquement calcule en cliquant le radio-bouton Redimensionner Automatiquement ;

Dans la liste droulante Afficher, slectionnez le choix Lignes ;

Pour la premire ligne, dont le nom est Row1, indiquez une taille de type Absolu et de 35 pixels ;

Pour la deuxime ligne, dont le nom est Row2, indiquez une taille de type Pourcentage et de 100 %, afin doccuper tout lespace restant disponible ;

Cours de C#

Page 35 sur 91

INSIA

2011 Prendre en main les applications winforms

Cliquez maintenant le bouton Ok afin de fermer la boite de dialogue Styles de ligne et de colonne ; Faites un glisser-dplacer dun deuxime contrle TableLayoutPanel lintrieur de la premire ligne du tableau prcdemment ajout ; Affichez la fentre de proprits du contrle que vous venez dinsrer, dont le nom doit tre tableLayoutPanel2 ; Dans la fentre de proprits, configurez la proprit Dock de faon ce que le contrle remplisse toute la surface disponible de la ligne qui le contient (Fill) ; Slectionnez le contrle tableLayoutPanel2 que vous venez dinsrer sur la surface du formulaire, et vous devez remarquer une petite flche en haut droite du contrle ;

Cliquez sur cette flche ; Elle vous propose les tches les plus courantes faire sur ce contrle (cela marche pour la plupart des contrles .Net 2.0);

Slectionnez la tche Modifier les lignes et les colonnes et la boite de dialogue Styles de ligne et de colonne saffiche lcran. Cest exactement la mme que celle de lditeur de proprit Columns que nous venons juste dutiliser ; Dans la liste droulante Afficher, slectionnez Lignes ; Dtruisez la ligne Row2 ; Indiquez un redimensionnement automatique pour le ligne Row1 ;

Cours de C#

Page 36 sur 91

INSIA

2011 Prendre en main les applications winforms

Dans la liste droulante Afficher, slectionnez Colonnes ; Ajoutez une nouvelle colonne an cliquant sur le bouton Ajouter ; Indiquez une taille absolue de 350 pixels pour la colonne Column1 ; Indiquez une taille absolue de 150 pixels pour la colonne Column2 ; Indiquez un redimensionnement automatique pour la colonne Column3 ;

Cliquez maintenant le bouton Ok afin de fermer la boite de dialogue Styles de ligne et de colonne ; Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Testez le tout pour vrifier que tout continue de bien fonctionner. Vous constatez notamment que les contrles de tableau nont aucun impact visuel (bordure, etc.) sur le formulaire (circulez, il ny a rien voir !). Visual C# Express est livr avec de nombreux contrles. La description et lutilisation de chacun dentre eux est sur le lien suivant : http://msdn2.microsoft.com/fr-fr/library/3xdhey7w(VS.80).aspx

Cours de C#

Page 37 sur 91

INSIA

2011 Prendre en main les applications winforms Pour les dveloppeurs qui viendraient de Visual Basic 6.0, de la programmation MFC ou encore de FoxPro, le lient suivant explique les correspondances entre les anciens contrles et les contrles .Net : http://msdn2.microsoft.com/fr-fr/library/0061wezk(VS.80).aspx Pour tout ce qui concerne lutilisation des contrles, de la boite outils ou encore de lajout de contrles ActiveX une application .Net : http://msdn2.microsoft.com/fr-fr/library/3deasc0e(VS.80).aspx Et enfin, un lien pour tout savoir sur la disposition des contrles dans un formulaire Windows, notamment pour viter de passer des heures essayer daligner deux boutons et une boite de texte : http://msdn2.microsoft.com/fr-fr/library/ty26a068(VS.80).aspx

2. Ajoutez les contrles de donnes : Bon, nous avons maintenant une structure de tableau avec 4 cellules. A priori, nous allons donc maintenant ajouter 4 contrles, un par cellule (Cqfd !). En regardant le document danalyse fonctionnelle (comme quoi, cela sert un peu de faire des documents danalyse), linterface utilisateur est compose des contrles suivants : - Une barre de navigation, - Une grille daffichage des donnes, - Une boite de texte daffichage de rsultat, - Un libell ; Barre de navigation Libell

Boite de texte

Grille de donnes

Outre le libell et la boite de texte qui sont des contrles de base de tout bon outil de dveloppement, Visual C# Express propose deux contrles de donnes rpondants nos besoins : le DataGridView et le BindingNavigator. Ce sont ces contrles que nous allons utiliser : - Le contrle DataGridView offre un moyen puissant et flexible pour afficher des donnes sous forme de tableau. Il est possible dtendre le contrle DataGridView afin de gnrer des comportements personnaliss. Par exemple, vous pouvez spcifier par programme vos propres algorithmes de tri, et vous pouvez crer vos propres types de cellules ; Cours de C# Page 38 sur 91

INSIA -

2011 Prendre en main les applications winforms Le contrle BindingNavigator propose une faon standardise pour parcourir et manipuler des donnes sur un formulaire. Cest en fait une barre doutils qui a t complte par les quipes de dveloppement de Microsoft afin de grer automatiquement la navigation dans les donnes ;

Pour tout ce qui concerne lutilisation du contrle DataGridView : http://msdn2.microsoft.com/fr-fr/library/e0ywh3cz(VS.80).aspx Pour tout ce qui concerne lutilisation du contrle BindingNavigator : http://msdn2.microsoft.com/fr-fr/library/ms158105(VS.80).aspx Revenez sur le formulaire Main.cs en mode [Design] (soit en cliquant sur longlet Main.cs [Design] de la zone de travail, soit en doublecliquant sur le fichier Main.cs dans lExplorateur de solutions) ; Dans la boite outils, ouvrez longlet Donnes en cliquant sur qui prcde le nom de longlet ;

Faites un glisser-dplacer du contrle DataGridView sur le formulaire, dans la plus grande cellule du tableau (la dernire) ; une grille (vide bien sr) apparat la surface du formulaire ;

Faites un glisser-dplacer du contrle BindingNavigator sur le formulaire, dans la premire cellule du tableau ; Dans la boite outils, ouvrez longlet Contrles communs en cliquant sur qui prcde le nom de longlet ; Faites un glisser-dplacer du contrle Label sur le formulaire, dans la deuxime cellule du tableau ; Page 39 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms Enfin, faites un glisser-dplacer du contrle TextBox sur le formulaire, dans la troisime cellule du tableau ; Vous obtenez un formulaire comme ci-dessous. Il reste maintenant personnaliser les proprits de chacun des contrles ;

Appuyez sur la touche Shift et maintenez la enfonce ; Avec la souris, faites un clic sur chacun des quatre contrles que vous venez dajouter, tout en maintenant la touche Shift appuye, afin de faire une slection multiple de contrles ; Lchez maintenant la touche Shift ; Affichez la fentre de proprits de la slection, qui vous propose toutes les proprits communes des contrles de votre slection ; Dans la fentre de proprits, configurez la proprit Dock de faon ce que les contrles remplissent toute la surface disponible de la cellule dans lesquels ils sont (Fill) ; Slectionnez maintenant uniquement la grille de donnes dataGrigView1 (dslectionnez lensemble des contrles en cliquant sur la barre de titre du formulaire, par exemple, puis cliquez sur la grille pour la slectionner) ; Dans la fentre de Proprits, configurez le nom du contrle en changeant la proprit (Name) avec mainDataGridView (avec C#, attention la casse des noms !) ; Slectionnez maintenant uniquement la barre doutils de navigation bindingNavigator1 ; Dans la fentre de Proprits, configurez le nom du contrle en changeant la proprit (Name) avec mainBindingNavigator ; Ensuite, slectionnez uniquement le libell label1 ; Dans la fentre de Proprits, configurez le nom de ce contrle en changeant la proprit (Name) avec lblOperation ; Dans la fentre de Proprits, configurez la faon dont le texte va tre positionn dans le libell, en changeant la proprit TextAlign avec MiddleRight (alignement du contenu droite du libell, avec un centrage vertical) ; Utilisez au besoin lditeur de proprits propos en cliquant sur la liste droulante de la proprit ; Page 40 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms Liste droulante

Valeur slectionner

Toujours dans la fentre de Proprits, configurez le texte afficher en changeant la proprit Text avec Total : ; Pour finir, slectionnez uniquement la boite de texte TextBox1 ; Dans la fentre de Proprits, configurez le nom de ce contrle en changeant la proprit (Name) avec txtOperation; Enfin, dans la fentre de Proprits, indiquez que cette boite de texte va tre en lecture uniquement, en changeant la proprit ReadOnly avec True (valeur boolenne Vrai) ; Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Testez le tout pour vrifier que tout fonctionne encore bien.

La fentre suivante apparat :

Aucune donne nest affiche, mais tout fonctionne correctement. Cest super (surtout si vous navez aucun bogue de compilation rsoudre).

2.4 Localiser lapplication


Lobjectif de cet exercice est de rendre disponible linterface utilisateur de lapplication dans une autre langue que le franais, par exemple langlais. Cours de C# Page 41 sur 91

INSIA

2011 Prendre en main les applications winforms Si vous envisagez de distribuer votre application un public international, vous devrez garder l'esprit certaines considrations lors des phases de design et de dveloppement. Et, mme si vous ne pensez pas immdiatement distribuer votre application un public international, de simples prparatifs pourront vous faciliter considrablement la tche dans l'ventualit o les versions ultrieures de votre application aient des objectifs diffrents. La localisation est le processus de personnalisation de votre application pour une culture ou des paramtres rgionaux donns. La localisation consiste principalement traduire l'interface utilisateur. La globalisation est le processus de conception et de dveloppement d'un produit logiciel adapt plusieurs cultures. Pour tout savoir sur la localisation et la globalisation : http://msdn2.microsoft.com/fr-fr/library/1021kkz0(VS.80).aspx Cest quoi une ressource ? Lorsque vous localisez une application, lensemble des donnes localises, comme des chanes et des images qui sont adaptes chaque culture, sont stockes avec Visual C# Express dans des fichiers spars dextension .resx ; Ces diffrentes donnes qui vont tre charges au moment de lexcution en fonction de la culture sont appeles les ressources de lapplication. Dans Visual Studio, les ressources localises (des donnes comme des chanes et des images qui sont adaptes chaque culture) sont stockes dans des fichiers spars et charges en fonction de la configuration de la culture de l'interface utilisateur. Pour comprendre comment les ressources sont charges, imaginez qu'elles sont organises sous la forme d'une hirarchie. - En haut de la hirarchie se trouvent les ressources par dfaut, c'est--dire celles correspondant la langue de dveloppement de lapplication. Dans notre cas, il sagit du franais. Ce sont les seules ressources qui n'ont pas leur propre fichier. Au moment de la compilation, elles sont stockes dans lassemblage principal de lapplication (par exemple nom.exe) ; - Sous ces ressources par dfaut se trouvent les ressources des cultures neutres. Une culture neutre est associe une langue, mais pas une rgion. Par exemple, Franais ( fr ) ou langlais ( en ) sont des cultures neutres. Lors de la compilation, elles sont stockes dans un assemblage satellite lui-mme stock dans un sous rpertoire ayant un nom rfrenant la culture neutre (par exemple fr) ; - En dessous de ces ressources de cultures neutres se trouvent les ressources des cultures spcifiques. Une culture spcifique est associe une langue et une rgion. Par exemple, Franais

Cours de C#

Page 42 sur 91

INSIA

2011 Prendre en main les applications winforms (Canada) ("fr-CA") est une culture spcifique. Lors de la compilation, elles sont stockes dans un assemblage satellite luimme stocke dans un sous rpertoire ayant un nom rfrenant la culture spcifique (par exemple fr-CH) ;

Si une application essaie de charger une ressource localise, telle qu'une chane, et ne la trouve pas, elle remontera dans la hirarchie jusqu' ce qu'elle trouve un fichier de ressources contenant la ressource demande. Droulement de lexercice : 1. Configurez la localisation de votre formulaire : Revenez sur le formulaire Main.cs en mode [Design] (soit en cliquant sur longlet Main.cs [Design] de la zone de travail, soit en doublecliquant sur le fichier Main.cs dans lExplorateur de solutions) ; Dans la fentre de Proprits du formulaire Main, indiquez que ce dernier supporte la localisation en configurant la proprit Localizable True (Vrai) ;

Dans la barre doutils de Visual C# Express, cliquez le bouton sauvegarder les modifications ralises ;

pour

2. Localisez votre application en anglais : Revenez sur le formulaire Main.cs en mode [Design] (soit en cliquant sur longlet Main.cs [Design] de la zone de travail, soit en doublecliquant sur le fichier Main.cs dans lExplorateur de solutions) ; Dans la fentre de Proprits du formulaire Main, indiquez que ce dernier est maintenant affich par le designer Visual C# Express en localisation Anglais (Etats-Unis), en configurant la proprit Language Anglais (Etats-Unis) ;

Cours de C#

Page 43 sur 91

INSIA

2011 Prendre en main les applications winforms Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Affichez maintenant lExplorateur de solutions ; Un nouveau fichier Main.en-US.resx a t ajout la solution, en dpendance de Main.cs ; Ce fichier contient les ressources de lapplication pour la nouvelle langue ajoute ;

Revenez sur le formulaire Main.cs en mode [Design] ; Pour chacun des contrles (formulaire, libell, menus, etc.), changez la proprit Text par un contenu en Anglais ; Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Lapplication fonctionne (normalement) mais est toujours en franais ! Cest normal, votre poste tant configur avec un systme dexploitation franais, la culture qui est lu est donc celle par dfaut.

3. Dfinissez la culture de linterface utilisateur : Affichez le code du formulaire Main.cs, en faisant un clic-droit sur Main.cs dans lExplorateur de solutions, et en slectionnant le menu Afficher le code ; Dans le constructeur de la fentre Main.cs, ajoutez le code pour changer la culture du processus excutant lapplication ; Code C#
public Main() { // Configure la culture Anglais (Etats-Unis) System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); // Configure la culture de l'interface Anglais (Etats-Unis) System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); InitializeComponent(); // Assignation de l'icone de mainNotifyIcon mainNotifyIcon.Icon = Properties.Resources.lan_connected ; // Griser le menu Restaurer la fentre this.minimiserLaFentreToolStripMenuItem.Enabled = false; }

la culture dexcution avant lappel InitializeComponent() ; en effet, cette mthode va configurer les diffrents contrles du formulaire, dont leurs proprits Text, et donc elle va charger les ressources dont elle a besoin ; si la culture du processus Cours de C# Page 44 sur 91

Pensez

configurer

INSIA

2011 Prendre en main les applications winforms est configure aprs lappel de cette mthode, ce sera trop tard car les fichiers de ressources auront dj t lus Cest quoi CultureInfo ? La classe CultureInfo rend des informations spcifiques une culture, par exemple la langue, la sous-langue, le pays et/ou la rgion ou le calendrier associs la culture, ainsi que les conventions applicables cette dernire. Elle spcifie un nom unique pour chaque culture, bas sur la norme RFC 3066 pour Windows Vista et les versions ultrieures, et sur la norme RFC 1766 pour les systmes d'exploitation antrieurs Windows Vista. Le nom est une combinaison d'un code de culture deux lettres minuscules ISO 639 associ une langue et d'un code de sousculture deux lettres majuscules ISO 3166 associ un pays ou une rgion. Le format du nom de culture est <languagecode2><country/regioncode2>, o <languagecode2> est le code de langue et <country/regioncode2> est le code de sous-culture. Pour tout savoir sur la classe CultureInfo, notamment les codes de chacune des cultures disponibles : http://msdn2.microsoft.com/fr-fr/library/kx54z3k7(VS.80).aspx Quelle est la diffrence entre
CurrentThread.CurrentCulture

et

CurrentThread.CurrentUICulture ?

CurrentCulture obtient ou dfinit la culture du thread en cours, c'est--dire la faon dont lapplication va traiter en interne le format des nombres, des dates ou de chaines de caractres par exemple ; - CurrentUICulture obtient ou dfinit la culture actuelle utilise par le gestionnaire de ressources pour rechercher des ressources spcifiques la culture au moment de l'excution ; Cest pour cette raison quil faut changer les deux proprits dans l e code. Pour tout savoir sur la classe Thread, qui fournit plein de renseignements sur le processus en cours notamment au travers de la proprit Thread.CurrentThread : http://msdn2.microsoft.com/fr-fr/library/h158zycw(VS.80).aspx Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Lapplication fonctionne maintenant en anglais ; Allez voir dans le rpertoire de compilation de lapplication (par exemple C:\Coach C#\Atelier 02\Code\Coach.Editeur\Coach.Editeur\bin\Debug), et vous verrez que le compilateur a gnr automatiquement un sous rpertoire contenant lassemblage satellite des ressources en anglais. Lors de la distribution de lapplication, il faudra penser distribuer lassemblage principal, mais aussi tous ses assemblages satellites de Cours de C# Page 45 sur 91 Assemblage satellite de localisation

INSIA localisation.

2011 Prendre en main les applications winforms

Sous rpertoire de culture contenant la localisation pour une culture donne

Pour tout savoir sur la classe la gestion des ressources dans les application Windows : http://msdn2.microsoft.com/fr-fr/library/f45fce5x(VS.80).aspx Pour les traducteurs qui localisent les applications, il existe un outil spcifique dans le SDK de .Net 2.0 : Winres.exe. Winres.exe est une application graphique qui recre une version en mode WYSIWYG d'un formulaire Windows simplement partir du fichier de ressources, sans devoir accder au code source. Winres.exe hberge le concepteur de formulaires Windows et sa fentre Proprits. Ces fonctionnalits permettent une modification visuelle d'un fichier .resources ou .resx contenant un formulaire Windows Forms. Pour tout savoir sur Winres.exe : http://msdn2.microsoft.com/fr-fr/library/8bxdx003(VS.80).aspx Pour tlcharger le SDK .Net 2.0 : http://www.microsoft.com/downloads/details.aspx?FamilyID=fe6f2099b7b4-4f47-a244-c96d69c35dec&displaylang=fr Les dveloppeurs utilisent gnralement aussi des ressources directement codes en dur dans le code, comme par exemple les chaines de caractres de messages. La cration et l'utilisation de fichiers de ressources pour ces chanes de caractres est une tche plutt dlicate, si elle est ralise la fin de la programmation car elle ncessite une relecture complte du code. Il existe un outil, le Resource Refactoring Tool, qui peut aider rsoudre ce problme. Pour tlcharger le le Resource Refactoring Tool,: http://visualstudiogallery.msdn.microsoft.com/39ae29d3-81e1-43d49c48-fc9644869d84 4. Configurez de nouveau la culture de linterface utilisateur en franais : Cours de C# Page 46 sur 91

INSIA Code C#
public { // // // // // // Main()

2011 Prendre en main les applications winforms Affichez le code du formulaire Main.cs, en faisant un clic-droit sur Main.cs dans lExplorateur de solutions, et en slectionnant le menu Afficher le code ; Dans le constructeur de la fentre Main.cs, mettez en commentaire le code pour changer la culture du processus excutant lapplication ;

Configure la culture Anglais (Etats-Unis) System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("fr-FR"); Configure la culture de l'interface Anglais (Etats-Unis) System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");

InitializeComponent(); // Assignation de l'icone de mainNotifyIcon mainNotifyIcon.Icon = Properties.Resources.lan_connected ; // Griser le menu Restaurer la fentre this.minimiserLaFentreToolStripMenuItem.Enabled = false; }

Revenez sur le formulaire Main.cs en mode [Design] (soit en cliquant sur longlet Main.cs [Design] de la zone de travail, soit en doublecliquant sur le fichier Main.cs dans lExplorateur de solutions) ; Dans la fentre de Proprits du formulaire Main, indiquez que ce dernier est maintenant affich par le designer Visual C# Express en localisation par dfaut, en configurant la proprit Language (Par dfaut) ; Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Lapplication fonctionne maintenant en franais, qui est notre langue par dfaut ;

Flicitations, vous venez de passer une premire tape importante du Coach C# (nous venons de finaliser lessentiel de linterface utilisateur que nous allons utiliser tout au long des diffrents ateliers), et il nous reste maintenant alimenter cet cran avec des donnes.

Cours de C#

Page 47 sur 91

INSIA

2011 Prendre en main les applications winforms

3 Alimenter la grille avec le contenu dun fichier CSV


Dans cet exercice, vous allez apprendre : Lire un fichier au format CSV (Texte dlimit) ; Utiliser les principales boucles du langage C# ; Alimenter les contrles de donnes avec les informations lues ;

Objectif Lobjectif de cet exercice est de manipuler des donnes au format CSV, tout en abordant la structuration dun programme et les ordres de boucles et de tests du langage C#. Contexte fonctionnel Nous allons implmenter un accs aux donnes lancienne, c'est--dire que nous allons utiliser des donnes stockes au format CSV, en les transformant (pour faciliter lalimentation de la grille de donnes) en un objet table en mmoire. Bon, cest pas exactement ce quil faudrait faire de nos jours (cest beaucoup de lignes de code pour pas grand chose), mais cela va nous aider dans notre dmarche progressive de dcouverte de C# Le fichier de donnes que nous allons utiliser est le fichier Clients.coach situ dans les fichiers utiles de lexercice Il est possible de louvrir avec le bloc-notes de Windows, car cest juste un fichier au format texte. Le principe implmenter est le suivant

Lets go, folks ! Le Framework .Net propose en standard de nombreuses classes utiliser dans vos dveloppements. Ces classes sont regroupes en espaces de nommage (Namespace, cf. ci-dessous). Nous allons donc crer un objet de type DataTable, qui reprsente une table de donnes, se trouvant dans lespace de nommage System.Data. Cest quoi un espace de nommage (Namespace) ? Les espaces de nommages aident organiser logiquement et clairement les types et autres membres fournis par le Framework .Net (notamment), ou par tout autre application et/ou assemblage .Net, et ce indpendamment du nom de lassemblage .net fournissant ces types ou ces membres. Cependant, souvent les noms des assemblages du Framework .Net rfrent lespace de nommage principalement enrichie Cours de C# Page 48 sur 91

INSIA

2011 Prendre en main les applications winforms par lassemblage : par exemple system.xml.dll enrichie principalement lespace de nom System.Xml (manipulation de donnes XML), mais pas seulement. Lespace de nommage System.Data contient tous les types requis pour manipuler des donnes ; De la mme manire, System.Configuration contient tous les types pour grer la configuration dune application. Nous reviendrons durant le troisime atelier sur lorganisation des espaces de nommages. Cest quoi une DataTable ? Une DataTable reprsente une table de donnes en mmoire. Cest exactement ce que lon souhaite faire ! (le hasard fait bien les choses). La structure globale dune DataTable est la suivante :

La proprit Columns rfre la collection des colonnes qui appartiennent la table ; les objets de cette collection sont de type DataColumn ; La proprit Rows rfre la collection des lignes qui appartiennent cette table ; les objets de cette collection sont de type DataRow ;

Autrement dit, nous allons dfinir la structure de la table en mmoire en utilisant la collection Columns, puis nous manipulerons les donnes laide de la collection Rows. Pour tout savoir sur lespace de nom System.Data : http://msdn2.microsoft.com/fr-fr/library/ax3wd0k9(VS.80).aspx Pour tout savoir sur des DataTable : http://msdn2.microsoft.com/fr-fr/library/9186hy08(VS.80).aspx

3.1 Crer et utiliser la table en mmoire


Dans ce premier exercice, vous allez dvelopper le code pour crer une table vide en mmoire, et connecter cette table vide aux contrles de donnes prsents sur le formulaire. La structure de la table crer, dont le nom va tre Coach, est compose de douze champs dont la description est la suivante : Nom Id Cours de C# Description Code dindentification du client Type string Page 49 sur 91

INSIA Entreprise Contact Titre Adresse Ville Region CodePostal Pays Telephone Telecopie CA

2011 Prendre en main les applications winforms Raison sociale de lentreprise Nom du contact principal du client Fonction du contact principal du client Adresse de lentreprise Ville de rsidence de lentreprise Rgion de rsidence de lentreprise Code postal du bureau postal distributeur Pays de rsidence de lentreprise Numro de tlphone du standard de lentreprise Numro de la tlcopie principale de lentreprise Chiffre daffaire arrondi, en millier deuros, que vous ralisez avec cette entreprise string string string string string string string string string string int

Bon, pour les puristes de la troisime forme normale, c e nest pas trs intgre, mais cela devrait suffire pour notre besoin. Pour ceux qui souhaite comprendre la troisime forme normale : http://msdn2.microsoft.com/fr-fr/library/aa200276(office.11).aspx Droulement de lexercice : 1. Crez une fonction de cration dune table vide : Affichez le code du formulaire Main.cs, en faisant un clic-droit sur Main.cs dans lExplorateur de solutions, et en slectionnant le menu Afficher le code ; Positionnez le curseur juste aprs laccolade } fermante du constructeur de la classe Main ; Ajoutez deux lignes vides en tapant sur la touche Entre ; Crez une fonction CreerTable en ajoutant le code suivant : Code C#
private DataTable CreerTable() { }

Cest quoi une fonction ? Une fonction encapsule une squence de code dfinissant un comportement de la classe, et en retournant une valeur/rfrence de retour.

Cette fonction CreerTable renvoie une valeur de type DataTable, et est indique prive (private) car elle ne sera utilise que dans le cadre de la classe Main ; lobjectif de cette fonction est donc de crer une nouvelle table et den retourner la rfrence. Une bonne pratique pour viter les bogues est de systmatiquement sauvegarder votre travail et de lancer une compilation chaque fois que vous travaillez sur la structure dune classe, ou encore, chaque fois que Cours de C# Page 50 sur 91

INSIA

2011 Prendre en main les applications winforms vous ajoutez un bloc de code dans le contenu dun membre de classe ! Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Une erreur de compilation est affiche dans la Liste derreurs ; Mot soulign en erreur

Message de lerreur, en positionnant le curseur sur lerreur

Erreur dans la liste des erreurs


Si la fentre Liste derreurs ne saffiche pas, slectionnez le menu de Visual C# Express Affichage > Liste derreurs ; Pour compiler lapplication, il est aussi possible de slectionner le menu de Visual C# Express Gnrer > Gnrer la solution ; Pour compiler lapplication, il est encore possible de faire un clic-droit sur le projet Coach.Editeur dans lExplorateur de solutions et de slectionner le menu Gnrer ;

Pour localiser une erreur dans le code, cest simple : cest le(s) mot(s) qui apparat(ssent) en soulign Pour aller sur la ligne de code ayant gnr une erreur dans la Liste derreurs, cest simple : faites un double-clique sur lerreur de la liste ... Elle vient do cette erreur ? En fait le compilateur analyse chacun des membres de la classe et va marquer toutes les fonctions qui ne retournent aucune valeur assigne, voire qui ne retourne rien du tout ! Cela vite davoir des bouts de code pour lesquels le dveloppeur oubli dindiquer la valeur de retour. Le compilateur va dailleurs aussi marquer les codes qui ne seront jamais excut (si, si cela arrive souvent dailleurs) en analysant les chemins possibles pour parcourir le code lexcution.

Cours de C#

Page 51 sur 91

INSIA

2011 Prendre en main les applications winforms Dans notre cas, pour corriger lerreur il faut donc ajouter le code de renvoi de la fonction. Une rgle de bonne programmation est de systmatiquement ajouter le code de renvoi de fonction avec la cration de la fonction. Pour ma part, jutilise toujours une variable nomme result. Ajoutez la fonction CreerTable les lignes de cration dune nouvelle table de nom Coach, et de retour de cette nouvelle table ;

Code C#
private DataTable CreerTable() { // Cration d'une table vide avec le nom Coach DataTable result = new DataTable("Coach"); // retour de la valeur return result; }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout se compile correctement maintenant. Nous allons maintenant crer une colonne pour chacune des colonnes ajouter la table en prcisant le type, et lajouter la liste des colonnes de la table. Le type que nous allons utiliser pour crer la colonne est DataColumn ;

Ajoutez la fonction CreerTable les lignes de cration dune nouvelle colonne, juste avant la directive return ;

Code C#
private DataTable CreerTable() { // Cration de la colonne ID DataColumn idColumn = new DataColumn(); }

Code C#

Dfinissez maintenant le nom et le type de cette colonne, en ajoutant les lignes suivantes juste aprs la cration de la colonne ;

private DataTable CreerTable() { // Cration de la colonne ID DataColumn idColumn = new DataColumn(); idColumn.ColumnName = "Id";

Cours de C#

Page 52 sur 91

INSIA

2011 Prendre en main les applications winforms

idColumn.DataType = typeof(string); }

Pensez utiliser lIntelliSense pour aller plus vite dans le codage.

Cest quoi typeof ? Loprateur typeof est utilis pour obtenir lobjet correspondant un type. En fait, la proprit DataType doit rfrencer une instance de quelque chose qui dfinisse le type, mais pas le type en lui-mme qui nest pas une instance, mais juste le type de linstance. Cest pour cela quen passant par typeof(string), on obtient directement lobjet correspondant au type string. Cqfd - bon, souvenez vous que si vous avez un type indiquer en paramtre dune fonction, utiliser loprateur typeof Pour tout savoir sur loprateur typeof : http://msdn2.microsoft.com/fr-fr/library/58918ffs(VS.80).aspx Pour tout savoir sur les autres oprateurs par mot cl de C# : http://msdn2.microsoft.com/fr-fr/library/bewds7kc(VS.80).aspx Code C#
private DataTable CreerTable() { // Cration de la colonne ID DataColumn idColumn = new DataColumn(); idColumn.ColumnName = "Id"; idColumn.DataType = typeof(string); result.Columns.Add(idColumn); }

Ajoutez maintenant la colonne nouvellement cre idColumn la liste des colonnes de la table result, en ajoutant les lignes suivantes ;

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout se compile correctement. Bon, on a du taper quatre lignes de code et une ligne de commentaire juste pour crer une colonne, ainsi que crer une variable par rfrence qui nest utilise que pour faire un ajout la liste. Avec C#, il est possible de crer une nouvelle instance dobjet en utilisant loprateur new tout endroit o le code attend une instance. Cest dailleurs pour cette raison que les types dobjets proposent gnralement diffrents constructeurs afin de faciliter la construction des instances. Ainsi nos quatre lignes peuvent tre remplaces par une seule (ce que je prfre dailleurs).

Cours de C#

Page 53 sur 91

INSIA

2011 Prendre en main les applications winforms Dans la fonction CreerTable, remplacez les quatre lignes de cration de la colonne idColumn par la ligne suivante ;

Code C#
private DataTable CreerTable() { // Cration de la colonne ID DataColumn idColumn = new DataColumn(); idColumn.ColumnName = "Id"; idColumn.DataType = typeof(string); result.Columns.Add(idColumn); result.Columns.Add(new DataColumn("Id", typeof(string))); }

Code C#

Dans la fonction CreerTable, ajoutez maintenant le code de cration des onze autres colonnes ;

private DataTable CreerTable() { // Cration de la colonne ID result.Columns.Add(new DataColumn("Id", typeof(string))); result.Columns.Add(new DataColumn("Entreprise", typeof(string))); result.Columns.Add(new DataColumn("Contact", typeof(string))); result.Columns.Add(new DataColumn("Titre", typeof(string))); result.Columns.Add(new DataColumn("Adresse", typeof(string))); result.Columns.Add(new DataColumn("Ville", typeof(string))); result.Columns.Add(new DataColumn("Region", typeof(string))); result.Columns.Add(new DataColumn("CodePostal", typeof(string))); result.Columns.Add(new DataColumn("Pays", typeof(string))); result.Columns.Add(new DataColumn("Telephone", typeof(string))); result.Columns.Add(new DataColumn("Telecopie", typeof(string))); result.Columns.Add(new DataColumn("CA", typeof(int))); }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement.

2. Liez la table aux contrles de donnes : Lide est de lier la table nouvellement cre aux diffrents contrles de donnes du formulaire lorsque lutilisateur va cliquer sur le menu Fichier > Nouveau de lEditeur du Coach C# ; La liaison des donnes aux contrles est ce que lon appelle le DataBinding .

Cours de C#

Page 54 sur 91

INSIA

2011 Prendre en main les applications winforms Cest quoi le DataBinding ? Le DataBinding est le mcanisme par lequel la valeur (donne - data ) dune proprit dun contrle est automatiquement maintenue jour (lie binding ) la valeur dune proprit dun objet fournissan t des donnes ( datasource ). Loriginalit du DataBinding est que nimporte quel objet peut fournir une ou des donnes, et il est donc par exemple possible, avec le DataBinding, de lier automatiquement la valeur de la proprit Text ou Tag dun bouton avec la proprit Text dune boite de texte (TextBox). Comment a marche, le DataBinding ? Le fonctionnement du DataBinding peut tre schmatis comme suit :

Un objet intervient comme un gestionnaire de liaison, et il va automatiquement reflter et maintenir jour les valeurs des proprits qui sont pralablement dfinies comme tant en liaison. Dans notre cas, nous allons utiliser un objet BindingSource pour accder au gestionnaire de liaisons et grer la source de toutes les liaisons (Bindings) dont nous allons avoir besoin. Vous trouverez sur ce lien une vido dintroduction au DataBinding : http://www.microsoft.com/france/vision/WebcastMsdn.aspx?EID=7972b8bd5208-461e-ac3e-949acff98d74 Et sur ce lien une vido danthologie ne pas manquer sur le DataBinding : http://www.microsoft.com/france/vision/WebcastMsdn.aspx?EID=5c92551b6cee-49e2-89c3-1604d1511882 Si vous dveloppez des applications qui manipulent des donnes, vous devez absolument comprendre et utiliser le DataBinding (cest plus rapide avec beaucoup moins de lignes de code), en lieu et place des mcanismes que nous utilisions tous auparavant, essentiellement bass sur le dveloppement spcifique de code de liaison pour chacun des contrles. Revenez sur le formulaire Main.cs en mode [Design] (soit en cliquant sur longlet Main.cs [Design] de la zone de travail, soit en doublecliquant sur le fichier Main.cs dans lExplorateur de solutions) ; Page 55 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms Dans la boite outils, ouvrez longlet Donnes, sil est ferm, en cliquant sur qui prcde le nom de longlet ; Faites un glisser-dplacer du contrle BindingSource sur la zone de dpt de contrles du formulaire. Un contrle bindingSource1 apparat dans cette zone de dpt ; Slectionnez le contrle de source de donnes bindingSource1 ; Dans la fentre de Proprits, configurez le nom de ce contrle en changeant la proprit (Name) avec mainBindingSource ;

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement. Dans la fentre Main.cs en mode [Design], faites un double-clique sur le menu Fichier > Nouveau ;

Une mthode nouveauToolStripMenuItem_Click de rponse au menu Nouveau a t ajoute au code du formulaire Main.cs ; Dans la mthode nouveauToolStripMenuItem _Click, ajoutez le code configurant la source de donnes (DataSource) des liaisons (mainBindingSource) avec une nouvelle table ;

Code C#
private void nouveauToolStripMenuItem_Click(object sender, EventArgs e) { // Charge une table vide dans la source des bindings mainBindingSource.DataSource = CreerTable(); }

Dans la mthode nouveauToolStripMenuItem _Click, ajoutez le code indiquant que le barre de navigation (mainBindingNavigator) navigue (logique !) dans la source de liaisons tout juste dfinie ;

Code C# Cours de C# Page 56 sur 91

INSIA

2011 Prendre en main les applications winforms

private void nouveauToolStripMenuItem_Click(object sender, EventArgs e) { // Charge une table vide dans la source des bindings mainBindingSource.DataSource = CreerTable(); // Configure la navigation mainBindingNavigator.BindingSource = mainBindingSource; }

Enfin, dans la mthode nouveauToolStripMenuItem _Click, ajoutez le code liant la grille de donnes (mainDataGridView) avec la source de donnes de la source des liaisons (BindingSource) dans laquelle navigue la barre de navigation (mainBindingNavigator) ;

Code C#
private void nouveauToolStripMenuItem_Click(object sender, EventArgs e) { // Charge une table vide dans la source des bindings mainBindingSource.DataSource = CreerTable(); // Configure la navigation mainBindingNavigator.BindingSource = mainBindingSource; // Configure la grille de donnes sur la mme source que la source de // navigation mainDataGridView.DataSource = mainBindingNavigator.BindingSource; }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement. Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Dans lEditeur du Coach C#, cliquez le menu Fichier > Nouveau ; Une nouvelle ligne de donne apparat dans le formulaire ; A laide des boutons de la barre de navigation, ajoutez ( ) et dtruisez ( ) quelques lignes de donnes ; Amusez-vous saisir des informations : la grille fonctionne ! Franchement, vous tes des As.

Pour tout savoir sur lobjet BindingSource : http://msdn2.microsoft.com/fr-fr/library/h974h4y2(VS.80).aspx Pour tout savoir sur lobjet BindingNavigator : http://msdn2.microsoft.com/fr-fr/library/b9y7cz6d(VS.80).aspx Cours de C# Page 57 sur 91

INSIA

2011 Prendre en main les applications winforms Pour tout savoir sur lobjet DataGridView : http://msdn2.microsoft.com/fr-fr/library/e0ywh3cz(VS.80).aspx

3.2 Alimenter la table en mmoire avec le fichier CSV


Lobjectif de ce deuxime exercice est de lire les donnes de la grille partir dun fichier au format CSV (texte dlimit), et bien sur de sauvegarder de nouveau ces donnes, aprs modification, dans le mme fichier CSV (ou un autre dailleurs) ! Il va nous donner lopportunit daborder certains mots cls de test, de boucle et de bloc. Droulement de lexercice : 1. Dveloppez le code de lecture du fichier CSV : Un fichier CSV est compos de lignes de valeurs, spares par un sparateur qui dans notre cas est le ; , et dont lordre des valeurs est toujours le mme dune ligne lautre. Chaque ligne est finie par un retour-chariot (CR). Lalgorithme dvelopper est compos de deux tapes : 1. Lire le fichier CSV ligne a ligne ; 2. A partir de la ligne de texte lue, gnrer un enregistrement dans la table de donnes ; Dans la ligne lue, chacune des valeurs lire est spare par un ; ; le premier paramtre est lID, le deuxime lEntreprise, etc. jusquau douzime qui est le Chiffre daffaire ralis ; Afin de gnrer un nouvel enregistrement vide, nous allons utiliser la mthode NewRow() de notre table de donnes. Cette mthode est fournie par la classe DataTable, qui est le type de notre objet de table de donnes en mmoire. Une bonne pratique de dveloppement est de crer une mthode ou fonction par tape dalgorithme, et ce afin daugmenter la maintenabilit et la lisibilit du code. Autrement dit, nous allons dvelopper deux mthodes : une pour lire le fichier ligne ligne, et une pour ajouter notre table de donnes une nouvelle ligne. Cest par cette dernire que nous allons commencer ! Code C#
private void AjouteLigneATable(string LigneLue, DataTable TableDeDonnees)

Affichez le code du formulaire Main.cs, en faisant un clic-droit sur Main.cs dans lExplorateur de solutions, et en slectionnant le menu Afficher le code ; Positionner le curseur juste aprs laccolade } fermante du constructeur de la classe Main ; Ajoutez deux lignes vides en tapant sur la touche Entre ; Crez une fonction AjouterLigneATable en ajoutant le code suivant :

Cours de C#

Page 58 sur 91

INSIA
{ }

2011 Prendre en main les applications winforms

Cest quoi void ? void indique au compilateur que la mthode est une fonction qui ne retourne aucune valeur. Cest quoi (string LigneLue, DataTable TableDeDonnees)? En fait, une fonction peut avoir zro ou plusieurs paramtres, qui indique(nt) gnralement la fonction le contexte dexcution de celle -ci. Par exemple, le premier paramtre string LigneLue est la ligne qui a t lue dans le fichier CSV, alors que le deuxime DataTable TableDeDonnees est la table de donnes dans laquelle ajouter un nouvel enregistrement. Le type prcde le nom du paramtre.
LigneLue et TableDeDonnees - LigneLue correspond

: ligne de donne au format texte dlimit avec un ; quil faut couper pour ajouter une nouvelle ligne de donnes ; TableDeDonnees est la table de donnes sur laquelle il faut ajouter une nouvelle ligne ;

Passage par valeur ou passage par rfrence ? En C#, les paramtres sont passs par dfaut par valeur, c'est--dire que la valeur est copie sur la pile et que tous les changements de cette valeur sont dtruits lorsque la mthode est quitte. Nanmoins, C# utilise communment deux types : les types par valeur et les types par rfrence (cf. page 26). Dans le cas de passage de paramtre dun type par valeur (par exemple int ou double), le paramtre est donc copi et les changements raliss sur la valeur de ces paramtres sont dtruits lors du retour de fonction. Un paramtre ayant un type par rfrence (tout objet) est aussi pass par valeur, mais dans ce cas cest une copie de la rfrence (qui reprsente la localisation de lobjet en mmoire) qui est ajoute la pile. La mthode utilise donc un alias sur lobjet, qui va tre utilis pour modifier cet objet (cest un peu comme si, lors de lappel de la fonction, on ajoutait sur une pice une deuxime porte daccs) . Quand la fonction va se terminer, la rfrence utilise par la fonction va tre dtruite (la deuxime porte est dtruite) mais les modifications apports lobjet seront gardes (en gros, les meubles que vous aurez ajout en passant par la porte juste dtruite restent dans la pice). Cest pour cela que le paramtre DataTable TableDeDonnees est pass par valeur, mais tous les ajouts denregistrements qui seront fait dans la fonction AjouteLigneATable seront prservs lors de la fin de cette fonction. Pour tout savoir sur le passage de paramtres : http://msdn2.microsoft.com/fr-fr/library/0f66670z(VS.80).aspx

Cours de C#

Page 59 sur 91

INSIA

2011 Prendre en main les applications winforms Ajoutez la fonction AjouterLigneATable la ligne de cration de lindexe que nous utiliserons pour indiquer la valeur lue dans la ligne (Id, Entreprise, etc.) ;

Code C#
private void AjouterLigneATable(string LigneLue, DataTable TableDeDonnees) { // Definition de l'index de la position de lecture int index = 0; }

Ajoutez la fonction AjouterLigneATable le code pour dcouper la ligne de texte lue en un tableau de chaines de caractres, en fonction du sparateur ; ; La mthode utiliser est fournie par la classe string qui est le type de la variable LigneLue ;

Code C#
private void AjouterLigneATable(string LigneLue, DataTable TableDeDonnees) { // Definition de l'index de la position de lecture int index = 0; // Dcouper la ligne en fonction du caractre de sparation string[] valeursLues = LigneLue.Split(new char[] { ';' }); }

Ajoutez la fonction AjouterLigneATable le code pour gnrer une nouvelle ligne de donnes vide ; La mthode utiliser est fournie par la classe DataTable qui est le type de la variable TableDeDonnees ;

Code C#
private void AjouterLigneATable(string LigneLue, DataTable TableDeDonnees) { // Definition de l'index de la position de lecture int index = 0; // Dcouper la ligne en fonction du caractre de sparation string[] valeursLues = LigneLue.Split(new char[] { ';' }); // Cre une nouvelle ligne de donnes DataRow ligneDeDonnees = TableDeDonnees.NewRow(); }

Ajoutez la fonction AjouterLigneATable le code pour balayer lensemble des valeurs contenues dans le tableau valeursLues (Pensez utiliser un extrait de code pour le faire) ;

Code C#
private void AjouterLigneATable(string LigneLue, DataTable TableDeDonnees) { // Definition de l'index de la position de lecture int index = 0; // Dcouper la ligne en fonction du caractre de sparation string[] valeursLues = LigneLue.Split(new char[] { ';' }); // Cre une nouvelle ligne de donnes DataRow ligneDeDonnees = TableDeDonnees.NewRow(); // Pour toute les valeurs, met jour le ligne de donnes

Cours de C#

Page 60 sur 91

INSIA

2011 Prendre en main les applications winforms

foreach (string valeur in valeursLues) { } }

Au fait, comment utiliser les extraits de code ? Bon, on la dj vu, mais on va se rpter ! 1. La premire solution est de faire un clic-droit lendroit o vous voulez insrer un extrait de code, et slectionnez le menu Insrer un extrait ;

Dans notre cas, slectionnez ensuite lextrait Collections and arrays > Iterate through a collection ;

Il vous reste ensuite paramtrer lextrait et ajouter le commentaire ; 2. La deuxime solution est de taper foreach dans le code ; Lditeur de Visual C# Express vous propose lIntelliSense, en prslectionnant foreach ;

Tapez alors deux fois sur la touche TAB (tabulation) ; Cest quoi foreach ? foreach est une instruction utiliser pour itrer automatiquement tous les lments dune collection ou dun tableau. Pour tout savoir sur foreach : http://msdn2.microsoft.com/fr-fr/library/ttw7t8t6(VS.80).aspx Cours de C# Ajoutez la fonction AjouterLigneATable le code de mise jour de la colonne de la ligne ajouter, en fonction de la valeur lue ; Page 61 sur 91

INSIA Code C#

2011 Prendre en main les applications winforms

private void AjouterLigneATable(string LigneLue, DataTable TableDeDonnees) { // Pour toute les valeurs, met jour le ligne de donnes foreach (string valeur in valeursLues) { switch (index++) { case 0: ligneDeDonnees["Id"] = valeur.Trim(); break; case 1: ligneDeDonnees["Entreprise"] = valeur.Trim(); break; case 2: ligneDeDonnees["Contact"] = valeur.Trim(); break; case 3: ligneDeDonnees["Titre"] = valeur.Trim(); break; case 4: ligneDeDonnees["Adresse"] = valeur.Trim(); break; case 5: ligneDeDonnees["Ville"] = valeur.Trim(); break; case 6: ligneDeDonnees["Region"] = valeur.Trim(); break; case 7: ligneDeDonnees["CodePostal"] = valeur.Trim(); break; case 8: ligneDeDonnees["Pays"] = valeur.Trim(); break; case 9: ligneDeDonnees["Telephone"] = valeur.Trim(); break; case 10: ligneDeDonnees["Telecopie"] = valeur.Trim(); break; case 11: ligneDeDonnees["CA"] = valeur.Trim(); break; default: ligneDeDonnees[string.Format("Colonne {0}", index)] = valeur.Trim(); break; } } }

Cest quoi switch ? switch est une instruction de slection afin dvaluer une expression et de dterminer le bloc de code excuter ; switch saute automatiquement un libell qui correspond lexpression, pour excuter le bloc de code finissant ncessairement par break ; Cours de C# Page 62 sur 91

INSIA

2011 Prendre en main les applications winforms Pour tout savoir sur switch : http://msdn2.microsoft.com/fr-fr/library/06tc147t(VS.80).aspx Enfin, juste avant } fermante de la mthode, ajoutez la fonction AjouterLigneATable le code dajout de la ligne de donnes nouvellement cre ;

Code C#
private void AjouterLigneATable(string LigneLue, DataTable TableDeDonnees) { // Pour toute les valeurs, met jour le ligne de donnes foreach (string valeur in valeursLues) { switch (index++) { } } // Ajoute la nouvelle ligne de donnes la table TableDeDonnees.Rows.Add(ligneDeDonnees); }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement. Bon, maintenant que nous savons ajouter une nouvelle ligne de donnes partir de la ligne de texte lue, il faut lire le fichier texte ligne ligne et appeler la fonction AjouterLigneATable pour chacune des lignes de texte !

Code C#

Affichez le code du formulaire Main.cs, en faisant un clic-droit sur Main.cs dans lExplorateur de solutions, et en slectionnant le menu Afficher le code ; Positionnez le curseur juste aprs laccolade } fermante du constructeur de la classe Main ; Ajoutez deux lignes vides en tapant sur la touche Entre ; Crez une fonction OuvrirFichier en ajoutant le code suivant :

private DataTable OuvrirFichier(string NomDuFichier) { }

La fonction OuvrirFichier possde un seul paramtre, NomDuFichier qui est le nom complet du fichier ouvrir et renvoie une table de donnes complte de type DataTable , contenant tous les enregistrements lus;

Cours de C#

Page 63 sur 91

INSIA

2011 Prendre en main les applications winforms Encore une fois, une rgle de bonne programmation est de systmatiquement ajouter le code de renvoi de fonction avec la cration de la fonction. Pour ma part, jutilise toujours une variable nomme result (bon, je radote un peu mais cela vite des bogues). Et comme lassignation est obligatoire, assignez null vos variables de retour de type objet, si vous navez pas dautres valeurs donner (logique). Ajoutez la fonction OuvrirFichier le code de dfinition et de renvoi de la valeur de retour ;

Code C#
private DataTable OuvrirFichier(string NomDuFichier) { // definition de la variable de retour DataTable result = null; // renvoi de la valeur return result; }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; La structure de la fonction est correcte. Nous avons besoin de dfinir deux variables : 1. ligneLu, de type string, qui correspond la ligne de fichier lue et qui est passe en paramtre la fonction AjouterLigneATable ; 2. estPremireLigne, de type boolen, qui indiquera si nous lisons la premire ligne, car dans ce cas il faudra assigner la DataTable devant recevoir les enregistrements qui est passe en paramtre de la mthode AjouterLigneATable ;

Ajoutez la fonction OuvrirFichier le code de dfinition des variables ligneLu et estPremireLigne ;

Code C#
private DataTable OuvrirFichier(string NomDuFichier) { // definition de la variable de retour DataTable result = null; // Definition et assignation des variables string ligneLu = string.Empty; Boolean estPremiereLigne = true; // renvoi de la valeur return result; }

Cours de C#

Sous la dernire ligne insre, faites un clic-droit et slectionnez le menu Insrer un extrait ; Page 64 sur 91

INSIA

2011 Prendre en main les applications winforms

Slectionnez lextrait de code filesystem > Read Text From a File ;

Le code suivant est ajout la fonction : Code C#


private DataTable OuvrirFichier(string NomDuFichier) { Boolean estPremiereLigne = true; string fileContents; using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Test.txt")) { fileContents = sr.ReadToEnd(); } // renvoi de la valeur return result; }

Dans lextrait de code ajout apparat des parties en vert ; ce sont les lments paramtrer de lextrait ; Elment dfinir pour lextrait Dans notre cas, il sagit de dfinir le nom du fichier ouvrir ; Cest quoi @ devant la chane de caractre ? Le caractre @ devant une chaine de caractre indique quil faut traiter les caractres spciaux ( \ dans notre cas) comme un caractre normal.

Cours de C#

Page 65 sur 91

INSIA

2011 Prendre en main les applications winforms Cest quoi using ? using dfinie la porte dune variable en dehors de laquelle elle sera supprime. Bon, si ce nest pas trs clair, voici lexplication de la porte et de la visibilit des variables. La porte dune variable dfinie ltendue de code durant laquelle le nom dune variable ne peut pas tre rutilis pour nommer une seconde variable. La visibilit dune variable dfinie ltendue de code durant laquelle le contenu de la variable peut tre accd en utilisant son nom (ou alias). Le petit schma suivant illustre la diffrence entre la porte et la visibilit :

Donc, le grand intrt de using est de limiter la porte des variables uniquement un bloc de code dtermin. Pour tout savoir sur using : http://msdn2.microsoft.com/fr-fr/library/yh598w02(VS.80).aspx Cest quoi un StreamReader ? Cest un objet qui lit des caractres partir d'un flux d'octets dans un codage particulier. Cest lobjet utiliser pour lire des lignes d'informations partir d'un fichier texte standard. Il appartient lespace de nommage System.IO, qui fourni tous les objets ncessaires pour raliser tout type dEntres/Sorties avec le systme. La mthode du StreamReader que nous allons utiliser pour lire une ligne de donne texte est ReadLine() ; Pour tout savoir sur StreamReader : http://msdn2.microsoft.com/fr-fr/library/6aetdk20(VS.80).aspx Dans la fonction OuvrirFichier, retirez le code de lextrait qui nous est inutile, et indiquez que le nom du fichier ouvrir est le paramtre NomDuFichier ;

Code C#
private DataTable OuvrirFichier(string NomDuFichier) { Boolean estPremiereLigne = true; string fileContents;

Cours de C#

Page 66 sur 91

INSIA

2011 Prendre en main les applications winforms

using (System.IO.StreamReader sr = new System.IO.StreamReader(NomDuFichier)) { fileContents = sr.ReadToEnd(); } // renvoi de la valeur return result; }

Reste maintenant lire ligne ligne le fichier texte dlimit, en utilisant une instruction de boucle ; C# propose diffrentes instructions de boucle dont lobjectif commun est dexcuter dune manire itrative un bloc de code : 1. for, qui est utiliser dans le cas o un numro de compteur est disponible ; 2. while, qui est utiliser dans le cas o une itration est excuter tant que ( while en anglais) une expression est vrai, ce qui veut dire que la boucle peut ne pas tre excute si lexpression est fausse ; 3. do, cest un peu comme un while, mais elle est utiliser dans le cas ou lexpression est valuer aprs que la boucle ait t excute au moins une fois ; On est alors sr de passer au moins une fois dans le bloc de code ; 4. foreach, qui est utiliser pour itrer automatiquement les lments dune collection ou dune liste ; Pour tout savoir sur les instructions ditration : http://msdn2.microsoft.com/fr-fr/library/32dbftby(VS.80).aspx Dans notre cas, nous allons utiliser un do, car durant la premire boucle nous devons assigner la table de donnes une nouvelle valeur. Puis nous ajouterons une nouvelle ligne la table de donnes, tout ceci si la valeur lue nest pas nulle bien sr ! Code C#
private DataTable OuvrirFichier(string NomDuFichier) { using (System.IO.StreamReader sr = new System.IO.StreamReader(NomDuFichier)) { do { // Pour chaque ligne lu ligneLu = sr.ReadLine(); } while (ligneLu != null); } }

Ajoutez la fonction OuvrirFichier le code de lecture de chacune des lignes ;

Cours de C#

Page 67 sur 91

INSIA

2011 Prendre en main les applications winforms If faut maintenant tester la valeur de la ligne lue et vrifier si cette ligne est la premire ligne lue. Nous allons utiliser linstruction de slection ifelse ; Cest quoi if-else ? L'instruction if permet de slectionner une instruction excuter en fonction de la valeur d'une expression Boolenne. Pour tout savoir sur if-else : http://msdn2.microsoft.com/fr-fr/library/5011f09h(VS.80).aspx Sous la lecture de la ligne, ajoutez la fonction OuvrirFichier le code de test crant la table de donnes et ajoutant une nouvelle ligne celle-ci ;

Code C#
private DataTable OuvrirFichier(string NomDuFichier) { using (System.IO.StreamReader sr = new System.IO.StreamReader(NomDuFichier)) { do { // Pour chaque ligne lu ligneLu = sr.ReadLine(); // si c'est la premire ligne lue, // alors cr la table de donne if (estPremiereLigne && ligneLu != null) { result = CreerTable(); estPremiereLigne = false; } // Si la ligne de donnes n'est pas nulle, // alors ajoute la ligne la table de donnes if (ligneLu != null) AjouterLigneATable(ligneLu, result); } while (ligneLu != null); } }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; La dernire tape reste la slection et louverture du fichier sur le disque. Le Framework .Net propose des boites de dialogue communes toutes les applications pour les tches les plus courantes : louverture et la sauvegarde de fichier, la slection de couleurs ou de polices(font), ou encore la slection de rpertoires. Ces boites de dialogues communes

Cours de C#

Page 68 sur 91

INSIA

2011 Prendre en main les applications winforms sont disponibles soit au travers de contrles dcran sous la section Boite de dialogues dans la Boite outils, ou directement partir de classes pour instancier vos propres objets. Pour ouvrir un fichier sur le disque, nous allons utiliser un objet de type OpenFileDialog ; Les principales proprits et mthodes que nous allons utiliser sont : 1. Filter : Cette proprit sert filtrer les fichiers en se basant notamment sur lextension ; nous filtrerons tous les fichiers dextension *.coach ; 2. InitialDirectory : Cette proprit configure le rpertoire affich lors de louverture de la fentre ; 3. FileName : Cette proprit obtient ou dfinit le nom complet du fichier slectionn dans la liste des fichiers proposs ; 4. ShowDialog : Cette mthode affiche la boite de dialogue, et retourne une valeur de type DialogResult indiquant notamment le bouton que lutilisateur a cliqu pour sortir de la fentre ; Nous testerons ici que lutilisateur a bien cliqu le bouton OK ; Dans la fentre Main.cs en mode [Design], faites un double-clique sur le menu Fichier > Ouvrir ; Une mthode ouvrirToolStripMenuItem_Click de rponse au menu Ouvrir a t ajoute au code du formulaire Main.cs ; Dans la mthode ouvrirToolStripMenuItem _Click, ajoutez le code de cration et daffichage de la boite de dialogue douverture de fichier ;

Code C#
private void ouvrirToolStripMenuItem_Click(object sender, EventArgs e) { using (OpenFileDialog fileOpen = new System.Windows.Forms.OpenFileDialog()) { fileOpen.Filter = "Fichiers coach|*.coach"; fileOpen.InitialDirectory = @"c:\"; if (fileOpen.ShowDialog() == DialogResult.OK) { } } }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; Vous pouvez dailleurs aussi tester le bon fonctionnement de la boite de dialogue en lanant lapplication (a ne cote rien et cest visuel ) ; Dans la mthode ouvrirToolStripMenuItem_Click, ajoutez le code douverture du fichier et de configuration des sources de donnes ; Cest exactement le mme code que celui crit dans la mthode nouveauToolStripMenuItem_Click (cf. page 58), lexception que la Page 69 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms table de donnes est la valeur de retour de lappel de le fonction OuvrirFichier ;

Code C#
private void ouvrirToolStripMenuItem_Click(object sender, EventArgs e) { using (OpenFileDialog fileOpen = new System.Windows.Forms.OpenFileDialog()) { fileOpen.Filter = "Fichiers coach|*.coach"; fileOpen.InitialDirectory = @"c:\"; if (fileOpen.ShowDialog() == DialogResult.OK) { // Charge le fichier de donnes dans la source des bindings mainBindingSource.DataSource = OuvrirFichier(fileOpen.FileName); // Configure la navigation mainBindingNavigator.BindingSource = mainBindingSource; // Configure la grille de donnes sur la mme source // que la source de navigation mainDataGridView.DataSource = mainBindingNavigator.BindingSource; } } }

Il faut maintenant mmoriser le nom du fichier slectionn pour lutiliser lors de la sauvegarde. Pour ce faire, vous allez ajouter une variable nomFichier, de type string, et dont la porte va tre la totalit de la classe Main (pour la voir de partout dans la classe); Positionnez le curseur juste avant la dfinition du constructeur de la classe Main ; Ajoutez deux lignes vides en tapant sur la touche Entre ; Ajoutez le code suivant pour dfinir un membre priv (variable) de porte sur la totalit de la classe pour stocker le nom du fichier ;

Code C#
public partial class Main : Form { // Membres privs private string nomFichier = string.Empty; public Main() {

Revenez maintenant dans le code de la mthode douverture de fichier ouvrirToolStripMenuItem _Click ; Dans la mthode ouvrirToolStripMenuItem _Click, ajoutez le code de sauvegarde du nom du fichier ; Page 70 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms

Code C#
private void ouvrirToolStripMenuItem_Click(object sender, EventArgs e) { using (OpenFileDialog fileOpen = new System.Windows.Forms.OpenFileDialog()) { fileOpen.Filter = "Fichiers coach|*.coach"; fileOpen.InitialDirectory = @"c:\"; if (fileOpen.ShowDialog() == DialogResult.OK) { // Charge le fichier de donnes dans la source des bindings mainBindingSource.DataSource = OuvrirFichier(fileOpen.FileName); // Configure la navigation mainBindingNavigator.BindingSource = mainBindingSource; // Configure la grille de donnes sur la mme source // que la source de navigation mainDataGridView.DataSource = mainBindingNavigator.BindingSource.DataSource; // Mmorise le nom du fichier nomFichier = fileOpen.FileName; } } }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Dans lEditeur du Coach C#, cliquez le menu Fichier > Ouvrir ; La boite de dialogue Ouvrir douverture de fichier apparat ;

Cours de C#

Page 71 sur 91

INSIA

2011 Prendre en main les applications winforms Slectionnez le fichier dexemple Clients.coach situ dans les fichiers utiles de lexercice 02 (par exemple C:\Coach C#\Atelier 02\Fichiers Utiles\Exercice 02\Clients.coach) ; Dans la boite de dialogue Ouvrir, cliquez le bouton OK ; lditeur du coach saffiche maintenant avec lensemble des lignes lues ;

Bon, il ny a pas dire, bien que la programmation soit lancienne , a le fait tout de mme ! 2. Dveloppez le code dcriture du fichier CSV : Ici, on va programmer linverse de lexercice prcdent, c'est --dire que nous allons programmer la sauvegarde des informations de la grille au format CSV sur le disque. Nous allons tout dabord faire une fonction de sauvegarde des informations de la grille dans un fichier dont le nom est fourni en paramtre ; Code C#
private void SauverFichier(string NomDuFichier) { }

Affichez le code du formulaire Main.cs, en faisant un clic-droit sur Main.cs dans lExplorateur de solutions, et en slectionnant le menu Afficher le code ; Positionner le curseur juste aprs laccolade } fermante du constructeur de la classe Main ; Ajoutez deux lignes vides en tapant sur la touche Entre ; Crez une fonction sauverFichier en ajoutant le code suivant :

Cours de C#

Page 72 sur 91

INSIA La fonction
SauverFichier

2011 Prendre en main les applications winforms ne possde quun seul paramtre, NomDuFichier qui est le nom complet du fichier sauvegarder, et ne renvoie aucune valeur de retour (do void) Pour lire un fichier, nous avions utilis un StreamReader. Pour lcrire, nous allons utiliser un ?? StreamWriter, bien sr ! Cest quoi un StreamWriter ? Cest un objet qui crit des caractres partir d'un flux d'octets dans un codage particulier. Cest lobjet utiliser pour crire dans un fichier texte des lignes de texte. Tout comme le StreamReader, il appartient lespace de nommage System.IO, qui fournit tous les objets ncessaires pour raliser tout type dEntres/Sorties avec le systme. La mthode du StreamWriter que nous allons utiliser pour crire une ligne de donnes texte est WriteLine() (bien sr); Pour tout savoir sur StreamWriter : http://msdn2.microsoft.com/fr-fr/library/3ssew6tk(VS.80).aspx Il va aussi falloir itrer dans la collection de lignes de la table de donnes. Bon, si linstruction foreach serait plus indique dans le cas prsent (foreach est toujours prfrer for dans une liste ou une collection), nous allons utiliser un for, histoire de lavoir fait au moins une fois ! Ajoutez la mthode SauverFichier StreamWriter pour crire le fichier; le code dutilisation du

Code C#
private void SauverFichier(string NomDuFichier) { // Utilisation d'un crivain public ! using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(NomDuFichier, false)) { } }

Au fait, elle est o la collection de lignes de la table de donnes ? a cest une bonne question ! Elle est dans la proprit DataSource de notre objet de gestion de la source des liaisons mainBindingSource, bien sur ! En effet, aussi bien lors de la cration dun nouveau fichier que de louverture dun fichier existant, nous avons respectivement les lignes :
// Charge une table vide dans la source des bindings mainBindingSource.DataSource = CreerTable();

ou
// Charge le fichier de donnes dans la source des bindings mainBindingSource.DataSource = OuvrirFichier(fileOpen.FileName);

DataSource contient donc un objet de type DataTable, qui a une proprit Rows pointant sur la collection de lignes de la table de Cours de C# Page 73 sur 91

INSIA

2011 Prendre en main les applications winforms donnes. Au passage, si dans lune des deux fonctions vous positionnez le curseur sur la proprit DataSource, une aide rapide apparat vous indiquant entre autre le type de la proprit DataSource :

Type de DataSource

DataSource est de type objet, ce qui est normal car cette proprit est destine configurer ou obtenir non seulement des tables de donnes (DataTable), mais aussi tout objet pouvant fournir des donnes (DataSet, etc.), donc le Framework ne connait pas priori le type stocker. A lintrieur du bloc using, ajoutez la mthode SauverFichier le code pour itrer lensemble des lignes de la table de donnes, en utilisant la boucle for ;

Code C#
private void SauverFichier(string NomDuFichier) { // Utilisation d'un crivain public ! using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(NomDuFichier, false)) { // Balayage de l'ensemble des lignes de la table for ( int i = 0; i < mainBindingSource.DataSource.Rows.Count; i++) { } } }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Vous devez obtenir une erreur (bon, au moins une, quoi !)

Cest normal, le compilateur ne peut pas savoir que DataSource contient un objet de type DataTable. Et comme un objet de base na pas de proprit Rows, une erreur est gnre ! Cours de C# Page 74 sur 91

INSIA

2011 Prendre en main les applications winforms Mais comment indiquer quun objet a un type prcis ? C# propose des instructions et des mthodes de conversion ( cast) dun type en un autre. Si la conversion est possible, alors la valeur retourne est du type attendu ; Lorsque le compilateur peut automatiquement convertir une valeur dans un autre type, alors on parle de conversion implicite ; Si le compilateur ncessite une information pour pouvoir convertir une valeur, alors on parle de conversion explicite ; Comment indiquer une conversion (cast) explicite ? C# propose deux formalismes pour prciser des conversions explicites : 1. La valeur convertir est prcde du type de conversion entre parenthse :
((DataTable)mainBindingSource.DataSource).Rows

Dans le cas o la conversion nest pas possible, ce formalisme gnre une exception lexcution ; 2. La valeur convertir est suivie de linstruction as et du type de conversion :
(mainBindingSource.DataSource as DataTable).Rows

Dans le cas o la conversion nest pas possible, ce formalisme gnre une valeur nulle (null) lexcution : cest pour cette raison que je prfre as ! Dans les deux cas, un jeu de parenthses ( ) isole la valeur convertir du reste de lexpression. Pour tout savoir sur la conversion (cast) : http://msdn2.microsoft.com/fr-fr/library/ms173105(VS.80).aspx Pour tout savoir sur linstruction as : http://msdn2.microsoft.com/fr-fr/library/cscsdfbt(VS.80).aspx Modifiez la mthode SauverFichier afin de faire une conversion de DataSource en utilisant as ;

Code C#
private void SauverFichier(string NomDuFichier) { // Utilisation d'un crivain public ! using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(NomDuFichier, false)) { // Balayage de l'ensemble des lignes de la table for ( int i = 0; i < (mainBindingSource.DataSource as DataTable).Rows.Count; i++) { } } }

Cours de C#

Page 75 sur 91

INSIA

2011 Prendre en main les applications winforms Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout compile ! Reste maintenant concatner la valeur de chacun des champs de chaque ligne de la table de donnes. Comment concatner des chanes de caractres ? Pour concatner les chanes, le plus simple est dutiliser la mthode Concat de la classe string. Cette mthode concatne n chanes de caractres prcises en paramtre. Pour tout savoir sur lutilisation des chanes de caractres : http://msdn2.microsoft.com/fr-fr/library/ms228362(vs.80).aspx Pour tout savoir sur la classe string : http://msdn2.microsoft.com/fr-fr/library/s1wwdcbf(VS.80).aspx Comment accder la valeur dun champ dune ligne de donne s ? La proprit Rows du type DataTable est une collection de lignes de donnes (DataRow). Comme toutes les collections, nous pouvons accder une ligne dtermine en donnant son numro dordre entre crochets (en commenant 0 pour la premire). Par exemple, la ligne de code (mainBindingSource.DataSource as DataTable).Rows[2] renvoie la troisime ligne du tableau de donnes. Pour accder la valeur dun champ, il faut ensuite indiquer, toujours entre crochets, le nom du champ de donnes voulu. Par exemple, la ligne (mainBindingSource.DataSource as DataTable).Rows[2]["Id"] renvoie la valeur de lID de la troisime ligne du tableau de donnes. Fort de tout cela, ajoutez la mthode SauverFichier la ligne de code de concatnation dune ligne au format texte (lindentation de dpart des lignes a ici t retire pour plus de lisibilit) ;

Code C#
private void SauverFichier(string NomDuFichier) { // Utilisation d'un crivain public ! using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(NomDuFichier, false)) { // Balayage de l'ensemble des lignes de la table for ( int i = 0; i < (mainBindingSource.DataSource as DataTable).Rows.Count; i++) { // Concatnation de la ligne de streamWriter.WriteLine( string.Concat( (mainBindingSource.DataSource ,(mainBindingSource.DataSource ,(mainBindingSource.DataSource ,(mainBindingSource.DataSource texte as as as as DataTable).Rows[i]["Id"], ";" DataTable).Rows[i]["Entreprise"], ";" DataTable).Rows[i]["Contact"], ";" DataTable).Rows[i]["Titre"], ";"

Cours de C#

Page 76 sur 91

INSIA
,(mainBindingSource.DataSource as ,(mainBindingSource.DataSource as ,(mainBindingSource.DataSource as ,(mainBindingSource.DataSource as ,(mainBindingSource.DataSource as ,(mainBindingSource.DataSource as ,(mainBindingSource.DataSource as ,(mainBindingSource.DataSource as == System.DBNull.Value ? "0" : (mainBindingSource.DataSource )); } } }

2011 Prendre en main les applications winforms


DataTable).Rows[i]["Adresse"], ";" DataTable).Rows[i]["Ville"], ";" DataTable).Rows[i]["Region"], ";" DataTable).Rows[i]["CodePostal"], ";" DataTable).Rows[i]["Pays"], ";" DataTable).Rows[i]["Telephone"], ";" DataTable).Rows[i]["Telecopie"], ";" DataTable).Rows[i]["CA"] as DataTable).Rows[i]["CA"].ToString()

Si, si, cest bien une seule ligne de code (compter bien les ; et vous verrez, il ny en a quun seul qui appartient la ligne !). Bon, pour crire ce genre de code, utilisez lalignement des lignes et le copier -coller. Vous verrez, cest trs rapide. Tiens, cest quoi lexpression ?: ? L'oprateur conditionnel (?:) retourne l'une de deux valeurs selon la valeur d'une expression boolenne. Cest trs utile pour exprimer de manire concise et lgante des calculs qui pourraient ncessiter une construction if-else ; Dans notre cas, si la valeur du CA est nulle dans la grille de donnes (System.DBNull.Value), alors la valeur 0 est ajoute la chane, sinon on crit le CA indiqu ; Pourquoi utilise-t-on System.DBNull.Value ? System.DBNull.Value est la valeur nulle dune donne, indpendamment de son type. En effet, dans notre cas, nous avons un champ de type int, qui ne supporte donc pas la valeur null ; Pour indiquer quaucune valeur de donne na t saisie, la valeur System.DBNull.Value est utilise ; Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout compile normalement encore correctement. La dernire chose faire maintenant est dappeler cette mthode SauverFichier tous les endroits o lon peut dclencher la sauvegarde dun fichier, c'est--dire lorsque lutilisateur clique dans lditeur du coach sur le menu Fichier > Enregistrer ou Fichier > Enregistrer sous ; Pour sauvegarder un fichier sur le disque, nous allons utiliser un objet de type SaveFileDialog ; Les principales proprits et mthodes que nous Cours de C# Page 77 sur 91

INSIA

2011 Prendre en main les applications winforms allons utiliser sont : 1. Filter : Cette proprit sert filtrer les fichiers en se basant notamment sur lextension ; nous filtrerons tous les fichiers dextension *.coach ; 2. InitialDirectory : Cette proprit configure le rpertoire affich lors de louverture de la fentre ; 3. FileName : Cette proprit obtient ou dfinit le nom complet du fichier sauvegarder dans la liste des fichiers proposs ; 4. ShowDialog : Cette mthode affiche la boite de dialogue, et retourne une valeur de type DialogResult indiquant notamment le bouton que lutilisateur a cliqu pour sortir de la fentre ; Nous testerons ici que lutilisateur a bien cliqu le bouton OK avant de lancer la sauvegarde ; Dans la fentre Main.cs en mode [Design], faites un double-clique sur le menu Fichier > Enregistrer sous ; Une mthode enregistrersousToolStripMenuItem_Click de rponse au menu Enregistrer sous a t ajoute au code du formulaire Main.cs ; Dans la mthode enregistrersousToolStripMenuItem_Click, ajoutez le code de cration et daffichage de la boite de dialogue de sauvegarde du fichier ;

Code C#
private void enregistrersousToolStripMenuItem_Click(object sender, EventArgs e) { using (SaveFileDialog fileSave = new SaveFileDialog()) { fileSave.Filter = "Fichiers coach|*.coach"; fileSave.InitialDirectory = @"c:\"; if (fileSave.ShowDialog() == DialogResult.OK) { } } }

Code C#

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; Vous pouvez dailleurs aussi tester le bon fonctionnement de la boite de dialogue en lanant lapplication (a ne cote rien et cest toujours visuel ) ; Dans la mthode enregistrersousToolStripMenuItem_Click, ajoutez le code de sauvegarde par appel de la mthode SauverFichier ;

private void enregistrersousToolStripMenuItem_Click(object sender, EventArgs e) { using (SaveFileDialog fileSave = new SaveFileDialog())

Cours de C#

Page 78 sur 91

INSIA
{

2011 Prendre en main les applications winforms


fileSave.Filter = "Fichiers coach|*.coach"; fileSave.InitialDirectory = @"c:\"; if (fileSave.ShowDialog() == DialogResult.OK) { // Mmorise le nom du fichier nomFichier = fileSave.FileName; // Sauvegarde les informations SauverFichier(nomFichier); }

} }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; Dans la fentre Main.cs en mode [Design], faites un double-clique sur le menu Fichier > Enregistrer ; Une mthode enregistrerToolStripMenuItem_Click de rponse au menu Enregistrer sous a t ajoute au code du formulaire Main.cs ; Cette mthode de rponse au menu Enregistrer va tester si le fichier a dj t sauvegard (c'est--dire si le nom du fichier nest pas vide) pour utiliser le bon nom de fichier ; Sinon, elle va router le code sur la mthode correspondant au menu Enregistrer sous ;

Dans la mthode enregistrerToolStripMenuItem_Click, ajoutez le code de sauvegarde du fichier, si le nom de fichier existe ;

Code C#
private void enregistrerToolStripMenuItem_Click(object sender, EventArgs e) { // Si le nom du fichier est n'existe pas (i.e. est vide) if (nomFichier == string.Empty) { // route l'appel vers la sauvegarde avec selection du nom this.enregistrersousToolStripMenuItem_Click(sender, e); } else { // Sauvegarde les informations SauverFichier(nomFichier); } }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; Page 79 sur 91

Cours de C#

INSIA

2011 Prendre en main les applications winforms Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Testez maintenant votre application en crant un nouveau fichier (menu Nouveau), ajoutez quelques enregistrement, sauvegardez le tout, r ouvrez le fichier, etc. Cest magnifique ! Cest presque pro (hum ??).

3.3 Finaliser le comportement de la fentre


Pour faire vraiment professionnel, on va ajouter la fentre des comportements bien utiles, comme : - Protger la fentre contre les fermetures intempestives lorsque des modifications non encore sauvegardes ont t apportes la liste des donnes ; - Indiquer le nom du fichier dans la barre de titre de la fentre ; - Modifier licne de la fentre ; - Ou encore, trapper les erreurs qui pourraient survenir sur la grille de donnes ; Droulement de lexercice : 1. Protgez contre les fermetures intempestives de fentre : Il sagit ici dajouter une boite de dialogue de confirmation de sortie lorsque lutilisateur quitte lapplication sans sauvegarder les donnes modifies, et ce quelque soit le moyen de sortie ;

Pour ce faire, nous allons ajouter au formulaire une fonction de prise en charge dun vnement : FormClosing ; Cest quoi FormClosing ? L'vnement FormClosing se produit avant la fermeture du formulaire. Lorsqu'un formulaire est ferm, il est supprim et libre de ce fait toutes les ressources associes au formulaire. Si vous annulez cet vnement, le formulaire reste ouvert. Pour annuler la fermeture d'un formulaire, affectez true la proprit Cancel du FormClosingEventArgs pass au gestionnaire d'vnements, en paramtre de la mthode de prise en charge de lvnement. Pour tout savoir sur FormClosing : http://msdn2.microsoft.com/fr-fr/library/ddy1d5sa(VS.80).aspx Revenez sur le formulaire Main.cs en mode [Design] en cliquant sur longlet Main.cs [Design] de la zone de travail ;

Cours de C#

Page 80 sur 91

INSIA

2011 Prendre en main les applications winforms Faites un clic-droit lintrieur de la fentre (en dehors de tout autre contrle, sur la zone grise de la fentre par exemple) et slectionnez le menu Proprits ; Dans la barre doutils de la fentre de proprits, cliquez le bouton pour afficher la liste des vnements disponibles sur lobjet Main ; Pensez vrifier que vous tes bien sur le bon objet, dont le nom et le type saffiche dans la liste droulante en haut ;

Liste droulante Dans la liste des vnements disponibles, localisez lvnement FormClosing ; Faites un double-clique sur lvnement FormClosing dans la fentre de Proprits ; Vous venez dajouter la mthode de prise en charge de lvnement Main_FormClosing au code de lapplication ; Maintenant, dans le cas o des modifications ont t ralises, il faut afficher la boite de dialogue ; Nous allons donc ajouter et tester une variable de type boolen dont la porte sera la totalit de la classe Main ; Ds quune modification va tre apporte une ligne de donnes, nous assignerons cette variable vrai (true). Quand lutilisateur fera une sauvegarde, nous lassignerons de nouveau faux (false). Et le tour est jou ! Si ce nest plus le cas, affichez le code du formulaire Main.cs, soit en faisant un clic-droit sur Main.cs dans lExplorateur de solutions et en slectionnant le menu Afficher le code, soit en cliquant sur longlet Main.cs de la zone de travail ; Localisez le code o nous avions dfini pralablement le membre priv (variable) nomFichier ; il est normalement juste avant la dfinition du constructeur de la classe Main ; Ajoutez le code suivant pour dfinir un membre priv (variable) de porte sur la totalit de la classe pour indiquer si des modifications ont t apportes la liste de donnes ;

Code C#
public partial class Main : Form { // Membres privs private string nomFichier = string.Empty; private bool desModificationsOntEteRealisees = false; public Main() {

Cours de C#

Page 81 sur 91

INSIA

2011 Prendre en main les applications winforms Revenez maintenant la mthode Main_FormClosing et ajoutez le code suivant pour afficher une boite de dialogue dans le cas o des modifications ont t apportes la liste ;

Code C#
private void Main_FormClosing(object sender, FormClosingEventArgs e) { // Test si des modification ont t apportes if (desModificationsOntEteRealisees) { if (MessageBox.Show("Des modifications ont t ralises. Voulezvous quitter sans les sauvegarder ?", "Confirmation", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel) // Annulation de la sortie e.Cancel = true; } }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; Ensuite, il faut dterminer quand une donne a chang : cette dernire aura chang quand une ligne de la table de donnes a chang (tiens, on utilise quand cest donc un vnement ! cf. page 30). Dans la mthode CreerTable, nous allons donc connecter une mthode de rponse lvnement RowChanged sur notre objet result qui reprsente la table de donnes; Comment connecter en code une mthode de rponse un vnement ? Cest vrai, jusqu' maintenant nous sommes passs par la fentre de proprits sur un contrle pour connecter des mthodes de rponses un vnement. Mais il est possible de le faire par le code en utilisant loprateur dassignation pour les vnements +=, aussi appel dans la littrature operateur de concatnation de dlgu (on verra cela plus en dtail dans le prochain atelier).

Localisez la mthode de cration dune nouvelle table de donnes CreerTable ; Positionnez vous juste avant le retour de la valeur et ajoutez la ligne de commentaire ;

Code C#
private DataTable CreerTable() { result.Columns.Add(new DataColumn("CA", typeof(int))); // Dfinition de la mthode de rponse en cas de changement // retour de la valeur

Cours de C#

Page 82 sur 91

INSIA
return tableDeDonnees; }

2011 Prendre en main les applications winforms

Commencez taper la ligne result.r et aidez vous de lIntelliSense pour localiser lvenement RowChanged ;

Tapez maintenant loprateur += ; LIntelliSense vous propose dappuyer sur TAB pour insrer la bonne criture de connexion de lvnement (super, non ?)

Appuyez donc une premire fois sur la touche TAB pour crire la ligne ; LIntelliSense vous propose dappuyer une deuxime fois sur TAB pour gnrer la mthode de prise en charge de lvnement (l, cest carrment gnial !) ;

Appuyez donc une deuxime fois sur la touche TAB pour gnrer la mthode de prise en charge de lvnement ; La mthode est automatiquement gnre ;

Code C#
void result_RowChanged(object sender, DataRowChangeEventArgs e) { throw new Exception("The method or operation is not implemented."); }

Dtruisez la seule ligne de cette mthode (qui indique quelle na pas encore t implmente) et ajoutez le code pour indiquer que des modifications ont t apportes la liste de donnes ;

Code C#
void result_RowChanged(object sender, DataRowChangeEventArgs e) { throw new Exception("The method or operation is not implemented."); // Indique que des modfications ont t apportes desModificationsOntEteRealisees = true; }

Reste repasser la variable desModificationsOntEteRealisees faux (false) quand la sauvegarde est ralise, cette dernire opration tant ralise dans la mthode SauverFichier ; Il faudra aussi le faire lors de Cours de C# Page 83 sur 91

INSIA

2011 Prendre en main les applications winforms louverture dun fichier CSV (mthode OuvrirFichier) car lors de la lecture du fichier CSV, on ajoute les enregistrements et lvnement RowChanged est dclench ! Localisez la mthode de sauvegarde des donnes SauverFichier ; Positionnez en tout dbut de mthode et ajoutez le code pour assigner false la variable desModificationsOntEteRealisees ;

Code C#
private void SauverFichier(string NomDuFichier) { // Indique que tout est sauvegard (s'il n'y a pas un bogue ...) desModificationsOntEteRealisees = false; // Utilisation d'un crivain public ! using (System.IO.StreamWriter streamWriter

Localisez la mthode douverture dun fichier de donnes OuvrirFichier ; Positionnez vous en fin de mthode, avant le retour de valeur, et ajoutez le mme code que ci-dessus ;

Code C#
private DataTable OuvrirFichier(string NomDuFichier) { // Indique que tout est sauvegard desModificationsOntEteRealisees = false; // renvoi de la valeur return result; }

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Testez maintenant votre application en modifiant une ou deux lignes et en sortant : tout marche bien !

2. Indiquez licne et le nom du fichier : Bon, l il ny a pas vraiment de nouveauts, mais cela me chagrinait que licne soit faux et que la barre de titre nindique pas le nom du fichier (un peu perfectionniste, certainement). En challenge, vous pouvez tenter de corriger ces points vous-mme en rflchissant au meilleur moyen dy arriver . Cours de C# Page 84 sur 91

INSIA

2011 Prendre en main les applications winforms Affichez le code du formulaire Main.cs, soit en faisant un clic-droit sur Main.cs dans lExplorateur de solutions et en slectionnant le menu Afficher le code, soit en cliquant sur longlet Main.cs de la zone de travail ; Localisez la mthode enregistrersousToolStripMenuItem_Click ; Indiquez que la proprit Text du formulaire (this) est la concatnation de son titre et du nom du fichier ;

Code C#
private void enregistrersousToolStripMenuItem_Click(object sender, EventArgs e) { using (SaveFileDialog fileSave = new SaveFileDialog()) { if (fileSave.ShowDialog() == DialogResult.OK) { // Sauvegarde les informations SauverFichier(nomFichier); // Indique le nom du fichier dans le titre this.Text = string.Concat("Editeur du Coach C#", " - ", nomFichier); } } }

Rptez la mme opration pour la mthode douverture de fichier ouvrirToolStripMenuItem_Click ;

Code C#
private void ouvrirToolStripMenuItem_Click(object sender, EventArgs e) { using (OpenFileDialog fileOpen = new OpenFileDialog()) { if (fileOpen.ShowDialog() == DialogResult.OK) { // Mmorise le nom du fichier nomFichier = fileOpen.FileName; // Indique le nom du fichier dans le titre this.Text = string.Concat("Editeur du Coach C#", " - ", nomFichier); } } }

Localisez le constructeur de la classe Main ; Juste en dessous de lappel InitializeComponent(), indiquez que la proprit Icon du formulaire (this) pointe sur licne sauvegard en ressources ; Page 85 sur 91

Cours de C#

INSIA Code C#
public Main() { InitializeComponent();

2011 Prendre en main les applications winforms

// Paramtrage de l'icone de la fentre this.Icon = Properties.Resources.lan_connected;

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; On obtient bien licne et le titre de la fentre avec le nom du fichier.

3. Trappez les erreurs de la grille : Lorsquune erreur survient sur la grille, la boite suivante saffiche :

Nous allons la remplacer par une boite plus propre comme celle-ci :

Et aussi (pour le fun) ajouter une entre dans le journal dvnement de la machine, pour amliorer la maintenabilit de lapplication. Cours de C# Revenez sur le formulaire Main.cs en mode [Design] en cliquant sur longlet Main.cs [Design] de la zone de travail ; Faites un clic-droit sur la grille de donnes et slectionnez le menu Proprits ; Dans la barre doutils de la fentre de proprits, cliquez le bouton pour afficher la liste des vnements disponibles sur lobjet Page 86 sur 91

INSIA

2011 Prendre en main les applications winforms mainDataFridView ; Pensez vrifier que vous tes bien sur le bon objet, dont le nom et le type saffiche dans la liste droulante en haut ; Dans la liste des vnements disponibles, localisez lvnement DataError ; Faites un double-clique sur lvnement DataError dans la fentre de Proprits ; Vous venez dajouter la mthode de prise en charge de lvnement mainDataGridView_DataError au code de lapplication ; Ajoutez cette mthode le code pour afficher le message derreur ;

Code C#

private void mainDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e) { // Affiche le message d'erreur MessageBox.Show(e.Exception.Message); }

Sous la dernire ligne insre, faites un clic-droit et slectionnez le menu Insrer un extrait ; Slectionnez lextrait de code application > Write a message to the Application Event Log ;

Code C#

Remplacez "ApplicationName" par "Coach C#" ; Remplacez "Action complete." par e.Exception.Message;

private void mainDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e) { // Affiche le message d'erreur MessageBox.Show(e.Exception.Message); // Create the source, if it does not already exist. if (!System.Diagnostics.EventLog.SourceExists("Coach C#")) { System.Diagnostics.EventLog.CreateEventSource("Coach C#", "Application"); } // Create an EventLog instance and assign its source. System.Diagnostics.EventLog myLog = new System.Diagnostics.EventLog(); myLog.Source = "Coach C#";

Cours de C#

Page 87 sur 91

INSIA

2011 Prendre en main les applications winforms


// Write an informational entry to the event log. myLog.WriteEntry(e.Exception.Message);

Dans la barre doutils de Visual C# Express, cliquez le bouton pour sauvegarder les modifications ralises ; Tapez la touche F6 pour lancer la compilation du code ; Tout doit se compiler correctement ; Dans la barre doutil de Visual C# Express, cliquez le bouton pour dmarrer votre application en mode de dbogage ; Dans lEditeur du Coach C#, slectionnez le menu Fichier > Nouveau ; Dplacez le curseur sur le champ CA de la premire ligne, et saisissez une chaine de caractres quelconque, sans signification dans notre contexte ;

Cliquez sur la deuxime ligne de la grille pour valider la saisie ; Le message derreur apparat ;

Cours de C#

Page 88 sur 91

INSIA

2011 Prendre en main les applications winforms

Cliquez le bouton Ok , puis la touche Echappement (ESC) pour sortir de la saisie ; Fermez la fentre de lditeur ; Dans Windows XP, slectionnez le menu Dmarrer > Panneau de configuration > Outils dadministration > Observateur dvnements ; Slectionnez les vnements de type Application et double-cliquez sur celui dont la source est Coach C# ; Votre vnement apparat ;

Fermez maintenant lobservateur dvnement ; Et voil, vous avez ce que lon peut appeler une premire application en C#. Plutt que dcrire le message derreur uniquement, vous pouvez en profiter pour concatner diffrentes informations comme la mthode qui plante, le nom de lutilisateur, etc. enfin tout ce qui sera utile pour vous aider dans votre travail de maintenance.

Bon, et bien voil, nous sommes arrivs la fin de ce deuxime atelier. Vous avez t formidable (si, si, vous avez tenu jusqu cette ligne !). Et lair de rien, nous avons vu les types et les structures de base du C#, tout en dveloppant notre interface utilisateur. Mais ne vous arrtez pas l, continuez le coach, car maintenant nous allons voir comment modliser les objets. En gros, nous allons maintenant changer le mode de fonctionnement interne de lapplication, sans impact sur linterface Cours de C# Page 89 sur 91

INSIA

2011 Prendre en main les applications winforms utilisateur, et vous allez comprendre la puissance du C# !

Cours de C#

Page 90 sur 91

INSIA

2011 Prendre en main les applications winforms

4 Pour aller plus loin


4.1 Les liens utiles
Pour avoir plus dinformation concernant les bonnes rgles suivre pour le dveloppement, voici un lien intressant : - http://msdn2.microsoft.com/fr-fr/library/bb278146.aspx , qui explique comment rviser un code ;

4.2 Ide/ressource
Si vous souhaitez apprendre la programmation dapplication Web avec C#, il existe le Coach ASP.Net : http://www.microsoft.com/france/msdn/aspnet/coach/coach.mspx Et pour bien grer vos projets de dveloppement, suivez le coach Visual Studio Team System :
http://www.microsoft.com/france/msdn/vstudio/teamsystem/evaluez/CoachVSTS.mspx

Cours de C#

Page 91 sur 91