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 :

Reflection : lister les contextmenustrip d'une form


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut Reflection : lister les contextmenustrip d'une form
    Bonjour,
    Me revoilà...
    Je suis en train de mettre au point un programme qui définit via les méthodes de reflection un style attaché à une form donnée.
    Jusqu'à présent, pas de problème avec un code de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Sub UpdateFormWithStyle(ByVal conpGeneric As Control)
         If TypeOf conpGeneric Is Form Then
         ...<je définis une fonte globale à ma form, ou d'autres propriétés visuelles telles que le backcolor>
         ElseIf TypeOf conpGeneric Is Button Then
         ...<et ainsi de suite pour d'autres types de controles>
         End If
         If conpGeneric.HasChildren Then					
              Dim conChildControl As Control
              For Each conChildControl In conpGeneric.Controls 
                   UpdateFormWithStyle(conChildControl)
              Next
         End If
    Ainsi, de cette façon, l'ensemble des texts de ma form peut s'afficher avec une police en gras par exemple (même les menuitem avec une ligne de ce type "For Each MyMenuItem In CType(conpGeneric, MenuStrip).Items").
    L'ensemble ? Non, un petit composant visuel résiste toujours à l'envahisseur

    Il s'agit du ContextMenuStrip qui n'est pas considéré comme un "ChildControl" de la form contrairement au MenuStrip.

    Je peux bien entendu chercher pour chacun des controls si la propriété ContextMenuStrip est renseignée et dans l'affirmative appliquer le style à l'objet trouvé mais c'est très loin d'être optimisé vu que N controls peuvent être rattachés au même ContextMenuStrip...

    En regardant un peu chez MSDN, je tombe rapidement sur les classes IContainer et ISite mais je ne trouve pas la solution au problème suivant :
    Comment recenser les contextmenustrips définis en conception sur une form donnée ?

  2. #2
    Membre averti Avatar de roster
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 397
    Points : 426
    Points
    426
    Par défaut
    J'imagine qu'il y a mieux vu que j'y connais rien en contextmenu, mais l'idée serait certainement d'ajouter ton contextmenustrip comme control de ta form.

    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyContextMenuStrip.TopLevel = False 
    Me.Controls.Add(MyContextMenuStrip)

    En tout logique, ton contextmenustrip devrait apparaitre dans ta conChildControl liste, non?

    PS: Cela ne répond pas vraiment à ta question vu que tu ne sais pas si un tel controle est présent ou non, mais c'est peut-être à creuser?!

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Merci de ta réponse Roster mais cette méthode est appelée sur des forms dont on ne connait pas à l'avance les controles qui y figurent.

    Autrement dit, on ne peut ajouter 'manuellement' un contextmenustrip puisqu'on ne sait pas à l'avance si il y en a et combien...

  4. #4
    Membre averti Avatar de roster
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 397
    Points : 426
    Points
    426
    Par défaut
    Peut-être comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each obj As Object In Me.components.Components
     
                If TypeOf obj Is ContextMenuStrip Then
                   (...)
                End If
     
            Next

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 169
    Points : 25 099
    Points
    25 099
    Par défaut
    y a de l'idée dans me.components

    sinon si tu parcours tous les controles pour voir leur propriété contextmenustrip, tu peux ensuite stocker les instances dans une collection
    comme ca si tu tombes sur un contextmenustrip, tu regardes si tu l'as pas deja traité avec .contains()


    .site n'est rempli quand mode design je crois
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Effectivement Roster, j'étais prêt à ajouter dans le Load de la form l'ensemble de ses ContextMenuStrip et à utiliser ta dernière suggestion (déjà implémentée mais qui justement ne renvoyait rien) mais Môssieur .NET me le refuse en disant "Impossible d'ajouter un contrôle de premier niveau à un contrôle."

    Je retiens pour l'instant l'idée de Sperot qui est élégante tout en investigant sur le me.components car il se trouve que le .designer attaché à la form utilise la syntaxe atypique suivante pour les contextmenustrip
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.cmShowContextMenu = New System.Windows.Forms.ContextMenuStrip(Me.components)
    Atypique car les autres contrôles ne sont créés avec aucun paramètre entre parenthèse...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Voici donc l'implémentation de la solution proposée par Sperot que je remercie.

    Si mon conpGeneric est une form, j'initialise la liste (.Clear).
    C'est encore un peu à optimiser car une form peut contenir un panel qui contient lui même une form donc il faudrait plutôt initialiser la liste dans la méthode qui appelle cette méthode récursive.
    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
    Private ListOfCMStrip As New Collection(Of ContextMenuStrip)
    Dim MyMenuItem As ToolStripItem
     
       If Not IsNothing(conpGeneric.ContextMenuStrip) Then
         If Not ListOfCMStrip.Contains(conpGeneric.ContextMenuStrip) Then
           conpGeneric.ContextMenuStrip.Font = <une font>
     
           For Each MyMenuItem In CType(conpGeneric.ContextMenuStrip, ContextMenuStrip).Items
             If TypeOf MyMenuItem Is ToolStripMenuItem Then
                MyMenuItem.Font = <une font>
             End If
           Next
           ListOfCMStrip.Add(conpGeneric.ContextMenuStrip)
         End If
       End If

  8. #8
    Membre averti Avatar de roster
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 397
    Points : 426
    Points
    426
    Par défaut
    Intéressant!
    Je pense que je réutiliserais ce code pour mes besoins personnels.

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

Discussions similaires

  1. Lister les ContextMenuStrip d'une Form
    Par ppphil dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/09/2011, 00h52
  2. lister les tedit d'une form
    Par coucoucmoi dans le forum Langage
    Réponses: 4
    Dernier message: 20/05/2010, 15h25
  3. Lister les composants d'une forme
    Par abrainboy dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/04/2009, 19h35
  4. Comment lister les méthodes d'une Form ?
    Par WebPac dans le forum Langage
    Réponses: 12
    Dernier message: 08/03/2006, 18h45

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