Appel de control dans un control dans un control etc etc ...

Résolu
Mortasgus Messages postés 5 Date d'inscription jeudi 17 avril 2003 Statut Membre Dernière intervention 28 juin 2010 - 22 juin 2010 à 12:12
Mortasgus Messages postés 5 Date d'inscription jeudi 17 avril 2003 Statut Membre Dernière intervention 28 juin 2010 - 28 juin 2010 à 22:03
Avant toute chose, bonjour a tous et merci par avance de lire ces quelques lignes.

En espérant poser la bonne question au bon endroit, sinon merci de déplacer mon sujet dans la rubrique approprié.

Environnement : visual Basic 2010 express

Je viens vers vous car j'essaye d'accéder a une suite de contrôles qui se trouve eux même dans d'autres contrôles.

Exemple : un formulaire contenant un tabcontrol contenant des tabpages contenant des listviews contenant des colonnes
avec comme style de code :
    Private Sub InitializeComponent()
        Me.TabPage = New System.Windows.Forms.TabControl()
        Me.TabPage1 = New System.Windows.Forms.TabPage()
        Me.ListFull = New System.Windows.Forms.ListView()
        Me.ColumnHeader1 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader)
        Me.ColumnHeader2 = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader)
etc ....
        Me.TabPage.Controls.Add(Me.TabPage1)
etc ...
        Me.TabPage1.Controls.Add(Me.ListFull)
etc ...
        Me.ListFull.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1, Me.ColumnHeader2})
etc ...
        Me.Controls.Add(Me.TabPage)
etc ...
    End Sub
    Friend WithEvents TabPage As System.Windows.Forms.TabControl
    Friend WithEvents TabPage1 As System.Windows.Forms.TabPage
    Friend WithEvents ListFull As System.Windows.Forms.ListView
    Friend WithEvents ColumnHeader1 As System.Windows.Forms.ColumnHeader
    Friend WithEvents ColumnHeader2 As System.Windows.Forms.ColumnHeader

Voila en gros comment cela se construit.

Si l'on veux changer le texte de TabPage1 ou ColumnHeader1 on peut très bien l'appeler directement style:
Me.TabPage1.text = "nouveaux texte"
Me.ColumnHeader1.Text = "nouveaux texte"

Hors, dans mon cas, le programme fait appel a du tier extérieur. Je ne peux donc pas utiliser cette méthode.

Celle qui m'est venu a l'idée c'est l'appel au controls
Me.Controls("TabPage").Controls("TabPage1").text = "nouveaux texte"

Nouveau souci, ColumnHeader1 fait parti d'un collection d'un control d'un control d'un control etc etc ...
De plus, au plus on ajoute de controls, au plus c'est lourd a gérer.

Ma question donc est :
Vu que le constructeur créé ces lignes,
Me.TabPage1 = New System.Windows.Forms.TabPage()
Friend WithEvents TabPage1 As System.Windows.Forms.TabPage

Est ce qu'il existe un moyen d'appeler l'un ou l'autre pour accéder aux propriétés de l'objet ?

Me.toutlescontrols("TabPage1").text = "nouveau"
ou
propriété_de_Friend_WithEvents("TabPage1").text = "nouveau"

Enfin si vous voyez ce que je veux dire

Merci par avance pour vos réponses.

Sincère salutations a tous

A bientôt

5 réponses

Utilisateur anonyme
25 juin 2010 à 14:10
Bonsoir,
Personnellement je placerais mes différents contrôles rangés par types de contrôle dans des simples collections d'objet :
  col.Add(Button1, "Bouton1")
  col.Add(Button2, "Bouton2")


L'avantage des collections c'est que les recherches se font par clés (ou pas index) pour les appeler on peut écrire :
Dim bouton As Button = DirectCast(col.Item("Bouton2"), Button)
bouton.Text = "couscous"


Ou encore les rechercher dans une boucle pour changer leur propriétés :
For Each bouton As Button In col
     bouton.Text = "coucou"
Next


En espérant que ca puisse t'aider un peu.
Bonne soirée.
3
Mortasgus Messages postés 5 Date d'inscription jeudi 17 avril 2003 Statut Membre Dernière intervention 28 juin 2010
26 juin 2010 à 02:04
Bonsoir,

L'idée est intéressante et à l'efficacité de marcher mais, car il faut toujours un mais ^^, elle deviens lourde aussi car:
- créé une ou des collections en fonction des controles
- ajout manuel dans le code de col.add pour chaque controle
- fait un directcast en fonction de chaque type

Donc j'ai fait un rapide test et j'ai trouvé ceci :
Dim test As Object = DirectCast(ColumnHeader1, ColumnHeader)
test.text = "test"

ca a l'avantage de ne pas utiliser de collection et de donner le nom et le type seulement

reste a définir deux dim avant car ces noms et valeur, je les recupere au format string

donc :

dim le_nom as quelque_chose = "ColumnHeader1"
dim le_type as autre_chose = "ColumnHeader"
Dim test As Object = DirectCast(le_nom, le_type)
test.text = "test"

a méditer

en attendant une autre réponse, merci a toi d'avoir fait avancer le Schmilblick
0
Utilisateur anonyme
27 juin 2010 à 20:15
Tu peux aussi énumérer tous tes contôles de ta form, rechercher leur type et grâce à cela manipuler ensuite leur propriétés.
        For Each element As Control In Me.Controls
            't represente le type du controle 
            Dim t As Type = element.GetType
            ' t.name est le type sous forme de string
            Select Case t.Name
                'selon le type du controle tu accede aux bonnes propriétés
                Case "Button"
                    element.Text = "nouveau texte"
                Case "ColumnHeader"
                    element.Width = 500

            End Select
        Next

Bonne soirée
0
Utilisateur anonyme
27 juin 2010 à 20:21
Un petit oubli. Pour bien cibler ton contrôle, donne lui un nom avec sa propriété name. Dans ta boucle tu pourra ainsi le repérer.

If element.Name "toto" Then element.Text "nouveau texte"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mortasgus Messages postés 5 Date d'inscription jeudi 17 avril 2003 Statut Membre Dernière intervention 28 juin 2010
28 juin 2010 à 22:03
salut banana

oui, mais non
Seul tabcontrol est un contrôle enfant de Me, donc seul celui-ci ressort ^^
Tabpage1,2,etc ... sont enfants de Tabcontrol
Listview est enfant de tabpage1
etc etc ...

De plus, même en faisant une bouche de recherche d'enfant comme suivant,

Add_ctrl(Me.Controls)

Private Sub Add_ctrl(ByVal lescontroles)
For Each element As Control In lescontroles
If element.HasChildren Then
Add_ctrl(element.Controls)
End If
Next
End Sub

Les colonnes des listview ne ressortent pas. Ce ne sont pas a proprement parler des enfants.

Il y a des idées qui ressortent de ce que tu m'as répondu. Malgré tout, il reste toujours quelques petits détail a régler.
Je te remercie encore pour m'avoir répondu

a bientôt si tu as d'autres idée ^^
0
Rejoignez-nous