IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Allègement du code, passage par une class


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Par défaut Allègement du code, passage par une class
    Bonjour

    Je voudrais alléger mon code situé sur ma class form et transférer le tout dans une class d'initialisation de ma fenêtre.
    j'ai déjà fait une partie du travail, mais je bloque sur le passage d'un même évènement concernant des contrôles de même type. (c'est pas très clair dit comme ça)

    En gros, dans ma form j'ai ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
           private void mnu_Fichier_DropDownClosed(object sender, EventArgs e)
            {
                mnu_Fichier.ForeColor = System.Drawing.Color.White;
            }
     
            private void mnu_Fichier_DropDownOpening(object sender, EventArgs e)
            {
                mnu_Fichier.ForeColor = System.Drawing.Color.Black;
            }
     
            private void mnu_Options_DropDownClosed(object sender, EventArgs e)
            {
                mnu_Options.ForeColor = System.Drawing.Color.White;
            }
     
            private void mnu_Options_DropDownOpening(object sender, EventArgs e)
            {
                mnu_Options.ForeColor = System.Drawing.Color.Black;
            }
     
            private void mnu_Help_DropDownClosed(object sender, EventArgs e)
            {
                mnu_Help.ForeColor = System.Drawing.Color.White;
            }
     
            private void mnu_Help_DropDownOpening(object sender, EventArgs e)
            {
                mnu_Help.ForeColor = System.Drawing.Color.Black;
            }
    les "mnu_..." sont des ToolStripMenuItem.

    Je voudrais en fait charger par une méthode située dans une class à part ces changements.

    En gros, pour chaque ToolStripMenu qui ont un évènement DropDownOpening (ou DropDownClosed), je voudrais modifier la couleur en une seule fois, et pas me retrouver avec ces multiplications d'évènements dans mon code.

    je possède une classe d'initialisation où à l'intérieur j'initialise une connexion à la BDD, où j'initialise mes boutons dans un MenuStrip, etc etc.. mais là je suis perdu, notamment à cause des évènements.

    Quelqu'un aurait une piste ou une idée ?

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    En fait, toutes ces fonctions ont été généré par ton designer, car à partir de ton designer tu as fait un double clic sur chaque événement correspondant pour t'y abonner et automatiquement il te crée les fonctions ainsi. Si tu les supprimes directement, le compilateur va râler car dans la partie "TonFichier.designer.cs" il va y avoir des lignes du genre "this.mnu_Fichier.DropDownClosed += mnu_Fichier_DropDownClosed;" et là par exemple il ne trouve plus la fonction correspondante. De plus, il est très fortement déconseillé de supprimer des choses à la main dans le fichier avec "designer" car il est régénéré à chaque changement que tu fais à partir du designer.

    Ce que je conseille dans ce cas : ne pas les initialiser dans une autre classe car les variables "mnu_..." sont des membres privés en principe et devraient le rester idéalement. Donc il suffit d'initialiser les événements avec des expressions lambda directement dans le constructeur avec, pour plus de lisibilité, un encadrement dans une région :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public MaForm()
    {
        InitializeComponents();
     
        //Des traitements éventuellement
     
        #region Initialisation des événements
        mnu_Fichier.DropDownClosed += (snd,evt) => { ((ToolStripMenuItem)snd).ForeColor = System.Drawing.Color.White; }
        mnu_Fichier.DropDownOpening += (snd,evt) => { ((ToolStripMenuItem)snd).ForeColor = System.Drawing.Color.Black; }
     
        mnu_Options.DropDownClosed += (snd,evt) => { ((ToolStripMenuItem)snd).ForeColor = System.Drawing.Color.White; }
        mnu_Options.DropDownOpening += (snd,evt) => { ((ToolStripMenuItem)snd).ForeColor = System.Drawing.Color.Black; }
     
        mnu_Help.DropDownClosed += (snd,evt) => { ((ToolStripMenuItem)snd).ForeColor = System.Drawing.Color.White; }
        mnu_Help.DropDownOpening += (snd,evt) => { ((ToolStripMenuItem)snd).ForeColor = System.Drawing.Color.Black; }
        #endregion
    }
    Explication : le délégué est "EventHandler" qui désigne une méthode qui a 2 paramètres : le premier qui désigne l'objet en cours et le second c'est un EventArgs.

    Après, si tu es sûr que ce sera toujours "White" et "Black" pour les couleurs, on peut faire un truc un peu plus élégant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public MaForm()
    {
        InitializeComponents();
     
        //Des traitements éventuellement
     
        #region Initialisation des événements
        ToolStripMenuItem[] menuItems = { mnu_Fichier, mnu_Options, mnu_Help };
        foreach(ToolStripMenuItem menuItem in menuItems)
        {
            menuItem.DropDownClosed += (snd,evt) => { ((ToolStripMenuItem)snd).ForeColor = System.Drawing.Color.White; }
            menuItem.DropDownOpening += (snd,evt) => { ((ToolStripMenuItem)snd).ForeColor = System.Drawing.Color.Black; }
        }
        #endregion
    }
    Une fois que tu as fait cela, il faut bien entendu enlever les méthodes correspondantes déjà existantes mais il faut le faire à l'aide du designer. Voilà.

    Si tu étais en WPF, tu aurais pu gérer ça tout en XAML d'une manière bien plus élégante...

  3. #3
    Membre éclairé Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Par défaut
    Merci pour la réponse.

    J'essaie de toucher le moins possible à la partie designer.cs de toute façon.
    Effectivement mes toolstripmenuitem sont des membres privés et leurs évènements sont bel et bien générés directement depuis le designer.

    je voulais surtout savoir si il était possible "d'extérioriser" l'appel des évènements et connaître la méthode, mais en fait la deuxième partie de ton message correspond à ce que je cherchais pour avoir moins de lignes dans mon code.
    Disons que le passage vers une class, c'était pour le côté folklo et compréhension de l'utilisation c# (je suis un peu débutant, disons que ça fait plus de 6 ans que j'en ai pas refait)

    Merci en tous les cas, je passe en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage d'une classe en argument a glut
    Par black.out dans le forum C++
    Réponses: 5
    Dernier message: 08/11/2006, 19h21
  2. passage d'une classe à une autre
    Par Gibou dans le forum C++
    Réponses: 17
    Dernier message: 18/06/2006, 15h14
  3. Réponses: 4
    Dernier message: 13/10/2005, 14h44
  4. ou mettre une structure utilisée par une classe
    Par grand's dans le forum C++
    Réponses: 10
    Dernier message: 28/07/2005, 18h53
  5. [Juridique] Comment réutiliser le code source d'une classe ?
    Par mathieu dans le forum Général Java
    Réponses: 8
    Dernier message: 17/05/2004, 13h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo