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

VB.NET Discussion :

vb.net - TextBox personnalisé


Sujet :

VB.NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut vb.net - TextBox personnalisé
    Bonjour,

    J'ai fait un composant TextBox qui n'a comme fonction que de filtrer les caractères :

    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
    Public Class MyTxtBx
     
        Public Shared boolchar As Boolean
     
        ' Détection Caractères Spéciaux
        Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
            If (e.KeyChar < ChrW(65) Or (e.KeyChar > ChrW(90) And e.KeyChar < ChrW(97)) Or e.KeyChar > ChrW(122)) _
        And e.KeyChar <> ChrW(8) And e.KeyChar <> ChrW(32) Then boolchar = True
        End Sub
     
        ' Suppression Caractères Spéciaux
        Private Sub NameTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
            If boolchar Then
                boolchar = False
                TextBox1.Text = Mid(TextBox1.Text, 1, Len(TextBox1.Text) - 1)
                TextBox1.SelectionStart = TextBox1.Text.Length
            End If
        End Sub
    End Class

    En parallèle de ce mécanisme générique, je voudrais qu'une TextBox "Ploum" créée avec ce composant ait également un événement "TextChanged" qui lui soit propre (et qui ne s'oppose pas au premier TextChanges générique) : activer un Bouton si TextBox.Text<>"" par exemple.

    Le problème c'est qu'il y a conflit entre le premier et le second gestionnaire... l'un prend l'ascendant sur l'autre et c'est assez variable...


    J'espère avoir été clair.
    Merci de votre aide

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    textchanged n'est déclenché que quand le texte change !

    je ne vois en quoi ca t'embete de mettre un nom différent pour ton évènement perso

    mais bon si tu veux quand même qu'il ai le meme nom et que ca soit que toi qui le déclenche, tu overrides OnTextChanged et tu fais ton raiseevent sans appeler la sub de mybase
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Bonjour et merci pour ta réponse.
    Je ne sais pas si je me suis fais comprendre... Je reformule.

    Le composant personnalisé MyTxtBx que j'ai créé possède comme tu l'as vu un événement TextChanged générique. Ainsi tous les TextBoxes que je crée à partir de ce composant filtrent les caractères.
    Jusque là, ok.

    Mais un des textBox créé à partir de ce composant doit utiliser, en plus de cet événement TextChanged commun, un événement TextChanged qui lui est propre... qu'il ne doit pas partager avec les autres TextBoxes.

    Comment dois-je faire ?
    Je n'ai aucun a priori sur la solution... celle que j'ai tentée ne fonctionne pas...

    Merci beaucoup.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    dans le code que tu nous mets, je ne vois ni inherits, ni event


    si tu veux que certains textbox fonctionnent différement, il faut rajouter une propriété qui permet de choisir le type de fonctionnement, et au moment de lancer l'evenement, tu testes la valeur de cette propriété
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    dans le code que tu nous mets, je ne vois ni inherits, ni event
    Je mets ca dans le code auto généré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Partial Class MyTxtBx
        Inherits System.Windows.Forms.TextBox
    
        'UserControl overrides dispose to clean up the component list.
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    ...
    ...
    Ce qui génère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
    à la fin du code auto généré.

    si tu veux que certains textbox fonctionnent différement, il faut rajouter une propriété qui permet de choisir le type de fonctionnement, et au moment de lancer l'evenement, tu testes la valeur de cette propriété
    Le problème c'est que dans le code de la class MyTxtBx, lorsque j'intercepte l'événement TextChanged d'une TextBox nommée "Lambda" le sender est "TextBox1"... le nom du composant utilisé pour dériver MON composant.

    Si dans la form où j'utilise une instance de mon composant, je fais un gestionnaire d'événement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Lambda_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Lambda.TextChanged
     
    ...
    ...
    End Sub
    Cet événement n'est jamais levé...


  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    dans le code que tu mets, il y a des choses qui viennent de usercontrol, alors que tu hérites de textbox

    donc y a un truc qui cloche dans ce que tu as fais

    si tu hérite de textbox, i y a pas de partial class, pas de dispose ...
    alors qu'en héritant de usercontrol, en effet, le textbox qui est posé sur le usercontrol garde son nom, qui n'a rien à voir avec le nom du textbox qui est sur lui

    pour faire un textbox modifié il n'y a pas besoin de faire un usercontrol
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Cool...
    Alors remontons à la base : comment on fait pour créer un textbox personnalisé ?
    Merci bien.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    il faut faire "ajouter une classe"

    tu te retrouves avec juste marqué public class machin end class

    et tu marques inherits system.windows.forms.textbox

    tu compiles et tu peux avoir ton textbox dans la boite à outils

    ensuite tu rajoutes les quelques lignes de codes dont tu as besoin



    NB :
    dans un inherits, il ne faut s'abonner aux évènements, via handles, à la place il faut surcharger (quand cela est possible) la méthode qui raise l'event
    par exemple pour mettre du code dans le keypress du textbox personnalisé, il faut faire un override de onkeypress
    libre à toi ensuite de laisser ou non l'appel à mybase.keypress pour faire le traitement d'origine de cette sub
    libre à toi aussi de raiser quand meme l'event via raiseevent
    NB2 :
    quand on créé une form, on inherits de form, donc là aussi en théorie il est mieux de faire des overrides plutot que du handles
    NB3 :
    reflector permet de connaitre le code du framework !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Super.
    Je vais tenter ca ce soir.
    Merci pour ta patience.

    Alexandre

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Tout simplement parfait !
    Un grand merci et une ultime question : où mets-je les propriétés de mon textbox (font,autocompletemode,borderstyle...)

    Encore merci.
    Alexandre

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    je ne comprends pas trop ta question

    en marquant inherits textbox, tu hérites de tous les membres* du textbox d'origine (qui lui aussi hérite d'un autre control au passage)

    donc les propriétés existent dejà, elles sont autonomes
    tu peux les remplacer par d'autres avec le même nom en inhibant le code de celles d'origine (ou non)
    et si tu veux en rajouter, tu en ajoutes
    pour en supprimer, c'est pas évident, on peut les masquer mais c'est pas très propre comme code

    *:
    une propriété est un membre, une variable aussi, une sub, un évènement etc...


    NB:
    me désigne l'instance de la classe dans laquelle le code s'execute
    sur une fenetre, me désigne la fenetre
    dans la classe de ton textbox hérité, me représente le textbox
    donc tu peux utiliser me.text, me.font, etc...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    En fait par exmple, par défaut, la police de l'objet TextBox est "Microsoft sans serif ,8.25" et je voudrais de l'arial 9...
    Je voudrais donc le spécifier dans mon textbox customisé ...

    Did I make myself clear ?

    Merci.

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    ah

    dans le sub new

    le sub new est ce qu'on appelle le constructeur de classe
    il est implicite, on peut aussi l'écrire et y rajouter des choses

    quand tu poses un textbox sur une form, le new est appelé
    de la même manière que pour en créée un pendant l'exécution, tu peux faire
    dim t as new textbox


    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public classe mytxtbox
        inherits textbox
     
        public sub new()
            me.font = machin
        end sub
    end class
    si tu veux que la font soit fixe (qu'elle ne puisse pas etre modifiée) il faut remplacer le code de la propriété par celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private _font_forcee as font = ...
    public overrides property font()
        get
            return _font_forcee
        end get
        set
            'rien du coup, on retourne toujours la même
        end set
    end property


    NB :
    il est possible de faire des sub new qui accepte des paramètres, comme toutes les autres sub
    (sur certaines classes, ca permet aussi de rendre le sub new normal privé, afin qu'un sub new public avec paramètre soit le seul à être appelé)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    C'est tellement cool de voir du beau code comme ca... mes codes sont tellement pourris...
    J'espère qu'un jour je saurai coder comme ca.

    Merci, merci... mille fois merci.
    Alexandre

  15. #15
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    ca vient avec le temps
    plus on connait le framework et ce qu'on peut faire avec plus on code mieux
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    J'ai une question complémentaire : comment faire une bordure personnalisée ?
    Je pose cette question car TextBox n'a pas d'événement Paint...
    J'ai des images (8 images, une pour chaque bord et une pour chaque coin) et le voudrais les appliquer...

    Merci bien.

  17. #17
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    le textbox (comme tous les controles) héritent de la classe control, qui possède un evenement paint, donc le textbox l'a aussi

    de plus comme je disais, en inherits il faut faire de l'overrides plutot que du handles

    donc il doit possible de rajouter des bordures après le mybase.onpaint()

    il y a aussi des fonctions de dessins de bordures intégrées dans le framework
    dans system.windows.forms.controlpaint
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Hello,

    Sperot, c'est bien ce que j'ai fait, dans le code de mon composant j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(e)
            e.Graphics.DrawImage(PicTtest, Me.Bounds.X, Me.Bounds.Y)
        End Sub
    et l'événement n'est pas levé...

    Merci.

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    j'avais entendu parlé que le textbox était un peu différent, du fait du curseur entre autre
    et en effet onpaint n'est pas utilisé
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. [VB.net] TextBox dans Repeater
    Par TekP@f dans le forum ASP.NET
    Réponses: 2
    Dernier message: 06/05/2005, 13h38
  2. Réponses: 6
    Dernier message: 02/05/2005, 14h00
  3. [vb.net][textbox] Avoir un value field et un display field
    Par graphicsxp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/04/2005, 17h59
  4. [VB.NET] Textbox -> seulement des chiffres sans API?
    Par Pleymo dans le forum Windows Forms
    Réponses: 10
    Dernier message: 25/04/2005, 14h00
  5. [VB.NET] Contrôle personnalisé dans une dll personnalisée
    Par c3b12 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/10/2004, 07h56

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