Partage
  • Partager sur Facebook
  • Partager sur Twitter

[VB .NET] Interface dynamique

    10 mai 2011 à 10:16:50

    Bonjour,

    J'ai une fenêtre qui contient un certain nombre de label. Mais ce nombre change en fonction de certaines données. Je ne sais donc pas combien je dois créer de label.
    Pour cela je fais :
    For Each ... In ... 
     Dim i As Integer = 0
     tab(i) = New Label
     tab(i).Width = 433
     tab(i).Height = 32
     tab(i).Margin.Left = 180
     tab(i).Margin.Right = 40
    Next
    


    tab étant un tableau de Label.
    Le problème est que pour Margin.Left et pour Margin.Right cela ne fonctionne pas, j'ai l'erreur :
    Cette expression est une valeur et ne peut donc pas être la cible d'une assignation.
    • Partager sur Facebook
    • Partager sur Twitter
      10 mai 2011 à 11:42:49

      Bonjour,

      La propriété Margin est de type Padding, qui est une structure, par conséquent en faisant tab(i).Margin tu récupères une copie et donc la modification apportée aux membres Left et Right seront effectués sur cette copie et seront donc "perdus" à la fin de l'instruction (car la copie n'est pas assignée à une variable).
      L'éditeur sait détecter cela et le signale donc (en soit ce n'est pas une erreur, le code est tout à fait compilable et exécutable, mais ces lignes ne feront "rien" et ne devrait donc pas être là).
      Pour preuve j'ai réalisé un petit exemple, suivant la même structure (une classe Label avec une propriété Margin de type Padding(structure) qui possède une propriété Left de type Integer) sur un éditeur online (IdeOne), et j'utilise le même code que toi pour modifier le Margin.Left d'un élément d'un tableau de Label. On peut voir que le code s'exécute parfaitement et que dans la zone "output", les valeurs avant et après modification sont identiques ; voilà pour l'explication.

      Edit: Oups j'ai cliquer envoyer trop tôt :p

      Dans ton cas, le Label vient d'être créer donc tu peux très bien faire comme ceci :
      tab(i).Margin = New Padding(180, 0, 40, 0) 'modifier les 0 par les valeurs voulues pour Top et Bottom
      

      Remarque que si tu souhaitais modifier des valeurs la manière de procéder serait quasiment la même :
      Dim oldMargin As Padding = tab(0).Margin
      tab(0).Margin = new Padding(180, oldMargin.Top, 40, oldMargin.Bottom)
      


      Cordialement !
      • Partager sur Facebook
      • Partager sur Twitter
      Censément, quelqu'un de sensé est censé s'exprimer sensément.
        10 mai 2011 à 12:05:54

        Merci Sehnsucht :)

        TAB(i).Margin = New Thickness(189.5, 67.374, 9.5, 12)
        


        Cela marche aussi il me semble (j'ai trouvé juste après avoir posté ^^)

        Dim TAB(1000) As Label
        Dim i As Integer = 0
        For Each entry In ev.Entries
         EntType = entry.EntryType.ToString
         If EntType = "Error" Then
          TAB(i) = New Label
          TAB(i).Width = 433
          TAB(i).Height = 32
          If i = 0 Then
           TAB(i).Margin = New Thickness(189.5, 67.374, 9.5, 12)
          Else
           TAB(i).Margin = New Thickness(189.5, TAB(i - 1).Margin.Top + 32, 9.5,12)
          End If
          Me.LayoutRoot.Children.Add(TAB(i))
          i += 1
         End If
        


        C'est le code en entier, j'aimerai que les labels se mettent l'un après l'autre mais cela ne fonctionne pas (les labels ne se mettent pas où j'aimerai qu'ils soient pourtant le margin est bien configuré)
        • Partager sur Facebook
        • Partager sur Twitter
          10 mai 2011 à 15:21:31

          Ah, tu travailles donc avec WPF là où mon explication concernait les Windows Forms, l'avoir précisé aurait été un plus ;)
          Heureusement, comme Thickness est une structure aussi, mon explication reste valide (sauvé :D )

          Concernant le placement, j'avoue que j'ai encore très (trop) peu regardé WPF pour savoir si que je vais écrire collera aussi (donc à prendre avec des pincettes).

          La propriété Margin (entre autres) n'a une "utilité" qu'en mode design (ou affilié), je peux par exemple spécifier un margin de 50 entre deux contrôles et les placer manuellement (par code) l'un contre l'autre, bref tout ça pour signifier que c'est plutôt sur la position que tu devrais jouer plutôt que les marges/l'espacement relatif.

          Enfin ceci serait plutôt vrai en windows forms ; de ce que je sais du WPF (et j'en sais peu donc ne pas hésiter à me rectifier), il me semble possible d'avoir une source de données (ici donc le contenu des différents label) et c'est le template associé au conteneur qui déterminera comment l'afficher (ici création et rendu (dont l'espacement) des différents labels).

          Mais il vaudrait mieux attendre que quelqu'un qui connaisse mieux WPF que moi passe par là ^^

          Cordialement !
          • Partager sur Facebook
          • Partager sur Twitter
          Censément, quelqu'un de sensé est censé s'exprimer sensément.
            10 mai 2011 à 17:47:11

            Citation : Nuage31

            C'est le code en entier, j'aimerai que les labels se mettent l'un après l'autre mais cela ne fonctionne pas (les labels ne se mettent pas où j'aimerai qu'ils soient pourtant le margin est bien configuré)


            Tu te compliques la vie: ajoute tes Labels à un StackPanel plutôt qu'à une Grid et ils s'empileront tout seuls bien gentiment ;)
            • Partager sur Facebook
            • Partager sur Twitter
              11 mai 2011 à 9:22:35

              Merci à vous deux :)

              Je n'ai pour le moment toujours utilisé que des Grids, je ne connais pas trop les autres conteneurs.
              Et j'ai toujours crée une interface via le mode design. Mais là vu que je ne sais pas combien de labels il y aura je dois le faire en codant.

              Et niveau code si j'utilise un StackPanel, pour ajouter un label c'est du genre :

              Me.LayoutRoot.Children.Add(TAB(i))
              

              • Partager sur Facebook
              • Partager sur Twitter
                11 mai 2011 à 9:42:47

                Utilise une listbox dont tu modifiera le DataTemplate, ça sera de loin le plus simple !
                • Partager sur Facebook
                • Partager sur Twitter

                [VB .NET] Interface dynamique

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown