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

Windows Forms Discussion :

[C#] Evenements & cast de l'objet Sender


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Par défaut [C#] Evenements & cast de l'objet Sender
    Lorsque j'appelle une procédure d'évènement par exemple gotFocus (appellé sur plusieurs types de controles WinForms sur l'évènement GotFocus), je dois pour modifier certaines propriétés à condition que le sender soit d'un type précis

    (hors de question de faire un ((Control)Sender).BackColor pour coloriser les labels ect....

    Je procède donc de la manière suivante, je me demandais si il y avait une manière plus élégante de procéder. Par exemple je pourrais tester toutes les conditions typeOf() puis faire soit un return; direct soir utiliser alors la classe mère Control.

    Je vous soumets le problèmes pour vos retours d'expérience. Merci bien d'avance !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
       public static void gotFocus(object sender, System.EventArgs args)
            {
                // on récupère le type de l'objet ayant déclenché l'évènement
                // on le cast puis on modifie la propriété de fond
     
                if (sender.GetType() == typeof (TextBox))
                {
                    ((TextBox)sender).propriété = valeur;
                    (....)  
                    return;
                }
                (....)
            }

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    hors de question de faire un ((Control)Sender).BackColor pour coloriser les labels
    Pourquoi cela ???????

    Le principe objet est tel que tu appelles toujours la méthode la plus spécialisée possible (et non pas la méthode du type déclaré).
    Donc si tu fais ca, ca marche bien, c'est propre et ton code sera plus optimisé ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If (TypeOf sender Is Control)
       ((Control)sender).BackColor = taCouleur;

  3. #3
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Encore plus propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Control ctrl = (sender as Control);
    if(ctrl != null)
      ctrl.BackColor = ...

  4. #4
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Bonjour,

    Si tu veux vraiment ne gérer que des controls bien précis, il te faut créer tes propres controls en héritant des controls que tu desires en implémentant une interface.

    Exemple

    1. Tu crées une interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Public Interface IControlDesign
        ' Couleur de fond
        Property CouleurFond() As Drawing.Color
    End Interface
    2. Tu créés une classe pour chaque control que tu veux gérer avec cette interface :

    Exemple avec un TextBox

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Public Class AXTextBox
                Inherits System.Windows.Forms.TextBox
                Implements IControlDesign
    #Region " Code généré par le Concepteur Windows Form "
        Public Sub New()
            MyBase.New()
     
            'Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
        End Sub
     
        'La méthode substituée Dispose du UserControl pour nettoyer la liste des composants.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
     
        'Requis par le Concepteur Windows Form
        Private components As System.ComponentModel.IContainer
     
        'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
        'Elle peut être modifiée en utilisant le Concepteur Windows Form. 
        'Ne la modifiez pas en utilisant l'éditeur de code.
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
            components = New System.ComponentModel.Container
        End Sub
    #End Region
     
        '*** Implémentation couleur de fond.
        Public Property CouleurFond() As Drawing.Color Implements IControlDesign.CouleurFond
            Get
                Return Me.BackColor
            End Get
            Set(ByVal Value As Drawing.Color)
                Me.BackColor = Value
            End Set
        End Property
    End Class


    3. Il ne te reste plus qu'à tester la présence de l'interface :

    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
     
    Private Sub MonForm_GotFocus( _
                            ByVal sender As Object, _
                            ByVal e As System.EventArgs _
                            ) Handles MyBase.GotFocus
        Try
            ' Si l'interface IControlDesign est présent,
            ' on affecte la propriété CouleurFond
            If TypeOf sender Is IControlDesign Then _
                    CType(sender, IControlDesign).CouleurFond = Couleur
     
        Catch ex As Exception
            ' Gestion des exceptions
            MsgBox(ex.ToString)
        End Try
    End Sub
    C'est sur que cela necessite de ne plus utiliser les composants Windows.forms dans tes forms, mais les composants que tu as créés.

    Par ailleurs, j'aimerais signaler que d'avoir fait hériter les composants basiques tes que (TextBox, Label, RadioButton, CheckBox, etc...) nous as vraiment rendu service pour faire communiquer les composants avec des formulaires de base, grâce aux interfaces.

  5. #5
    Membre très actif
    Inscrit en
    Janvier 2004
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 208
    Par défaut
    pour ma part perso

    je viens de tester en utilisant la class control et le seul probleme est mon Control reste toujour Null malgré le cast de l'object sender.

    cela rejoint le debut de discution que j'ai ecrit hier (Propriete d'object).

    a plus

  6. #6
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Est ce que sender est nul ?
    Si non : quel est son type (le débugger de dira tout ça)
    (son VRAI type, que tu choppes avece GetType(), pas son type déclaré 'object')

Discussions similaires

  1. Evenement onload et méthode d'objet
    Par kaymak dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/03/2007, 10h56
  2. Réponses: 2
    Dernier message: 06/03/2007, 19h38
  3. [POO] Erreur suite à un cast sur un objet
    Par RogerB dans le forum Langage
    Réponses: 3
    Dernier message: 02/11/2006, 13h56
  4. Cast d'un objet d'une TObjectList
    Par maredami dans le forum Langage
    Réponses: 21
    Dernier message: 23/03/2006, 16h16
  5. transtypage de l'objet sender
    Par jeltimohamed dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/02/2005, 23h01

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