none
Ordre des objets dans un formulaire RRS feed

  • Question

  • Bonjour à tous,

    J’ai un petit problème dans un formulaire.

    J’ai différents objets sur ce formulare et 12 combobox. En VB6 je pouvais les indexer, mais cette fonction a été abolie (je me demande pourquoi) en VB-NET.

    J’ai écrit la procédure suiante :

     

        Private Sub FindCombo(ByVal frmForm As Form)

            Dim ctlControl As Object

            Dim lsInd as string =  "*"

            On Error Resume Next

            For Each ctlControl In frmForm.Controls

                If TypeOf ctlControl Is ComboBox Then

                    If Len(Trim(ctlControl.Text)) > 0 Then

                        lsInd = lsInd & ctlControl.Text + "*"

                    End If

                End If

            Next ctlControl

        End Sub

    Toutefois les contrôles sont lus à partir du dernier. J’ai tout essayé, modifier le noms, les indexes des tabs, etc. mais rien à faire.
    C’est embêtant, car pas la suite le programme doit recharger ces combo  et le résultat est tout à fat différent de l’original.

    Qui peut m’expliquer et me donner la solution pour que la lecture des objets se fasse dans la séquence de leur place dans formulaire ?

    Merci d’avance
    Cordialement

    Luigi


    Luigi1936
    dimanche 20 février 2011 16:35

Réponses

  • Bonsoir Michel.
    J'ai trouvé la solution. Pas très propre mais efficace.

    J'ai édité la forme.designer.vb et j'ai modifié manuellement le load des objets:

            Me.Controls.Add(Me.ComboBox1)
            Me.Controls.Add(Me.ComboBox2)
            Me.Controls.Add(Me.ComboBox3)

    Et voila, merci encore de votre aide.

    Bien Cordialemeent
    Luigi

     


    Luigi1936
    • Marqué comme réponse Alex Petrescu mardi 22 février 2011 14:03
    dimanche 20 février 2011 21:51

Toutes les réponses

  • Bonsoir,

    Alors pour l'explication, la liste des contrôles est remplie au fur et à mesure qu'ils sont ajoutés. Les derniers ajoutés sont donc les premiers de la collection.

    Pour changer l'index d'un contrôle de cette collection, il suffit d'utiliser Me.Controls.SetChildIndex(controle, nouvelIndex)

    Vous pourrez donc utiliser une procédure afin de changer l'ordre à votre convenance, soit en inversant entièrement l'ordre, soit un précisant quel contrôle doit être à quel index.

     

     


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    • Proposé comme réponse TroxsaEditor dimanche 20 février 2011 19:10
    dimanche 20 février 2011 17:56
  • Voici ce que j'ai fait, mais rien ne change

     

    Dim ctlControl As Object

     

    Dim ind As Integer = 1

     

    For Each ctlControl In Me.Controls

     

    If TypeOf ctlControl Is ComboBox Then

     

    Me.Controls.SetChildIndex(ctlControl, ind)

    ind = ind + 1

     

    End If

     

    Next ctlControl


    Luigi1936
    dimanche 20 février 2011 19:12
  • Excusez-moi,
    J'ai oublié de vous remercier et de vous saluer

    Cordialement
    Luigi

     


    Luigi1936
    dimanche 20 février 2011 19:14
  • Bonsoir,

    Pas grave :) En fait les index sont "inversés" à savoir l'index 0 placera le contrôle à la toute fin de la collection tandis que l'index "maximum" sera le premier élément.

    Essayez :

      Dim ctlControl As Object
    
        Dim ind As Integer = Me.Controls.Count
    
        For Each ctlControl In Me.Controls
    
          If TypeOf ctlControl Is ComboBox Then
    
            Me.Controls.SetChildIndex(ctlControl, ind)
    
            ind = ind - 1
    
          End If
    
        Next ctlControl
    


    N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.
    dimanche 20 février 2011 19:57
  • Merci Michel

    J'ai testé mais toujours la même chôse. Les indexes ne changent pas.

    Bien à vous

    Luigi


    Luigi1936
    dimanche 20 février 2011 20:21
  • Bonsoir Michel.
    J'ai trouvé la solution. Pas très propre mais efficace.

    J'ai édité la forme.designer.vb et j'ai modifié manuellement le load des objets:

            Me.Controls.Add(Me.ComboBox1)
            Me.Controls.Add(Me.ComboBox2)
            Me.Controls.Add(Me.ComboBox3)

    Et voila, merci encore de votre aide.

    Bien Cordialemeent
    Luigi

     


    Luigi1936
    • Marqué comme réponse Alex Petrescu mardi 22 février 2011 14:03
    dimanche 20 février 2011 21:51
  • Bonjour Michel,

    Je voudrais "profiter" de tes connaissances pour te soumettre un problème.

    J'ai trouvé sur le net un code qui je pensais pourrait me permettre de solutionner mon problème.

    En fait j'ai un formulaire dans lequel j'ai créé dynamiquement un groupbox et dans lequel j'ai créé dynamiquement des combobox.

    Je pensais au départ en adaptant le code ci-dessous pouvoir accèder à mes combobox.

    Mais je n'ai pas trouvé les bonnes lignes de code pour accèder à mes combobox alors que pour accèder à mon groupbox il n'y a pas de problème.

    Aurais-tu une idée ?

    Merci d'avance.

    Public Class Form1

        Dim Browsers As New System.Collections.Generic.List(Of Label)() ' Collection de labels

        Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load

            trouver_label() ' Répertorier tous les labels de la Form dans la collection

        End Sub

        Sub Label_Text(ByVal Label_Name As StringByVal Text As String' Modifier la propriété Text du Label

            For i As Integer = 0 To Browsers.Count - 1 ' Parcours toute la collection
                If Browsers(i).Name = Label_Name Then ' Si le nom du label correspond au nom du 1° paramètre
                    Browsers(i).Text = Text ' On modifie la propriété Text du label avec le 2° paramètre
                End If
            Next

        End Sub

        Sub trouver_label() ' Pour trouver tous les labels d'une Form

            For Each objet As Object In Me.Controls ' Parcours tous les controls de ta form
                If objet.GetType.Name = "Label" Then ' Si c'est un Label
                    Browsers.Add(objet) ' on le rajoute dans la collection
                End If
            Next

        End Sub

        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
            ' Lors du clic sur Button1 on appelle la fonction Label_Text

            Label_Text("toto""Salut"' Après cette fonction, le label 'toto' va afficher 'Salut'

        End Sub

    End Class
     

    mercredi 23 mars 2011 14:55