Contrôle

Résolu
Parseq84 Messages postés 4 Date d'inscription mardi 13 mai 2014 Statut Membre Dernière intervention 15 mai 2014 - Modifié par Whismeril le 13/05/2014 à 11:56
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 15 mai 2014 à 22:47
Bonjour à tous,
Comme le titre l'évoque je crée un contrôle personnalisé (appelle Button_Text) pour une application destinée à une école maternelle (celle-ci servira à faire l'appel).
Le contrôle est compose par un Button et une Textbox (a la place du texte du Button).
J'ai déjà crée le contrôle et celui-ci à été ajouté à la bibliothèque, mais quand je veux déclencher l'événement KeyDown du contrôle personnalisé (Button_Text) ceci ne fonctionne pas.
Et de plus en double-cliquant sur le Button_Text un événement Load est affiché au lieu d'un double-clique (dans le Form du code).
Merci à tous pour votre aide.

Voici le code du Button_Text :

 Imports System.Drawing
 
Public Class Button_Text
 
      Property BText() As String
        Get
            Return TextBox1.Text
        End Get
        Set(value As String)
            TextBox1.Text = value
        End Set
    End Property
 
    Public Overrides Property BackColor As Drawing.Color
        Get
            Return Button1.BackColor
        End Get
        Set(value As Drawing.Color)
            Button1.BackColor = value
            Button1.FlatAppearance.BorderColor = value
            Button1.FlatAppearance.MouseOverBackColor = value
            Button1.FlatAppearance.MouseDownBackColor = value
            TextBox1.BackColor = value
        End Set
    End Property
 
    Private Sub Button_text_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged
        TextBox1.AutoSize = True
        TextBox1.Font = New System.Drawing.Font("Microsoft Sans Serif", Button1.Size.Height / 6)
        TextBox1.Location = New Point(0, (Button1.Size.Height / 2) - (TextBox1.Size.Height / 2))
        TextBox1.Width = Button1.Size.Width
    End Sub
 
    Public Overrides Property BackgroundImageLayout As Windows.Forms.ImageLayout
        Get
            Return Button1.BackgroundImageLayout
        End Get
        Set(value As Windows.Forms.ImageLayout)
            Button1.BackgroundImageLayout = value
        End Set
    End Property
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox1.Text = Nothing
        TextBox1.Visible = True
        TextBox1.Focus()
        Button1.BackgroundImage = Nothing
    End Sub
 
    Private Sub TextBox1_Click(sender As Object, e As EventArgs) Handles TextBox1.Click
        TextBox1.Text = Nothing
        TextBox1.Visible = True
        Button1.BackgroundImage = Nothing
    End Sub
 
End Class

7 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
13 mai 2014 à 11:50
Bonjour

Et de plus en double-cliquant sur le Button_Text un événement Load est affiché au lieu d'un double-clique (dans le Form du code).


C'est normal, tu as crée un contrôle personnalisé, et l'évenement par défaut de ce type de controle est Load.
Si tu veux coder le comportement d'un autre évênement d'une instance de ce controle, regarde dans la fenêtre propriété, clique sur le petit éclair et la liste de évênements disponibles apparaitra.

Attention, il s'agit des évênements du controle, pas ceux des composants de ce controle.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
Modifié par Whismeril le 13/05/2014 à 11:51
Ha et puis ton code, ça n'est pas du C#, on dirait du VB.Net, je déplace
0
Parseq84 Messages postés 4 Date d'inscription mardi 13 mai 2014 Statut Membre Dernière intervention 15 mai 2014
13 mai 2014 à 14:02
Tout d'abord merci pour ta réponse et je suis désolé d'avoir posté au mauvais endroit.
Effectivement j'avais déjà essaie de gérer les événements du contrôle (click et autres) mais sans aucun effet.
Par exemple, pour mon apppli je voudrais détecter l'appui d'une touche clavier pour vérifier le texte (de la Textbox) et aussi l'appui de la touche entrée du clavier (pour valider le texte).
Pour ça j'aurais besoin de détecter le Key_Down de la TextBox qui compose mon contrôle (Button_Text) quand celui-ci a le focus.

Exemple de code :

Private Sub Button_Text1_KeyDown(sender As Object, e As KeyEventArgs) Handles Button_Text1.KeyDown
If e.KeyCode = Keys.Return Then
'code à exécuter
End If
End Sub

Mais ce bout de code ne donne rien, quand je clique sur le Button_Text1 celui-ci prend le focus et si j'appuie sur entrée le code ne s'exécute pas.

Merci
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
Modifié par Whismeril le 13/05/2014 à 14:21
C'est normal, quand tu écrit dans le textbox, c'est son événement keyDown, dans le code du controle perso qui est appellé.
Il faut que tu crées un événement perso, à ton contrôle perso, qui est activé par le keyDonw du textbox et qui en reprend les arguments.
Tu dois même pouvoir réutiliser (avec un override) le Key Down du contrôle.
Le truc c'est que je ne sais pas faire ça en VB.Net.
Jette un oeuil ici.

Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
0
Parseq84 Messages postés 4 Date d'inscription mardi 13 mai 2014 Statut Membre Dernière intervention 15 mai 2014
13 mai 2014 à 14:50
Merci, je vais bouquiner !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
13 mai 2014 à 22:06
Bonsoir,

j'ai écrit un bout de code en C#, que j'ai passé au traducteur.
Mon usercontrole est un usercontrol sur lequel est placé un bouton.
Je veux que l'événement Click de mon contrôle soit celui du bouton.
	<DefaultEvent("Click")>'déclare que pour cette classe l'évenement par défaut est click
    Partial Public Class uscTest
        Inherits UserControl
        Public Sub New()
            InitializeComponent()
        End Sub


        Public Delegate Sub MonClick(ByVal sender As Object, ByVal e As EventArgs) 'crée le délégué pour l'évenement perso

        Public Shadows Event Click As MonClick 'declare l'évenement, Shadows semble être le mot clé pour ecraser le Click existant


        Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button1.Click
            RaiseEvent Click(Me, e) 'génère l'evenement, le sender est le controle personnalisé et e est celui du bouton
        End Sub

    End Class


Si tu mets ce control sur une Form, quand tu double cliques dessus, c'est la méthode associée à l'événement Click qui est affichée dans l'éditeur.
Cette méthode n'est appelée que si on clique sur le bouton.
0
Parseq84 Messages postés 4 Date d'inscription mardi 13 mai 2014 Statut Membre Dernière intervention 15 mai 2014
Modifié par Parseq84 le 15/05/2014 à 22:46
MERCI
Bonsoir Whismeril,
D'abord excuse-moi pour la réponse très tardive.
J'ai réussi à gérer l'évènement Click directement dans mon contrôle, pour ça j'avais juste besoin de donner le focus a la TextBox, peu importe si on cliquait sur le Button ou sur la TextBox même.
En ce qui concerne le KeyDown (chose plus importante pour moi) j'ai suivi ton code.
J'ai créé le délégué pour l'évènement perso

Public Delegate Sub BKeyDown(ByVal sender As Object, ByVal e As EventArgs)
Ensuite j'ai remplacé le KeyDown existant

Public Shadows Event KeyDown As BKeyDown
Et pour finir j'ai géré l'évènement KeyDown de la TextBox

Private Sub TextBox1_KeyDown(sender As Object, e As EventArgs) Handles TextBox1.KeyDown
RaiseEvent KeyDown(Me, e)
End Sub
Et comme par miracle tout fonctionne.
Merci encore pour ta précieuse aide.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
15 mai 2014 à 22:47
De rien
0
Rejoignez-nous