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 :

Detecter un changement dans un form


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Par défaut Detecter un changement dans un form
    Bonjour,
    j'ai un form avec plusieurs composants (texbox, combobox, etc...)
    Je souhaiterai savoir comment détecter si un des composants à été modifié (changement d'un textbox, selection d'un autre item dans ma combobox.)
    Le but est d'éviter de mettre un boolean dans l'event XX_Changed de chaque composant et de vérifier a la sortie du form si celui ci a basculer.
    Merci

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Sauvegarder au début les valeurs initiales (Text, Checked, ...) des composants dans un arrayList et vérifier l'égalité en sortie.

    On peut même faire 2 routines void Save(Control ParentControl, ArrayList SavedValues) et bool Compare(Control ParentControl, ArrayList SavedValues) totalement indépendantes du contenu de ParentControl.
    Il faudra envisager toute l'arborescence des Controls de ParentControl (une proc récursive simplifiera l'écriture) et envisager chaque type de Control : TextBox, ComboBox, CheckBox, ...

    Autre solution, si l'IHM est remplie à partir d'objet et destinée à les modifier:
    on compare l'objet initial et l'objet résultant de la saisie. Pour cela, on implémente les procedures suivantes :
    - Fonction Clone de l'objet : ObjetSaved=new UserObject() ; ObjetSaved.Clone(ObjetAediter),
    - Fonction ObjectToIhm(ObjetAediter)
    - Fonction IhmToObject(ObjetSaisi)
    - Fonction Compare de l'objet : bool Modified=ObjetSaisi.Compare(ObjetSaved) ;

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Par défaut
    N'est ce pas plus compliqué que de mettre une variable globale bool bModified=false et sur chaque composant le basculer à 'true' si il y a eu une modification?
    parceque ca me parait plus facile que ta proposition

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Effectivement, maintenir des booleens un par controle, c'est un peu naif, et un peu trop "cablé" ; je proposerai plutot quelque chose comme (pattern observer pas tout a fait fidelement... observé ( ), mais code assez simple) :

    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
     
    internal class ControlValueChange // a deriver, eventuellement
    {
      internal object OldValue;
      internal object NewValue;
      internal virtual void Initialize(Control subject) // a redefinir, probablement
      {
        OldValue = subject.Text;
        NewValue = subject.Text;
      }
      internal virtual bool IsDirty() // a redefinir, eventuellement
      {
        return (OldValue != NewValue);
      }
      internal virtual void Change(Control subject) // a redefinir, probablement
      {
        OldValue = NewValue;
        NewValue = subject.Text;
      }
    }
     
    private Hashtable observedControls = new Hashtable();
     
    protected virtual void CreateControlValueChange(Control control)
    {
      // en fait : ici instancier un ControlValueChange ou dérivée, en fonction de control.Type
      ControlValueChange cvc = new ControlValueChange();
     
      cvc.Initialize(control);
      observedControls[control] = cvc; 
    }
     
    // (helper)
    public bool IsDirtyControl(Control subject)
    {
       return observedControls[subject].ControlValueChange.IsDirty();
    }
    apres, plus qu'a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    foreach(Control current in form.Controls)
      CreateControlValueChange(current);
    (dans le form.Load p.ex)

    et dans le handler "observateur" de OnChanged :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ....(object sender, EventArgs args)
    {
       //...
      observedControls[sender].Change(sender as Control);
    }
    il vous suffira enfin de parcourir observedControl a la recherche des "dirty", par le helper IsDirtyControl (public) utiliser par le "client" de la form.

    'HTH

    Citation Envoyé par skunkies Voir le message
    Bonjour,
    j'ai un form avec plusieurs composants (texbox, combobox, etc...)
    Je souhaiterai savoir comment détecter si un des composants à été modifié (changement d'un textbox, selection d'un autre item dans ma combobox.)
    Le but est d'éviter de mettre un boolean dans l'event XX_Changed de chaque composant et de vérifier a la sortie du form si celui ci a basculer.
    Merci

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Par défaut
    Ce n'est pas un boolean par controle mais plutot un boolean global et danss chaque controle susceptible de changer le faire basculer a true , et dans le cas ou celui ci est a true cela veut dire qu'il ya eu au moins un changement, et donc l'idée et de proposer un message d'avertissement avant la fermeture.
    Ce que je fais actuellement mais de manière systematique.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Ah, ok, vu... ma (nos) solution(s) est (sont) un peu trop generique(s), alors...

    Bah, qui peut le plus, peut le moins : avec mon code ci dessus, je peux finir ma proposition en vous donnant ce booleen "global" ; mais il n'est pas stocké, mais plutot calculé par mon "observer" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public bool UnControlAuMoinsEstModifie()
    {
      bool ouiNon = false;
      foreach(object current in observedControls.Values)
        if(IsDirtyControl(current as Control))
        {
          ouiNon = true;
          break;
        }
      return ouiNon;
    }
    Citation Envoyé par skunkies Voir le message
    Ce n'est pas un boolean par controle mais plutot un boolean global et danss chaque controle susceptible de changer le faire basculer a true , et dans le cas ou celui ci est a true cela veut dire qu'il ya eu au moins un changement, et donc l'idée et de proposer un message d'avertissement avant la fermeture.
    Ce que je fais actuellement mais de manière systematique.

  7. #7
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Si on connait à l'avance le type de contrôle à surveiller, ne peut-on pas faire le genre de code comme suit ? :

    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
     
            void valueChanged(object sender, EventArgs e)
            {
                MessageBox.Show((sender as Control).Name + "modifié"); 
            }
     
            private void Form1_Shown(object sender, EventArgs e)
            {
                foreach (var form in Application.OpenForms)
                {
                    foreach (var control in (form as Form).Controls)
                    {
                        ComboBox c = control as ComboBox;
                        if (c != null)
                        {
                            c.SelectedIndexChanged += new EventHandler(valueChanged);
                        }
     
                        TextBox t = control as TextBox;
                        if (t != null)
                        {
                            t.TextChanged += new EventHandler(valueChanged);
                        }
                    }
                }
            }

  8. #8
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    parceque ca me parait plus facile que ta proposition
    • Certainement, si tu as une seule forme à gérer avec peu de composants et qui n'évolue pas beaucoup.
    • Assurement pas, si tu avais 10 formulaires, avec 50 composants chacun, parceque tu pourrais utiliser pour chacun la même procédure, sans te soucier des ajouts/suppression de composants dans un formulaire.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Par défaut
    oui tu as raison, j'ai 2 forms avec 10-15 composants qui evoluent pas trop

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

Discussions similaires

  1. Detection du click dans une form MDI
    Par ghost emperor dans le forum VB.NET
    Réponses: 0
    Dernier message: 18/02/2009, 09h56
  2. detecter le changement dans un jTextField
    Par waldoun dans le forum Composants
    Réponses: 8
    Dernier message: 26/04/2008, 13h36
  3. Changement dans une form
    Par Apranax dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/04/2008, 18h05
  4. Detecté le changement dans un input
    Par eXiaNazaire dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/11/2006, 15h34
  5. Réponses: 5
    Dernier message: 13/07/2006, 16h05

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