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éer une liste de Controls à partir d'un fichier XML.


Sujet :

VB.NET

  1. #1
    Membre du Club
    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
    Points : 60
    Points
    60
    Par défaut Créer une liste de Controls à partir d'un fichier XML.
    Bonjour à tous.

    J'essaye de développer une application qui contiendrait des controls dans un fichier xml.
    Cette partie de l'application sert à afficher du matériel "Vierge".
    Je m'explique : c'est pour mon entreprise et on reçois des moteurs électriques, des platines électroniques etc etc.
    J'aimerais avoir des paramètres prédéfinis dans ce fichier pour pouvoir au besoin modifier ou ajouter un type de matériel, en sachant qu'une fois le type de matériel entré, je n'ai nul besoin de le modifier.
    Donc pour le type moteur j'aurais par exemple un label marque, à coté un textbox pour la marque, ensuite laben n° de serie , text box n° serie label tension entrée txtbox etc etc suivant ce shéma.

    J'ai cru comprendre qu'il etait impossible de convertir un string "TextBox" en controle TextBox. Du moins en ayant un fichier xml de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Main>
      <Mon_Controle type="Label"/>
    </Main>
    avec dans visual studio le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <XmlRoot("Main")>
    Public Class Client
        <XmlElement("Mon_Controle")>
        Public Property Controle As New Controle
    End Class
     
    Public Class Controle
        <XmlAttribute("type")>
        Public Property type As New Controls
    End Class
    J'ai donc pensé à faire plus tôt une liste avec le nom de mes labels simplement du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Main>
      <Type>
         <Moteur Marque="marque du moteur :" N°_serie="N° de serie :" etc/>
      </Type>
    </Main>
    Et de la dire qu'a chaque arguments dans l'élément moteur, je créé un label et une textbox sachant que le label.text = l'argument en question. J'ai les valeur des marques etc dans un autre fichier.

    Ce que je n'arrive donc pas à faire c'est de créer un label et un textbox pour chaque arguments :'(

    Voila si quelqu'un à une piste une aide ou autre je suis preneur merci par avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Salut,

    J'ai lut attentivement ton sujet, et je ne suis pas sur de comprendre ce que tu veux faire.

    De ce que j'ai compris:
    • Tu veux decrire les controles de ton application a partir d'xml
      => il dit qu' voit pas l'interet, mais bon c'est possible, pour cela, il faut que tu definisses les proprietes qui t'interesses, serialise/deserialize cet objet, puis instancie un controle et remplisses ses propriete avec. C'est long, sans doute inutile et couteux en perf, sans compter le debug.
    • Par contre je n'ai rien compris de ce que tu voulais faire dans la seconde partie du sujet.


    Si l'on prends juste cette phrase:
    Ce que je n'arrive donc pas à faire c'est de créer un label et un textbox pour chaque arguments :'(
    Un fois le contenu xml deserialise, il te suffirait de faire un foreach
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (Moteur item in mesarguments)
                    {
                        unLabel.Text = item.Marque;
                    }

  3. #3
    Membre du Club
    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
    Points : 60
    Points
    60
    Par défaut
    Bonjour et merci de votre réponse et d'avoir pris le temps d'essayer de comprendre mon problème.

    J'ai ce code pour lire les fichiers XML :

    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
    Function Ouverture_Fiche_Client(ByVal filename As String) As Test 'Créé la fonction lecture du fichier xml'
     
            Try 'Essaye le code suivant :'
                Using objStreamReader As New StreamReader(filename) 'Utilise le flux de données du fichier "filename"'
                    Try 'Essaye le code suivant : '
                        Return DirectCast((New XmlSerializer(GetType(Test))).Deserialize(objStreamReader), Test) 'Sérialise le fichier xml'
                    Catch ex As Exception 'Si l'essais échoue'
                        erreur = True 'Met le booléen en valeur "vrai"' 
                        MessageBox.Show("Echec de la lecture." & ex.Message) 'Affiche un message d'erreur'
                    End Try 'Fin de l'essais du code'
                End Using 'Coupe toutes ressources utilisées pour créer le flux.'
            Catch ex As Exception 'Si le fichier n'existe pas'
                erreur = True 'Met le booléen en valeur "vrai"'
                MessageBox.Show("Fichier inaccessible." & ex.Message) 'Affiche un message contenant l'erreur.'
            End Try 'Fin de l'essais du code'
            Return Nothing
     
        End Function
    Et il fonctionne très bien .

    Mon problème c'est que j'aimerais juste sauvegarder des dispositions de label et textbox dans un xml (des controls donc) pour pouvoir créer d,autres dispositions suivant les produits : si c'est un moteur ce ne sera pas les même dispositions ni les mêmes caractéristiques qu'une carte électronique que j'aurais besoin d'afficher ! (Je sais pas si c'est plus clair...)

    C'est pour ça que du coup avec un FlowLayoutPanel je pensais me démerder en donnant juste le texte à afficher dans les label du type moteur, ou du type carte élec ou autre dans mon fichier XML, et que pour chaque nom de label, ça me créé un label portant le texte de mon xml, et une textbox a coté de ce label.
    J'ai pensé au
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach elem as xélément in monxml
    flowlayoutpanel.controls.add('mon nom du nouveau label)
    'pareil pour la textbox
    next
    mais c'est pas la bonne approche visiblement.

  4. #4
    Membre actif Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 296
    Points
    296
    Par défaut
    comment créer un label?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Function Create_Label(Name As String, Text As String, Location As Point, Size As Size) As Label
            Dim mlbl As New Label
            mlbl.Name = Name
            mlbl.Text = Text
            mlbl.Location = Location
            mlbl.Size = Size
            Return mlbl
        End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FlowLayoutPanel.Controls.add(Create_Label("mon_label_0", "12345", New Point(10, 10), New Size(100, 100)))
    même chose pour n'importe quel contrôle, ce ne sont que des classes.

  5. #5
    Membre du Club
    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
    Points : 60
    Points
    60
    Par défaut
    Si je vous sors un code comme ceci, vous comprenez mieux ce que je veux faire ?

    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
    Public Class Form1
        Dim essais As New Test
        Dim lbl As New List(Of Label)
        Dim txt As New List(Of TextBox)
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
            essais = Ouverture_Fiche_Client("xmld.xml")
     
            for i as integer = 0 to essais.mar.count - 1 'compte le nombre d’attributs (ici 2) dans l'élément LBL_Marque
            lbl.add(new Label)
            txt.add(New TextBox)
            FlowLayoutPanel.control.add(lbl(i))
            FlowLayoutPanel.control.add(txt(i))
            next
          End Sub
     
    End Class
     
     
    <XmlRoot("Moteur")>
    Public Class Test
        <XmlElement("LBL_Marque")>
        Public Property mar As New marque
    End Class
     
    Public Class marque
        <XmlAttribute("Marque")>
        Public Property mark As String = "Marque_Moteur"
        <XmlAttribute("référence")>
        Public Property ref As String = "ref_Moteur"
    End Class
     
     
    End Class
    C'est un truc de ce style là que j'aimerais faire !

  6. #6
    Membre du Club
    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
    Points : 60
    Points
    60
    Par défaut
    Salut à tous.

    J'ai fini par faire comme ceci :
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    Public Class Ajouter_matériel
        Dim ComboBox As New ComboBox
        Dim Label As New List(Of Label)
        Dim TextBox As New List(Of TextBox)
     
        Private Sub Ajouter_matériel_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
            ComboBox.Visible = True
            ComboBox.DropDownStyle = ComboBoxStyle.DropDownList
     
     
            Param = Ouverture_Paramètres("Paramètres.xml")
     
            With ComboBox.Items
                .Add("Moteur Asynchrone.")
                .Add("Moteur Brushless.")
                .Add("Motoréducteur.")
                .Add("Variateur.")
                .Add("Poste à souder.")
                .Add("Découpeur Plasma.")
                .Add("Chargeur Démarreur.")
                .Add("Autre.")
            End With
     
            FlowLayoutPanel.AutoScroll = True
            FlowLayoutPanel.Dock = DockStyle.Fill
            FlowLayoutPanel.Controls.Add(ComboBox)
            FlowLayoutPanel.Visible = True
     
            AddHandler ComboBox.SelectedIndexChanged, AddressOf ComboBox_ChangeIndex
     
        End Sub
     
        Private Sub ComboBox_ChangeIndex()
     
            If ComboBox.SelectedIndex = 0 Then
                Label.Clear()
                TextBox.Clear()
                FlowLayoutPanel.Controls.Clear()
                ComboBox.Height = 40
                FlowLayoutPanel.Controls.Add(ComboBox)
     
                For i As Integer = 0 To 4
                    Label.Add(New Label)
                    TextBox.Add(New TextBox)
                    FlowLayoutPanel.Controls.Add(Label(i))
                    Label(i).Height = TextBox(i).Height
                    Label(i).Width = 150
                    Label(i).TextAlign = ContentAlignment.MiddleLeft
                    TextBox(i).Width = 200
                    FlowLayoutPanel.Controls.Add(TextBox(i))
                    FlowLayoutPanel.SetFlowBreak(TextBox(i), True)
                Next
     
                ComboBox.Height = 21
                Label(0).Text = Param.Produit.Moteur_Asynchrone.Marque
                Label(1).Text = Param.Produit.Moteur_Asynchrone.Num_Série
                Label(2).Text = Param.Produit.Moteur_Asynchrone.Tension_Entrée
                Label(3).Text = Param.Produit.Moteur_Asynchrone.Rotations_Par_Minutes
                Label(4).Text = Param.Produit.Moteur_Asynchrone.Puissance
                FlowLayoutPanel.SetFlowBreak(ComboBox, True)
                ComboBox.TabIndex = 1
     
            ElseIf ComboBox.SelectedIndex = 1 Then
     
                Label.Clear()
                TextBox.Clear()
                FlowLayoutPanel.Controls.Clear()
                ComboBox.Height = 40
                FlowLayoutPanel.Controls.Add(ComboBox)
     
                For i As Integer = 0 To 5
                    Label.Add(New Label)
                    TextBox.Add(New TextBox)
                    FlowLayoutPanel.Controls.Add(Label(i))
                    Label(i).Height = TextBox(i).Height
                    Label(i).Width = 150
                    Label(i).TextAlign = ContentAlignment.MiddleLeft
                    TextBox(i).Width = 200
                    FlowLayoutPanel.Controls.Add(TextBox(i))
                    FlowLayoutPanel.SetFlowBreak(TextBox(i), True)
                Next
     
                ComboBox.Height = 21
                Label(0).Text = Param.Produit.Moteur_Brushless.Marque
                Label(1).Text = Param.Produit.Moteur_Brushless.Num_Série
                Label(2).Text = Param.Produit.Moteur_Brushless.Tension_Entrée
                Label(3).Text = Param.Produit.Moteur_Brushless.Rotations_Par_Minutes
                Label(4).Text = Param.Produit.Moteur_Brushless.Référence_Codeur
                Label(5).Text = Param.Produit.Moteur_Brushless.Puissance
                FlowLayoutPanel.SetFlowBreak(ComboBox, True)
                ComboBox.TabIndex = 1
     
            ElseIf ComboBox.SelectedIndex = 2 Then
     
                Label.Clear()
                TextBox.Clear()
                FlowLayoutPanel.Controls.Clear()
                ComboBox.Height = 40
                FlowLayoutPanel.Controls.Add(ComboBox)
     
                For i As Integer = 0 To 7
                    Label.Add(New Label)
                    TextBox.Add(New TextBox)
                    FlowLayoutPanel.Controls.Add(Label(i))
                    Label(i).Height = TextBox(i).Height
                    Label(i).Width = 150
                    Label(i).TextAlign = ContentAlignment.MiddleLeft
                    TextBox(i).Width = 200
                    FlowLayoutPanel.Controls.Add(TextBox(i))
                    FlowLayoutPanel.SetFlowBreak(TextBox(i), True)
                Next
     
                ComboBox.Height = 21
                Label(0).Text = Param.Produit.Motoréducteur.Marque
                Label(1).Text = Param.Produit.Motoréducteur.Num_Série
                Label(2).Text = Param.Produit.Motoréducteur.Tension_Entrée
                Label(3).Text = Param.Produit.Motoréducteur.Rotations_Par_Minutes
                Label(4).Text = Param.Produit.Motoréducteur.Référence_Réducteur(0).Marque
                Label(5).Text = Param.Produit.Motoréducteur.Référence_Réducteur(0).Num_Série
                Label(6).Text = Param.Produit.Motoréducteur.Référence_Réducteur(0).Rapport_De_Réduction
                Label(7).Text = Param.Produit.Motoréducteur.Puissance
     
                FlowLayoutPanel.SetFlowBreak(ComboBox, True)
     
            End If
     
        End Sub
    End Class
    Je pense qu'il y à plus simple, surtout que là j'ai fait le code pour 3 items du combobox sur 8... Ca me parait lourd mais bon ça fonctionne.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Salut,

    Quite a avoir quelque chose qui fonctionne, tu peux mutualiser le bloc suivant:

    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
    Label.Clear()
                TextBox.Clear()
                FlowLayoutPanel.Controls.Clear()
                ComboBox.Height = 40
                FlowLayoutPanel.Controls.Add(ComboBox)
     
                For i As Integer = 0 To 7
                    Label.Add(New Label)
                    TextBox.Add(New TextBox)
                    FlowLayoutPanel.Controls.Add(Label(i))
                    Label(i).Height = TextBox(i).Height
                    Label(i).Width = 150
                    Label(i).TextAlign = ContentAlignment.MiddleLeft
                    TextBox(i).Width = 200
                    FlowLayoutPanel.Controls.Add(TextBox(i))
                    FlowLayoutPanel.SetFlowBreak(TextBox(i), True)
                Next
     
                ComboBox.Height = 21
    +> a premiere vue il n'y a que la valeur max de I qui change entre tes switch.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Et pour mutualiser le remplissage des labels:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Label(0).Text = Param.Produit.Motoréducteur.Marque
                Label(1).Text = Param.Produit.Motoréducteur.Num_Série
                Label(2).Text = Param.Produit.Motoréducteur.Tension_Entrée
                Label(3).Text = Param.Produit.Motoréducteur.Rotations_Par_Minutes
    Il y a bien des solutions, mais a mettre en place ce sera plus long qu'a coder a la main, surtout si tu n'as pas la main sur la strucure des objets.

  9. #9
    Membre du Club
    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
    Points : 60
    Points
    60
    Par défaut
    oui exact pour mutualiser j'aurais fini par le faire en me relisant je supposes ^^ et dac alors si c'est trop long et que ça peut faire je vais rester comme ça :p Merci je marque comme résolu !

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

Discussions similaires

  1. [XL-2010] Créer une liste de données à partir d'un fichier xml
    Par graphicsxp dans le forum Excel
    Réponses: 0
    Dernier message: 05/12/2012, 10h00
  2. [OL-2007] Créer une liste de distribution à partir d'un fichier Excel
    Par Flaguette dans le forum Outlook
    Réponses: 2
    Dernier message: 04/12/2012, 19h14
  3. Réponses: 0
    Dernier message: 24/08/2012, 16h59
  4. [XL-2007] Créer une liste en VBA à partir d'une pivottable
    Par yzf-r dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 06/02/2011, 20h29
  5. Créer une arborescence en XSL à partir d'un fichier XML
    Par maxou2009 dans le forum XML/XSL et SOAP
    Réponses: 23
    Dernier message: 27/09/2010, 13h35

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