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 :

Création de contrôles automatisée


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut Création de contrôles automatisée
    Bonjour,

    Je suis souvent en train de fouiller le forum pour avoir de l'aide mais cette fois-ci je ne trouve rien.

    Je suis actuellement en stage et je dois créer un logiciel en VB.NET permettant de bloquer/débloquer des postes clients depuis un poste serveur.

    Mon problème est pour l'affichage des contrôles sur la partie serveur, je m'explique :

    Il y a au maximum 20 postes représentés par 20 GroupBox divisés en deux onglets (10 GroupBox dans un onglet et 10 dans l'autre)
    Dans chaque GroupBox il y a le nom du poste (en Label) et son état (en icône via une PictureBox) qui sont récupérés de la base de données.
    Il y a aussi deux boutons ( Bloquer et Débloquer ) ainsi qu'un compteur qui démarre quand on débloque et s'arrete quand on bloque. Enfin il y a un label Prix qui calcule le prix selon le temps qui défile.

    J'espère que vous suivez toujours. Tous ces contrôles sont répétés dans 20 GroupBox. Par exemple :
    - dans la GroupBox1 il y a : nomposte1, compteur1, boutonbloquer1, prix1, ...
    - dans la GroupBox2 il y a : nomposte2, compteur2, boutonbloquer2, prix2 ...
    - dans la GroupBox3 il y a : nomposte3, compteur3, boutonbloquer3, prix3 ...
    - et ainsi de suite jusqu'à 20.

    Vous serez d'accord avec moi que ce n'est pas pratique du tout d'autant plus que les traitements (requêtes SQL, rendre visible/invisible les boutons, calcul du prix, ... ) sont les mêmes à 20 reprises.

    Une boucle parait pour moi idéale mais je ne sais pas du tout comment boucler tout sa ...

    En espérant que vous avez compris merci d'avance pour votre aide.

    Si vous avez besoin de plus d'explications, n'hésitez pas

  2. #2
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Bonjour,

    Lorsque tu fais du .net, tout est objet.

    Que tu utilises le designer pour ajouter des controles ou que tu le fasses directement dans le code, le résultat sera le même.

    Après, si tu n'est pas en WPF, tu ne pourras pas profiter des mécanismes automatiques (templating de controle) pour simplifier le code,

    donc oui, tu vas devoir boucler et positionner les controles à la main (ca se fait bien)

    Pour t'aider :
    1 Ajoute un modèle de controle dans une fake app,
    2 regarde le code généré pour positionner ces controles,
    3 potasse la msdn pour comprendre les propriétés utilisées,

    reproduit le meme modèle, mais en maitrisant les coordonnées des controles.
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut
    Bonjour et bienvenu parmis nous

    Tu peux tres bien faire une methode qui soit utilisable par tous les composants.

    Je m'explique

    Tu as 20 groupbox avec 2 boutons chacunes, tu créé une sub button1_Click et tu fais en sorte que tous les boutons1 pointent vers cette sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub btn_bloquer_Click(Byval sender as Object, Byval e as EventArgs) Handles me.groupbox1.btn_bloquer.Click, me.groupbox2.btn_bloquer.Click
     
    'En fonction du sender tu peux retrouver le parent et donc cibler quel bouton est utilisé
     
    End Sub
    Sinon tu peux utiliser le WPF et faire une sub comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private sub btn_bloquer_Click(Byval sender as Object, Byval e as routedeventargs)
    ...Ton traitement
    End Sub
    Et tu fais pointer chaque bouton "bloquer" vers cette sub depuis le code XAML. Et si tu dois ajouter d'autres postes, et donc d'autres groupbox avec d'autre boutons, t'as juste a refaire pointer vers le sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Content="Bloquer" FontSize="14" Margin="522,6,348,6" Name="btn_bloquer" Click="btn_bloquer_Click" />
    Si tu as des questions n'hesite pas

    Nasty

  4. #4
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Tu crées ton interface dynamiquement pour un groupbox, puis tu boucles sur le nombre de postes / 2, et tu fais deux fois l'opération en en mettant la moitié dans un onglet l'autre moitié dans un autre onglet.

    Ca donnerais un truc du genre :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Dim Mytable As New TabControl
            Dim onglet1, onglet2 As New TabPage
            Me.Controls.Add(Mytable)
     
            Mytable.Controls.Add(onglet1)
            Mytable.Controls.Add(onglet2)
     
     
            For i = 0 To 10
     
                Dim Grpbox As GroupBox
                Dim tonlabel As Label
                Dim tonicone As PictureBox
                Dim Tonbouton1 As Button
                Dim Tonbouton2 As Button
     
                Grpbox = New GroupBox
                Grpbox.Name = "GroupBox" & i
                onglet1.Controls.Add(Grpbox)
     
                tonlabel = New Label
                tonlabel.Name = "Label" & i
     
                tonicone = New PictureBox
                tonicone.Name = "PictureBox" & i
     
                Tonbouton1 = New Button
                Tonbouton1.Name = "Btblock" & 2 * i
     
                Tonbouton2 = New Button
                Tonbouton2.Name = "Btdeblock" & 2 * i + 1
     
                Grpbox.Controls.Add(tonlabel)
                Grpbox.Controls.Add(tonicone)
                Grpbox.Controls.Add(Tonbouton1)
                Grpbox.Controls.Add(Tonbouton2)
     
                AddHandler Tonbouton1.Click, AddressOf boutonblock
                AddHandler Tonbouton2.Click, AddressOf boutondeblock
     
            Next i
     
            For i = 0 To 9
     
                Dim Grpbox As GroupBox
                Dim tonlabel As Label
                Dim tonicone As PictureBox
                Dim Tonbouton1 As Button
                Dim Tonbouton2 As Button
     
                Grpbox = New GroupBox
                Grpbox.Name = "GroupBox" & i + 10
                onglet2.Controls.Add(Grpbox)
     
                tonlabel = New Label
                tonlabel.Name = "Label" & i + 10
     
                tonicone = New PictureBox
                tonicone.Name = "PictureBox" & i + 10
     
                Tonbouton1 = New Button
                Tonbouton1.Name = "Button" & 2 * i + 10
     
                Tonbouton2 = New Button
                Tonbouton2.Name = "Button" & 2 * i + 1 + 10
     
                Grpbox.Controls.Add(tonlabel)
                Grpbox.Controls.Add(tonicone)
                Grpbox.Controls.Add(Tonbouton1)
                Grpbox.Controls.Add(Tonbouton2)
     
                AddHandler Tonbouton1.Click, AddressOf boutonblock
                AddHandler Tonbouton2.Click, AddressOf boutondeblock
     
            Next
     
            'apres taille et position pour chaque composant à toi de le faire

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut
    Merci pour vos réponses
    Je ne peux par contre pas faire de WPF

    @nasty : Ton idée de créer une seule Sub pour chaque bouton me permet uniquement de regrouper. Chaque bouton bloquer ( pour garder cet exemple ) arrêtera son compteur : bloquer1 arrête compteur1, bloquer2 arrête compteur2, ... Donc les traitements sont les mêmes.

    @benji_dv : la création à la main est faite et ce n'est pas la le problème. Le problème est pour les traitements répétitifs.

    Voila le code pour la GroupBox1 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    'Requete SQL1
            Mycommand1.CommandText = "SELECT * FROM poste WHERE num_poste = 1;"
     
            'Déclaration du Reader1
            Dim myReader1 As OleDbDataReader = Mycommand1.ExecuteReader()
     
            myReader1.Read()
     
            Label1.Text = myReader1.GetString(1)
     
            If myReader1.GetString(1) = "-" Then
                bouton_stop1.Visible = False
            End If
     
            If myReader1.GetValue(5) = 1 Then
                GroupBox1.Enabled = True
            End If
     
            If myReader1.GetValue(5) = 1 And myReader1.GetString(3) = "libre" Then
                PictureBox1.ImageLocation = "libre_55_37.png"
            ElseIf myReader1.GetValue(5) = 1 And myReader1.GetString(3) = "occupe" Then
                PictureBox1.ImageLocation = "occupe_55_37.png"
            ElseIf myReader1.GetString(3) = "down" And myReader1.GetString(1) <> "-" Then
                PictureBox1.ImageLocation = "down_55_37.png"
            End If
     
            If myReader1.GetString(3) = "libre" Then
                bouton_stop1.Visible = False
                bouton_norm1.Visible = True
                bouton_imprim1.Visible = True
            Else
                bouton_stop1.Visible = True
                bouton_norm1.Visible = False
                bouton_imprim1.Visible = False
            End If
     
            'Fermeture du reader
            myReader1.Close()
    Ce code est copier/coller à 20 reprises seul le nom des contrôles change : myReader1, bouton_stop1, ...

    L'idéal serait de faire un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim i As Integer = 1
     
    While i < 20
     
    Mycommand(i).CommandText = "SELECT * FROM poste WHERE num_poste = " & i & ";"
     
    Dim myReader(i) As OleDbDataReader = Mycommand(i).ExecuteReader()
     
    myReader(i).Read()
     
    ...

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Pour la présentation dynamique de tes postes je regarderais plutot du coté de l'objet DataRepeater.

    En effet tu designs un groupe de contrôle pour un enregistrement sur ta source de donnée et le DataRepeater recopie automatiquement le groupe pour chaque enregistrement de la source.

    Concernant les fonctions sur ces enregistrement, il suffit d'utiliser dans une fonction unique qui utilise les objet passer en paramètre de l'évenement (Pour un clic sur un bouton utiliser Sender plutot que Me.UnNomDeBouton)

    Je tiens quand même à préciser que je débute en vb.net, codant à la base plutot avec Access, et que je n'ai encore jamais utiliser le DataRepeater sous vb.net (et je l'ai chercher un bout de temps ce truc). Il s'agit donc plus d'une piste de réflexion pour trouver ta solution.

    Concernant la navigation dans le DataRepeater (20 grosses lignes l'une en dessous de l'autre c'est pas forcement userfriendly). Tu peux filtrer la source de donnée en fonction d'un champ de recherche.

  7. #7
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Pour la répétition, je ne vois pas ou est le problème :

    Tu crée un user control, qui présente ce qui sera répété par poste,

    Ensuite, tu boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for( int i=0; ..... )
    {
    monControle = new MonControle(infoPoste) // ou infoPoste est un objet qui encapsule les information d'un poste,
     
    monControle.Position = new Point(0,y) // tu gère l''évolution de y
    y = y + monControle.Height + 5;
     
    MesGroupBox[i].Controls.Add(monControle);
     
    }
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut
    Merci pour vos réponses mais j'ai trouvé un moyen idéal :

    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
     For i = 1 To 10
                'Requete SQL
                Mycommand.CommandText = "SELECT * FROM poste WHERE num_poste = " & i & ";"
     
                'Déclaration du Reader
                Dim myReader As OleDbDataReader = Mycommand.ExecuteReader()
     
                myReader.Read()
     
                TabPage1.Controls("Label" & i.ToString).Text = myReader.GetString(1)
     
                If myReader.GetString(1) = "-" Then
                    TabPage1.Controls("bouton_stop" & i.ToString).Visible = False
                    TabPage1.Controls("bouton_norm" & i.ToString).Visible = False
     
    ...
    Il reste cependant un problème : celui des PictureBox.

    Impossible d'utiliser le même principe pour les PictureBox (qui selon MSDN ne fait pas partie des contrôles).

  9. #9
    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
    lu en diagonale

    m'enfin un usercontrol autonome (qui fait ses requetes lui meme) + une requete de départ qui va chercher les infos et créé les x usercontrols en leur donnant leurs paramètres

    (ceux qui créé l'équivalent d'un usercontrol par code avec des .controls.add ont fait trop de wpf/datatemplate )
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/12/2007, 15h48
  2. automatisation de la création de contrôle
    Par pikafafe dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/04/2007, 22h09
  3. [VB.NET] - Création de contrôle dynamique
    Par DeFCrew dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/09/2006, 16h18
  4. Création non contrôlée de lignes vides dans une Hash
    Par Ashish_Kebab dans le forum Langage
    Réponses: 1
    Dernier message: 02/04/2006, 19h03
  5. Création de contrôle comme ceux d'Access
    Par Mayhem dans le forum IHM
    Réponses: 11
    Dernier message: 27/12/2005, 03h20

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