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#.Net] Evenement Paste (clickDroit souris)


Sujet :

Windows Forms

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut [C#.Net] Evenement Paste (clickDroit souris)
    Bonjour,

    J'essaie de faire un contrôle personnalisé qui dérive de TextBox, j'utilise la méthode KeyPress avec une expression régulière pour interdire n'importe quoi comme saisie... mais si on fait un copier/coller avec la souris on peut y mettre tout et n'importe quoi.

    J'aimerai donc savoir comment capter l'evenement "coller" pour lui appliquer le même code ?

    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    l'event TextChanged ou validated ne te serait-il pas d'un grand secours ?

    The Monz, Toulouse

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Vu que tu derives de textbox, il suffit d'intercepter le message de paste dans ta classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            int WM_PASTE = 0x0302;
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_PASTE)
                {
                    return;
                }
                base.WndProc(ref m);
            }
    Cela interdira tous les paste (menu contextuel, ctrl + V ou autres).

    Bon courage.

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    tu peux aussi faire un override de OnTextChanged()

    The Monz, Toulouse

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Alors :
    - Avec TextChanged le problème c'est que l'événement est déclanché une fois que le texte à changé... donc après le coller, pour moi c'est déjà trop tard, non ?

    - Interdire, le coller ?! Non, c'est pas le comportement que je cherche puisqu'on peut coller du moment que ça respecte mon expression régulière !

    - Validated s'active quand le contrôle perd le focus, ou pas loin, en tout cas pas au moment ou le texte change...

    Par contre, je peux voir du coté de TextChanged, prendre l'expression et la soumettre à mon RegEx et si elle n'est pas valide, revenir à l'état précédant le coller... seulement il faut savoir revenir à l'état précédant ? Je vais voir s'il n'y a pas un undo() ou un truc du genre !

    Merci

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    si tu fais Ctrl-Z sur une textbox, tu auras le Undo qui fonctionnera

    (par contre, si tu rappuies une nouvelle fois, ca te remet la valeur précedente)

    en clair, le Undo sur une textbox est "juste" un switch entre la nouvelle valeur et la valeur précedente.. mais il n'y a pas une "pile" des valeurs précédentes

    sinon, pour le undo/redo, j'aime bien la librairie Dejavu (free sur sourceforge)

    The Monz, Toulouse

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Citation Envoyé par Ticoche Voir le message
    - Interdire, le coller ?! Non, c'est pas le comportement que je cherche puisqu'on peut coller du moment que ça respecte mon expression régulière !
    A ok ! desolé mal lu. =p

    Dans ce cas, tu peux en interceptant le message Paste, et gerer toi meme le collage dans la textbox en recuperant les infos à la mimine. L'avantage, c'est que etant donné que tout se fait en amont, tu restes (tout comme pour le Keypress) sur que ce qui est dans la textbox est autorisé.

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Contrôler l'expression régulière directement sur le Clipboard, c'est pas possible ?

  9. #9
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Contrôler l'expression régulière directement sur le Clipboard, c'est pas possible ?
    Je ne connaissais pas cette Class... je vais voir, peut être faire un mixte de tout ce qu'on a dit.

    Je penses, sur le TextChanged vérifier le contenu du pressPapier et faire soit un undo, soit vider le contenu du press papier (mais ça c'est méchant quand même)...

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Oui, voila, je pensais a ce qu'à dit Bluedeep. Par exemple (codé à la va-vite, indulgence !) :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
        class MyTextBox : TextBox
        {
            int WM_PASTE = 0x0302;
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_PASTE)
                {
                    if (!ComputePaste())
                        return;
                }
                base.WndProc(ref m);
            }
     
            private bool ComputePaste()
            {
                if (Clipboard.ContainsText())
                {
                    string strToCompute = CreateFinalString();
     
                    //Tu retournes true, si c'est bon et false sinon
                }
                return false;
            }
     
            /// <summary>
            /// créé une string representant la string final tel qu'elle apparaitra apres le collage
            /// </summary>
            private string CreateFinalString()
            {
                string strToCompute;
     
                //On recupere le texte actuelle de la TB et on enleve la partie en surbrillance si besoin
                string currentStr = this.Text;
                if (this.SelectionLength != 0)
                {
                    currentStr = currentStr.Remove(this.SelectionStart, this.SelectionLength);
                }
     
                //On recupere le clipboard
                string clipStr = Clipboard.GetText();
     
                //Si la zone selectionnée ou le curseur est au debut ...
                if (this.SelectionStart == 0)
                {
                    strToCompute = clipStr + currentStr;
                }
                //... a la fin
                else if (this.SelectionStart == this.Text.Length)
                {
                    strToCompute = currentStr + clipStr;
                }
                //... ou au milieu de la TB
                else
                {
                    strToCompute = 
                        currentStr.Substring(0, this.SelectionStart) 
                        + clipStr 
                        + currentStr.Substring(this.SelectionStart, currentStr.Length - this.SelectionStart);
                }
     
                return strToCompute;
            }
        }
    En gros, le principe etant de recuperer ce qu'il y a dans le clipboard, recréer la chaine finale qui devrait etre afficher dans la textbox, et la passer à ta regex (ou whatever). Bon ceci dit ici, je teste une validité globale, on pourrait simplifier la methode en ne testant que la validité de ce qu'il y a dans le presse papier.

  11. #11
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Oui, voila, je pensais a ce qu'à dit Bluedeep. Par exemple (codé à la va-vite, indulgence !) :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
        class MyTextBox : TextBox
        {
            int WM_PASTE = 0x0302;
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_PASTE)
                {
                    if (!ComputePaste())
                        return;
                }
                base.WndProc(ref m);
            }
     
            private bool ComputePaste()
            {
                if (Clipboard.ContainsText())
                {
                    string strToCompute = CreateFinalString();
     
                    //Tu retournes true, si c'est bon et false sinon
                }
                return false;
            }
     
            /// <summary>
            /// créé une string representant la string final tel qu'elle apparaitra apres le collage
            /// </summary>
            private string CreateFinalString()
            {
                string strToCompute;
     
                //On recupere le texte actuelle de la TB et on enleve la partie en surbrillance si besoin
                string currentStr = this.Text;
                if (this.SelectionLength != 0)
                {
                    currentStr = currentStr.Remove(this.SelectionStart, this.SelectionLength);
                }
     
                //On recupere le clipboard
                string clipStr = Clipboard.GetText();
     
                //Si la zone selectionnée ou le curseur est au debut ...
                if (this.SelectionStart == 0)
                {
                    strToCompute = clipStr + currentStr;
                }
                //... a la fin
                else if (this.SelectionStart == this.Text.Length)
                {
                    strToCompute = currentStr + clipStr;
                }
                //... ou au milieu de la TB
                else
                {
                    strToCompute = 
                        currentStr.Substring(0, this.SelectionStart) 
                        + clipStr 
                        + currentStr.Substring(this.SelectionStart, currentStr.Length - this.SelectionStart);
                }
     
                return strToCompute;
            }
        }
    En gros, le principe etant de recuperer ce qu'il y a dans le clipboard, recréer la chaine finale qui devrait etre afficher dans la textbox, et la passer à ta regex (ou whatever). Bon ceci dit ici, je teste une validité globale, on pourrait simplifier la methode en ne testant que la validité de ce qu'il y a dans le presse papier.
    NON ! Au contraire, il faut tout vérifier, car admettons que ma RegEx soit vérifier par le presse papier, mais que l'ensemble ne la vérifie pas... tout à fait possible !
    J'examine ton code, car en passant par TextChanged et Undo j'aurai du me douter de la boucle infini (StackOverFlow)...

    Merci

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Bon bah alors, ca devrait correspondre, CreatFinalString te renverra la chaine tel quelle sera apres le paste, et tu pourras la mouliner dans ta RegEx. J'ai testé rapidement la reconstitution de la chaine à l'air correcte mais il faudra sans doute solidifier un peu la fonction (cas vide etc ...).

    Bon courage.

    Nota : On n'efface pas le contenu du clipboard si l'user ne le demande pas ! Heretique ! =p

  13. #13
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Citation Envoyé par SirJulio Voir le message

    Nota : On n'efface pas le contenu du clipboard si l'user ne le demande pas ! Heretique ! =p
    Oui, c'est bourin ! Par contre ça me fais penser que ce chèr utilisateur n'a pas la possibilité de faire "Ctrl+V" pour coller du texte au clavier

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Heu, si, si, WM_PASTE provient aussi bien du menu contextuel que de Ctrl + V. Pas de probleme de ce point de vue la.

  15. #15
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Heu, si, si, WM_PASTE provient aussi bien du menu contextuel que de Ctrl + V. Pas de probleme de ce point de vue la.
    Ton code fonctionne bien, j'ai juste pas compris pourquoi tu t'embête à repéré l'endroit d'insertion du "coller", puisque le else se charge de tous les cas, non ?
    Bref, j'ai commenté, et testé, ça passe !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                if (this.SelectionStart == 0)
                {
                    strToCompute = clipStr + currentStr;
                }
                //... a la fin
                else if (this.SelectionStart == this.Text.Length)
                {
                    strToCompute = currentStr + clipStr;
                }
                //... ou au milieu de la TB
    Par contre, dans mon expression régulière j'interdit l'usage des lettres, au pire encore, je n'autorise que certain caractères : numérique, point et virgule, c'est tout ! A partir de là, le Ctrl+V ne fonctionne pas (ni Ctrl+C) ni rien d'autre que ce qui est prévu !
    D'ailleur, j'ai du autorisé '\b' (retour arrière) en plus sinon même ça ne fonctionne pas !
    Voilà un bout de code de ce que je fais dans l'événement KeyPress :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                    Char lsTexte = e.KeyChar;
                    bool validMonnaie = reMonnaie.IsMatch(lsTexte.ToString());
                    bool retourArriere = (e.KeyChar == '\b') ? true : false;
                    if (!validMonnaie && !retourArriere)
                    {
                        e.Handled = true;
                    }

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Oui, c'est vrai, je sais pas pourquoi j'ai considere le debut et la fin en insertion (sans doute la frenesie codeuse ...). =p

    Pour le raccourci, rajoute un controle sur la presence du modifier Ctrl ou Alt (à tout hasard), ca te permettra d'avoir accès au raccourci, mais d'exclure les majuscules.

  17. #17
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Oui, c'est vrai, je sais pas pourquoi j'ai considere le debut et la fin en insertion (sans doute la frenesie codeuse ...). =p

    Pour le raccourci, rajoute un controle sur la presence du modifier Ctrl ou Alt (à tout hasard), ca te permettra d'avoir accès au raccourci, mais d'exclure les majuscules.
    Et hop, voila comment je me sert de ta méthode :
    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 String CreateFinalString()
            {
                StringBuilder strToCompute = new StringBuilder();
                String currentStr = this.Text;
     
                //On recupere le texte actuelle de la TB et on enleve la partie en surbrillance si besoin
                if (this.SelectionLength != 0)
                {
                    currentStr = currentStr.Remove(this.SelectionStart, this.SelectionLength);
                }
                strToCompute.Append(currentStr.Substring(0, this.SelectionStart));
                strToCompute.Append(Clipboard.GetText());
                strToCompute.Append(currentStr.Substring(this.SelectionStart, currentStr.Length - this.SelectionStart));
                return strToCompute.ToString();
            }
    Sinon j'ai identifié les caractères spéciaux :
    - Ctrl+V => 22
    - Ctrl+C => 3
    Me reste aussi le Ctrl+X ça peut servir, et après c'est bon (je vais le trouver facilement)

    Merci beaucoup !

    édit: Ctrl+X => caractère 24

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Content que ca marche et bon courage pour la suite. =)

    N'oublie pas le resolu.

  19. #19
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Il me reste un dernier bug, cela dit ce n'est pas sur l'événement Paste, c'est reperer l'endroit où à été inséré un caractère dans le TextBox, de la même manière qu'on a réussis à repérer l'endroit où coller le texte du press-papier :

    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
            private void evtKeyPress(object sender, KeyPressEventArgs e)
            {
                Regex reMonnaie = new Regex(regEx);
                // autresTouches : Ctrl+X (24), Ctrl+C (3), Ctrl+V (22)
                bool autresTouches = (e.KeyChar == '\b' || e.KeyChar == 3 || e.KeyChar == 22 || e.KeyChar == 24) ? true : false;
                if (this.SelectionLength == 0)
                //if (false)
                {
                    StringBuilder lsTexte = new StringBuilder(); // 1. au lieu de .1 => vérifier l'endroit d'insertion du caractère !
                    lsTexte.Append(this.Text);
                    lsTexte.Append(e.KeyChar);
                    
                    bool validMonnaie = reMonnaie.IsMatch(lsTexte.ToString());
                    if (!validMonnaie && !autresTouches)
                    {
                        e.Handled = true;
                    }
                }
                else
                {
    ...
    Par défaut j'ajoute toujours le caractère entré à la fin de la chaine pour construire le texte final... mais on peut très bien utiliser les flèches et ajouter un caractère au début ou au milieu du TextBox, du coup :
    Comment repérer la position d'insertion du caractère
    OU
    Comment recréé la chaine finale de la même manière que le Paste ?

    Après ça, c'est certain tout sera Ok (et résolu donc)

    édit: Après un coup de ménage ça ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            private void evtKeyPress(object sender, KeyPressEventArgs e)
            {
                // autresTouches : Ctrl+X (24), Ctrl+C (3), Ctrl+V (22)
                bool autresTouches = (e.KeyChar == '\b' || e.KeyChar == 3 || e.KeyChar == 22 || e.KeyChar == 24) ? true : false;
                Regex reMonnaie = new Regex(regEx);
                String lsTexte = CreateFinalString(e.KeyChar);
                bool validMonnaie = reMonnaie.IsMatch(lsTexte);
     
                e.Handled = (!validMonnaie && !autresTouches) ? true : false;
            }

  20. #20
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Faites comme si j'avais rien dit ! Ou si, si ça peut interresser du monde, il suffit de surcharger la méthode comme ça par exemple :

    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 String CreateFinalString(char caractere)
            {
                StringBuilder strToCompute = new StringBuilder();
                String currentStr = this.Text;
     
                //On recupere le texte actuelle de la TB et on enleve la partie en surbrillance si besoin
                if (this.SelectionLength != 0)
                {
                    currentStr = currentStr.Remove(this.SelectionStart, this.SelectionLength);
                }
                strToCompute.Append(currentStr.Substring(0, this.SelectionStart));
                strToCompute.Append(caractere);
                strToCompute.Append(currentStr.Substring(this.SelectionStart, currentStr.Length - this.SelectionStart));
                return strToCompute.ToString();
            }
    Merci encore
    Résolu !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VB NET]: Evenement sur Winform: "sur réduction"
    Par ADONET dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/02/2006, 11h52
  2. [vb.net] evenement Keypress dans un Textbox
    Par arnolem dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/10/2005, 17h15
  3. Ecouter les evenements clavier et souris
    Par init dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 24/11/2004, 20h02
  4. [VB.Net]Evenement dans un Repeater !!
    Par m-mas dans le forum ASP.NET
    Réponses: 2
    Dernier message: 24/09/2004, 17h13
  5. [VB.NET] Evenement par défaut sur controle personnalisé
    Par anthony70 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 31/08/2004, 16h19

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