none
VB - Utilisation d'un controle (textblock, border, ...) par un index RRS feed

  • Question

  • Bonjour,

    Je débute en application Windows Store (express 2012 pour Store) et je sèche pour utiliser dans mon code un contrôle (texblock par exemple) par rapport à un index ! j'ai visité beaucoup de pages, de forums ici et "elewhere" mais rien.

    Actuellement, j'ai placé mes contrôles dans un Grid, je peux les traiter TOUS avec une boucle (ici For)

    For Each obj In Grid_titi.Children.OfType(Of TextBlock)()
                AddHandler obj.PointerPressed, AddressOf ....
                obj.text = ...

    etc

    mais comment avoir ces "contrôles" dans une collection par exemple pour coder de la sorte :

    obj_textblock(index_obj) = .... ?

    ou sur un événement d'un de ces contrôles obtenir un index du sender ?

    merci , dans mes ténèbres, même une petite étincelle sera comme un soleil ;-)

    jeudi 1 mai 2014 13:58

Réponses

  • Merci ....

    en fait par boucle c'est indigeste ;-)

    Alors oui il est possible de créer des collections d'objet - et le fait que tu me le confirmes à fini par me faire comprendre mon erreur chaque fois que j'essayais car j'avais une message d'erreur 

    j'écrivais entre autres assais :

    Dim macollection as Collection(Of TextBlock)
    For Each obj In MyGrid.Children.OfType(Of TextBlock)()
        macollection.Add (obj)
    Next

    avec une exception type System.NullReferenceException, parce que bêtement il faut suivre et commencer par :

    Dim macollection as NEW Collection(Of TextBlock)

    après croyant qu'il manquait à ma collection quelque chose pour la rendre compatible avec les objets Children, je cherchais ailleurs un truc inexistant !!!

    Merci à toi et au temps que tu m'as accordé, pour m'avoir remis sur les rails, je re-code jusqu'à lumière au bout du tunnel ;-)


    • Marqué comme réponse Brunodu06 vendredi 2 mai 2014 13:03
    • Modifié Brunodu06 vendredi 2 mai 2014 13:05
    vendredi 2 mai 2014 13:02

Toutes les réponses

  • Bonjour,

    il suffit d'utiliser la collection d'UIElements retournée par la propriété Children de la classe Panel.

    For Each element As UIElement In myGrid.Children
      '...
    End For
    
    'ou bien
    
    For i = 0 To myGrid.Children.Count - 1
      myGrid.Children.Item(i) '...
    End For

    Nimzozo, from France.


    • Modifié Nimzozo vendredi 2 mai 2014 09:06
    vendredi 2 mai 2014 09:01
  • bonjour, 

    merci mais désolé, je pense avoir mangé quelques explications à mon incompréhension.

    En fait comme en windows form (express 2010), je veux utiliser/modifier des propriétés de contrôles comme dans un Groupbox par rapport à un index (soit calculé par mon code mais pas forcément une boucle, soit obtenu par le sender du contrôle). 

    J'utilise un Grid dans lequel j'ai plusieurs Textblock et autant de Border :
    Je comprends bien cette collection dérivée de Children du Grid, mais je n'arrive pas lier une variable "index" à un contrôle de mon Grid (dans cet exemple).

    Comment modifier la propriété "text" seulement du 4éme TextBlock ?

    si je commence à écrire myGrid.Children.item(x) comment compléter pour arriver à :
     @@@@@Item(x)@@@@.text = "myvalue" pour un TextBlock ou
    @@@@@Item(y)@@@@.Background="#XXXXXXX" pour un Border

    Une des choses que fait mon code (avant) est de changer texte/couleur de fond des labels sur lequel passe la souris (moved) ... mais le code peux faire de même avec un index suivant un parcours calculé.

    mais voilà, les "collections" que j'ai essayé de créer pour l'instant ne sont pas compatibles avec "windows.UI.Xaml.Controls.Grid" ou UIElement et je n'arrive pas à accéder aux propriétés des contrôles par un index !! 

    C'est forcément réalisable, mais je bute comme pas permis :-(

    vendredi 2 mai 2014 11:31
  • Pourquoi ne pas tester le type des éléments parcourus dans une boucle par exemple ?

    For i = 0 To myGrid.Children.Count - 1
      Dim elementI = myGrid.Children.Item(i)
      If TypeOf(elementI) Is TextBlock Then
        elementI.Text = "..."
      ElseIf TypeOf(elementI) Is Border Then
        elementI.Background = "..."
      End If
    End For

    De plus, il est tout à fait possible de créer des collections d'objets. Collection(T)


    Nimzozo, from France.

    vendredi 2 mai 2014 12:00
  • Merci ....

    en fait par boucle c'est indigeste ;-)

    Alors oui il est possible de créer des collections d'objet - et le fait que tu me le confirmes à fini par me faire comprendre mon erreur chaque fois que j'essayais car j'avais une message d'erreur 

    j'écrivais entre autres assais :

    Dim macollection as Collection(Of TextBlock)
    For Each obj In MyGrid.Children.OfType(Of TextBlock)()
        macollection.Add (obj)
    Next

    avec une exception type System.NullReferenceException, parce que bêtement il faut suivre et commencer par :

    Dim macollection as NEW Collection(Of TextBlock)

    après croyant qu'il manquait à ma collection quelque chose pour la rendre compatible avec les objets Children, je cherchais ailleurs un truc inexistant !!!

    Merci à toi et au temps que tu m'as accordé, pour m'avoir remis sur les rails, je re-code jusqu'à lumière au bout du tunnel ;-)


    • Marqué comme réponse Brunodu06 vendredi 2 mai 2014 13:03
    • Modifié Brunodu06 vendredi 2 mai 2014 13:05
    vendredi 2 mai 2014 13:02