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 :

"enable" un à un, les champs suivants [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 196
    Points : 112
    Points
    112
    Par défaut "enable" un à un, les champs suivants
    Bonjour,

    Je suis novice en VB, j'ai téléchargé 2010 Express et je me fais la main...

    J'ai une forme windows avec beaucoup de case à compléter dans un ordre
    précis, je met donc un événement dans la case en cours, pour activer la case
    suivante (avec la propriété 'enable' )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub XTemp1_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles XTemp1.Validated
        XTemp2.Enabled = True
    End Sub
    Je suis persuadé qu'il y a une manière de faire mieux que de
    recopier ce code des dizaines de fois!

    Comme je ne sais pas encore passer des paramètres aux fonctions... je butte!

    Merci d'avance,
    Jacques

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Je suis aussi débutant en VB, mais j'ai peut être une solution.

    Au lieu d'utiliser les form, tu peux aussi les utiliser avec l'option Me

    Exemple, dans le le sub Main()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     if me.Xtemp1_validated = me.xtemp1._validated.validated then
    me.Xtemp2.enable = true.
    end if
    Etc..

  3. #3
    Membre régulier
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 196
    Points : 112
    Points
    112
    Par défaut
    Bonjour,

    Comme je ne souhaites pas faire de répétitions inutile,
    j'aimerais ne pas me retrouver à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub XTemp1_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles XTemp1.Validated
        XTemp2.Enabled = True
    End Sub
    Private Sub XTemp2_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles XTemp2.Validated
        XTemp3.Enabled = True
    End Sub
    ...
    Private Sub XTemp99_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles XTemp99.Validated
        XTemp100.Enabled = True
    End Sub
    ...
    ou encore
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if me.Xtemp1_validated = me.xtemp1._validated.validated then
    me.Xtemp2.enable = true.
    end if
    if me.Xtemp2_validated = me.xtemp2._validated.validated then
    me.Xtemp3.enable = true.
    end if
    ...
    if me.Xtemp99_validated = me.xtemp99._validated.validated then
    me.Xtemp100.enable = true.
    end if
    Je pensais don à quelque chose du genre:
    fonction champsSuivant(no du champs suivant)...
    "no du champs suivant".enable = true

    Jacques

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Et en boucle?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for k as integer
    k = 1
    do while not Xtem(100).enable = true
    if me.Xtemp(k)_validated = me.xtemp(k)._validated.validated then
    k = k + 1
     XTemp(k).Enabled = True
    end if
    loop

  5. #5
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Points : 855
    Points
    855
    Par défaut
    Voici une solution avec une liste (je développe rarement en VB.NET, vérifiez si j'ai pas fait d'erreur)

    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
    Public Class Form1
     
        ' list de textbox
        Dim textboxes As New List(Of TextBox)
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
            ' Au chargement de ma form, je les ajoute
            AddTextboxToArray(TextBox1)
            AddTextboxToArray(TextBox2)
            AddTextboxToArray(TextBox3)
            AddTextboxToArray(TextBox4)
            AddTextboxToArray(TextBox5)
            AddTextboxToArray(TextBox6)
            AddTextboxToArray(TextBox7)
            AddTextboxToArray(TextBox8)
        End Sub
     
        Private Sub AddTextboxToArray(textbox As Windows.Forms.TextBox)
            ' Ajout un tag
            textbox.Tag = textboxes.Count
     
            ' On se rattache à l'évenement
            AddHandler textbox.Validated, AddressOf TBValid
     
            ' On l'ajoute au tableau
            textboxes.Add(textbox)
        End Sub
     
        Private Function TBValid(sender As Object, e As EventArgs) As EventHandler
            Dim textBox = CType(sender, TextBox)
     
            ' On récupère le tag
            Dim tag = Val(textBox.Tag)
     
            ' On met enabled au prochain (si on ne dépasse pas la taille de la liste)
            If tag + 1 < textboxes.Count Then
                textboxes(tag + 1).Enabled = True
            End If
     
        End Function
     
     
    End Class
    "Phylactère temporaire" = tooltips

    Votre problème a été résolu ? Alors utilisez sur et

  6. #6
    Membre régulier
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 196
    Points : 112
    Points
    112
    Par défaut
    Bonjour,

    Le problème, c'est un fichier ini de configuration météo:

    Température: XTemp1 à 10
    Humidité: XHum1 à 10
    etc...

    Une personne peut avoir 3 capteurs de Température et 2 Humidité.
    Comme je ne veux pas que les gens entre les numéros #1 #3 #6, au lieu
    de 1,2,3... Donc au départ, tous les #1 sont 'enable' et quand une case #1
    est validée, la #2 devient 'enable' et ainsi de suite.

    Donc, je ne veux pas boucler de 1 à 100 si la personne a 3 capteurs. Les cases
    inutilisées devant rester desactivées.

    C'est pourquoi j'avais commencé à mettre dans l'événement 'Validated' de chacune
    des cases, une fonction qui nomme la prochaine case à activer... mais oufff... où??

    XTemp1_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles XTemp1.Validated

    Ahhhh les caprices de la programmation!

    Jacques

  7. #7
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Toutes les cases peuvent se servir du même événement dans lequel on récupère le control appelant via le paramètre sender, et grâce à son nom on récupère son indice que l'on incrémente pour déduire le nom du contrôle suivant et avec ce nom le control lui-même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim ctrl As Control = CType(sender, Control)
    Dim name As string = Control.Name 
    Dim nextname As string = 'Xtemp' & (int.ParseCType(sender, Control).Name.Substring('Xtemp'.Length)+1).ToString() 
    Dim nextctrl As Control = ctrl.Parent.FindControl(nextname) ;
    ctrl.Enabled = false 
    nextctrl.Enabled = true ;
    Pire qu'étanne, je n'ai jamais développé en VB.NET, donc vérifiez si j'ai pas fait d'erreur de syntaxe.


    Toutefois si il y a une centaine de "cases", il faudrait, si ce n'est pas le cas, penser à les créer dynamiquement.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Cette zone correspond à ton fichier ini. Il faudra remplacer par tes données provenant du fichier ini et adapter les boucles en fonction de la façon dont tu les géres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #Region "équivalent origine fichier ini"
        Const MaxCapteur As Integer = 10
        Enum Capteur
            Temp = 1
            Hum = 2
        End Enum
    #End Region
    Je reprend le principe des listes de TextBox

    Principe du programme
    Vu qu'il y a plusieurs liste de TextBox (liste capteur température, liste capteur d'humidité) je les cré dynamiquement. je les place dans un dictionnaire en fonction des noms des listes (temp, hum).
    Création des TextBox de façon dynamique placé dans les listes correspondantes.

    Def du dictionnaire des listes par type de capteur
    Dans le load appel des créations dynamique de listes et de TextBox (les listes en premier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Dim Dico As Dictionary(Of String, List(Of TextBox)) = New Dictionary(Of String, List(Of TextBox))
     
        Private Sub frmManipTextBox2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            CreListeTextBox()
            CreTextBox()
        End Sub
    Création dynamique des listes de TextBox par type de capteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Sub CreListeTextBox()
            Dim ltb As List(Of TextBox)
            For te As Integer = 0 To [Enum].GetNames(GetType(Capteur)).Count - 1
                ltb = New List(Of TextBox)
                Dico.Add("LTB" & [Enum].GetNames(GetType(Capteur))(te), ltb)
            Next
        End Sub
    Création dynamique des TextBox répartis par liste de capteurs
    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
        Sub CreTextBox()
            Dim Txt As TextBox
            For te As Integer = 0 To [Enum].GetNames(GetType(Capteur)).Count - 1
                If Not Capteur.IsDefined(GetType(Capteur), te + 1) Then Exit Sub
                For i As Integer = 1 To MaxCapteur
                    Txt = New TextBox()
                    Txt.Name = "TB" & [Enum].GetNames(GetType(Capteur))(te) & i.ToString
                    Txt.Top = i * 25
                    Txt.Left = 20 + (100 * te)
                    Txt.Width = 80
                    Txt.Tag = i.ToString
                    If i > 1 Then Txt.Enabled = False
                    AddHandler Txt.Validated, AddressOf TBValidated
                    Me.Controls.Add(Txt)
                    Dico("LTB" & [Enum].GetNames(GetType(Capteur))(te)).Add(Txt)
                Next
            Next
        End Sub
    Sur l'évènement Validated : autorisation de la saisie sur le TextBox suivant (pour le même type de capteur) et positionnement du curseur pour l'utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Sub TBValidated(ByVal sender As Object, ByVal e As EventArgs)
            Dim tb As TextBox = DirectCast(sender, TextBox)
            Dim Pos As Integer = Integer.Parse(tb.Tag)
            For te As Integer = 0 To [Enum].GetNames(GetType(Capteur)).Count - 1
                If tb.Name.Contains("TB" & [Enum].GetNames(GetType(Capteur))(te)) And Pos < MaxCapteur And Dico("LTB" & [Enum].GetNames(GetType(Capteur))(te)).ElementAt(Pos - 1).Text <> "" Then
                    Dico("LTB" & [Enum].GetNames(GetType(Capteur))(te)).ElementAt(Pos).Enabled = True
                    Dico("LTB" & [Enum].GetNames(GetType(Capteur))(te)).ElementAt(Pos).Focus()
                    Exit Sub
                End If
            Next
        End Sub
    Pour info le programme complet (ma fenêtre s'appele frmManipTextBox2)
    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
    Public Class frmManipTextBox2
     
    #Region "équivalent origine fichier ini"
        Const MaxCapteur As Integer = 10
        Enum Capteur
            Temp = 1
            Hum = 2
        End Enum
    #End Region
     
        Dim Dico As Dictionary(Of String, List(Of TextBox)) = New Dictionary(Of String, List(Of TextBox))
     
        Private Sub frmManipTextBox2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            CreListeTextBox()
            CreTextBox()
        End Sub
     
        Sub CreListeTextBox()
            Dim ltb As List(Of TextBox)
            For te As Integer = 0 To [Enum].GetNames(GetType(Capteur)).Count - 1
                ltb = New List(Of TextBox)
                Dico.Add("LTB" & [Enum].GetNames(GetType(Capteur))(te), ltb)
            Next
        End Sub
     
        Sub CreTextBox()
            Dim Txt As TextBox
            For te As Integer = 0 To [Enum].GetNames(GetType(Capteur)).Count - 1
                If Not Capteur.IsDefined(GetType(Capteur), te + 1) Then Exit Sub
                For i As Integer = 1 To MaxCapteur
                    Txt = New TextBox()
                    Txt.Name = "TB" & [Enum].GetNames(GetType(Capteur))(te) & i.ToString
                    Txt.Top = i * 25
                    Txt.Left = 20 + (100 * te)
                    Txt.Width = 80
                    Txt.Tag = i.ToString
                    If i > 1 Then Txt.Enabled = False
                    AddHandler Txt.Validated, AddressOf TBValidated
                    Me.Controls.Add(Txt)
                    Dico("LTB" & [Enum].GetNames(GetType(Capteur))(te)).Add(Txt)
                Next
            Next
        End Sub
     
        Private Sub TBValidated(ByVal sender As Object, ByVal e As EventArgs)
            Dim tb As TextBox = DirectCast(sender, TextBox)
            Dim Pos As Integer = Integer.Parse(tb.Tag)
            For te As Integer = 0 To [Enum].GetNames(GetType(Capteur)).Count - 1
                If tb.Name.Contains("TB" & [Enum].GetNames(GetType(Capteur))(te)) And Pos < MaxCapteur And Dico("LTB" & [Enum].GetNames(GetType(Capteur))(te)).ElementAt(Pos - 1).Text <> "" Then
                    Dico("LTB" & [Enum].GetNames(GetType(Capteur))(te)).ElementAt(Pos).Enabled = True
                    Dico("LTB" & [Enum].GetNames(GetType(Capteur))(te)).ElementAt(Pos).Focus()
                    Exit Sub
                End If
            Next
        End Sub
     
    End Class
    A+,Hervé
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  9. #9
    Membre régulier
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 196
    Points : 112
    Points
    112
    Par défaut
    ...Merci Hervé

    ça marche Super!

    Jacques

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/11/2014, 01h38

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