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 :

Problème de gestion événements sur tableau de controles.


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Par défaut Problème de gestion événements sur tableau de controles.
    Bonjour
    Je suis débutant en langage VB.net et j'aimerais créer une form qui permettrait de créer des fenêtres personnalisées.
    Exemple : En bas de ma form je mets une combobox, un label etc. Lors d'un clic sur un contrôle (par l'utilisateur), je veux créer un nouveau contrôle de la catégorie cliqué (new label si clic sur label1, nouvelle textbox si clic sur textbox1 etc)...

    Je m'amuse pour l'instant au déplacement et création des contrôles mais je bloques à présent sur la gestion des événements pour chaque label ou textbox créés et je ne sais pas trop comment faire.

    Voici mon code pour le moment :
    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 Form1
        Dim lbl As New List(Of TextBox)
        Dim i As Integer = 0
        Dim ok As Boolean = False
        Dim y As Boolean = False
     
        Private Sub TextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseDown
            If Windows.Forms.MouseButtons.Left Then
                ok = True
                lbl.Add(New TextBox)
                Me.Controls.Add(lbl.Item(i))
            End If
     
        End Sub
     
        Private Sub TextBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseMove
     
            If ok Then
     
                With lbl.Item(i)
                    .Visible = True
                    .Location = New System.Drawing.Point(Me.PointToClient(MousePosition))
                    .Text = "Lbl" & i
                End With
     
     
            End If
            If i >= 1 Then
     
                    y = True
     
                End If
        End Sub
     
        Private Sub TextBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseUp
            ok = False
            If y Then
                lbl(i).Location = New Point(lbl(i).Location.X, lbl(i - 1).Location.Y)
            End If
     
            i += 1
        End Sub
     
     
    End Class
    Ma question est donc Où placer le code addhandler (si j'ai bien compris c'est celui qu'il me faut), et comment l'utiliser ?

    Par avance Merci de votre précieuse aide

    P.S : J'ai changé mes labels en textbox sans changer le nom, voila pourquoi je créé une liste de lblet non pas txt, pour les plus pointilleux d'entre vous

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    ta variable i c'est une mauvais idée
    si tu veux pouvoir déplacer les controles, il faut gérer un controle sélectionné (une variable as control)
    tous les controles héritent de la classe control (je veux dire par là que tu peux ranger tout ce que tu créés dans un list(of control) plutot que de faire une list par type)

    sinon pour les évents

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim t as new textbox
    addhandler t.mousedown, adressof unemethode
    me.controls.Add(t)
    dans ta méthode, il faut mettre les paramètres comme le requiert l'évènement que tu choisis
    dans tous les cas ca commence par sender as object, mais e peut différer
    et sender contient l'instance qui a déclenché l'évènement (si tu as 3 textboxes, sender sera celui qui vient d'avoir le mousedown)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Par défaut
    Tout d'abord Merci d'avoir pris le temps de me répondre.
    Donc si je comprends bien, mon code devrait plus tôt être du style :
    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 Form1
        Dim Ctrl As New List(Of Control)
        Dim var As Integer = 0
        Dim ok As Boolean = False
        Dim y As Boolean = False
     
        Private Sub TextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseDown
            If Windows.Forms.MouseButtons.Left Then
                ok = True
                Ctrl.Add(New TextBox)
                Me.Controls.Add(Ctrl.Item(var))
            End If
     
        End Sub
     
        Private Sub TextBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseMove
     
            If ok Then
     
                With Ctrl.Item(var)
                    .Visible = True
                    .Location = New System.Drawing.Point(Me.PointToClient(MousePosition))
                    .Text = "Lbl" & var
                End With
     
     
            End If
            If var >= 1 Then
     
                    y = True
     
                End If
        End Sub
     
        Private Sub TextBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseUp
            ok = False
            If y Then
                Ctrl(var).Location = New Point(Ctrl(var).Location.X, Ctrl(var - 1).Location.Y)
            End If
     
            var += 1
        End Sub
     
     
    End Class
    Rien que ça c'est ok.
    Mais si j'ai un controle style richtextbox j'avais ce code avant de mettre "new list(of control)" j'avais un "new list(of richtextbox)" et ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With richtextbox(i)
                        .ReadOnly = True
                        .BorderStyle = BorderStyle.None
                        .BackColor = Me.BackColor
                        .Text = "Nom_Client.Feuille().Interventions(0).Opération"
                    End With
    Maintenant que c'est une liste de controles je n'ai plus richtextbox.readonly ni le border style. Comment je peux lui dire que c'est des richtextbox ou label ou autre ?

    Et pour en revenir au addhandler, si je comprends bien ça doit donner un code de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i as integer = 0 to Ctrl.count - 1
    addhandler ctrl(i).Mouseclic, adressof fonction
    next
     
    private sub fonction()
    'gère la fonction lors d'un clic souris sur controle CTRL(i)
    end sub
    un truc du style non ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    quand je disais la variable i c'est une mauvaise idée, je ne disais pas de la renommer, mais de la supprimer et de faire autrement

    quand on une instance dont on connais le type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    directcast(unctrl,richtextbox).borderstyle = ...
    si on veut tester le type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if typeof unctrl is richtextbox then
    quant au addhandler, il ne faut pas le faire plusieurs fois par controle, donc le mieux c'est au moment ou tu le créés, pas dans une boucle ailleurs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Par défaut
    Ah ok pour ça, merci.

    Pour ce qui est de ma variable i, je ne comprends pas trop ce que vous me conseillez :
    Pourquoi c'est pas "bon" ?
    Remplacer le "as integer = 0" par un "as Control" ?
    Du coup comment je pourrais savoir à quel contrôle j'en suis si je n'ai plus mon index i ?

    Peut être faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dim unControle as new list(of control)
    dim i as controle
    'code etc etc
     
    unControle.add(i)
    Mais du coup je ne connais pas sa référence ! il me faut quand même une variable pour incrémenter je me trompe?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    il faudrait préciser un peu plus ce que vous voulez faire au final
    et pourquoi voulez vous savoir où vous en etes (sachant que vous en etes à listcontrol.count - 1 ou listcontrol.last) ?

    et avez vous déjà réfléchit à l'enregistrement (en base ?) ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/12/2014, 14h16
  2. Réponses: 4
    Dernier message: 16/07/2013, 20h40
  3. Problème gestion évènement sur MicroFramework
    Par Sylvanocry dans le forum C#
    Réponses: 2
    Dernier message: 01/03/2010, 00h35
  4. Problèmes d'évènements sur ComboBox
    Par bakaneko dans le forum MFC
    Réponses: 3
    Dernier message: 23/02/2004, 09h46
  5. Réponses: 25
    Dernier message: 16/07/2003, 21h41

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