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

Windows Forms Discussion :

Lister toutes les forms d'une application


Sujet :

Windows Forms

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut Lister toutes les forms d'une application
    Salut à tous,

    Je vais sans doute poser une question débile mais je n'arrive pas à lister toutes les forms de mon projet !

    En 2.0, il y a la propriété OpenForms mais cela ne me convient pas

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Private Sub OuvrirEnigme(ByVal name As String)
            For Each ctrl As Control In Me.Controls
                If TypeOf ctrl Is Form Then 'vérifie que c'est une form
                    If ctrl.Name = name Then
                        ctrl.Show()
                        Me.Dispose()
                    Else
                        MsgBox("impossible de trouver")
                    End If
                End If
            Next
        End Sub
    Et j'ai remarqué que les forms ne sont pas listées, normal puisque ce ne sont pas des controles...

    Voilà merci à tous
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Aspic Voir le message
    Et j'ai remarqué que les forms ne sont pas listées, normal puisque ce ne sont pas des controles...
    Si, les Form héritent de Control.
    Le problème dans ton code, c'est d'où apelle tu ton "Me.Controls" ?
    Tel que c'est codé, cela ne retourne rien car on ne fait pas (a priori) de Add d'une Form dans la collection Controls d'une autre.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Effectivement, ce code est appelé dans une form donc il me liste seulement les controles de cette form. Or moi je souhaiterais lister toutes les forms du projets.

    Merci

    EDIT : J'en suis sur que la réponse se trouve dans System.Windows.Forms.FormCollection mais je ne trouve rien
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Eh non, la réponse se trouve dans l'assembly !

    Un exemple :
    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
     
    Imports System.Reflection
    Imports System.Threading
     
    ...
     
            Dim a As Assembly = System.Reflection.Assembly.GetAssembly(Me.GetType)
            'Dim ad As AppDomain = Thread.GetDomain
            'For Each a As Assembly In ad.GetAssemblies
            For Each t As Type In a.GetTypes
                If GetType(Form).IsAssignableFrom(t) Then
                    Console.WriteLine(t.FullName)
                End If
            Next
            'Next
    Ca doit lister tout ce qui est ou hérite de form.

    Je te laisse tester les lignes en commentaire, pour voir.

    Si tu as plusieurs assembly faut faire le truc pour chacun évidemment.

    MP : l'article sur le combobox avance, faut pas désepérer ...

    Question : Ca vaut le coup en FAQ ?

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  5. #5
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Salut,

    Ton code liste effectivement toutes les forms du projet ! Le soucis est que je souhaiterais récupérer l'objet (Form) en fonction de son Nom. Or avec ton code, je n'arrive pas à récupérer l'objet Form associé...

    PS : Tout dépens de toi, en fait une entrée pour les FAQs c'est généralement une question récurrente dont la réponse est relativement courte sinon ca passe dans la catégorie Source ou alors si tu souhaites t'y investir plus (commenter le code, mettre un exemple...), tu peux en faire un tutos
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut Aspic,

    as tu essayé la propriété static Application.OpenForms (qui te renverra un FormCollection d'ailleurs) ? Par contre, je ne sais pas, si la collection renvoyé liste pour le thread en cours, ou sur toute l'appli.

    Bon courage. =)

    Edit : pas vu que tu avais deja essayé. Cela ne convient pas ? Que cherche tu precisement ?

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    J'ai du mal à saisir ton besoin, tu veux lister les formulaires ouverts à un moment donné ou bien tu veux connaitre tous les formulaires contenus dans le projet ?
    Si c'est la deuxième méthode, le code d'olsimare fonctionne, il faut simplement faire un Activator.CreateInstance en lui passant le type du formulaire pour en obtenir une instance.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  8. #8
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Aspic, ca peut se faire via reflection avec assembly.createinstance(nom complet de l'instance).

    Au besoin je te mets un exemple ce soir (je suis au boulot et j'ai pas VS !).

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par olsimare Voir le message
    Ca doit lister tout ce qui est ou hérite de form.
    Euh oui ... mais visiblement ce qui l'intéresse c'est de lister les instances pas les types.

    Ce serait pas mal que Aspic précise un peu plus quel est son objectif ou son besoin fonctionnel (même si il me semble évident que la réponse de Olsimare est inappropriée).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  10. #10
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Oui donc Olsimare a compris je pense, je ne cherche pas à récupérer les forms ouvertes car il y a déjà) une méthode pour ca (OpenForm dans l'espace de nom MY).

    Je veux récupérer un objet (Form) de mon projet (form ouverte ou pas) en fonction de son nom

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Dim a As Assembly = System.Reflection.Assembly.GetAssembly(Me.GetType)
            For Each t As Type In a.GetTypes
                If GetType(Form).IsAssignableFrom(t) Then
                    If t.FullName = name Then
                        Dim f As Object = Activator.CreateInstance(t) 'mais ca ne marche pas ici
                                            Dim f As Object = Activator.CreateInstance(GetType(Form)) 'idem
                 End If
                End If
            Next
    Je n'arrive pas a récupérer le Form !

    Merci à tous
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Tu pourrais être plus précis que "ça marche pas" stp ?
    Qu'est ce que tu entends par "Je n'arrive pas a récupérer le Form !" ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  12. #12
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    J'ai enfin réussi, je suis très bête, c'était un problème dans ma condition

    Voici le code complet et fonctionnel qui fera bientôt une entrée dans la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      Private Sub OpenTest(ByVal name As String)
            Dim a As Assembly = System.Reflection.Assembly.GetAssembly(Me.GetType)
            For Each t As Type In a.GetTypes
                If GetType(Form).IsAssignableFrom(t) Then
                    If t.Name = name Then
                        Dim f As Form = CType(Activator.CreateInstance(t), Form)
                        f.Show() 'affiche la form en question
                    End If
                End If
            Next
        End Sub
    Merci à tous ! (En particulier à Olsimare)
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  13. #13
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Aspic Voir le message
    Merci à tous ! (En particulier à Olsimare)
    Maieuuh, moi aussi j'ai aidé, c'est moi qu'ai dit pour le Activator.CreateInstance en premier

    Je plaisante. Tant mieux si c'est résolu
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  14. #14
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Maieuuh, moi aussi j'ai aidé, c'est moi qu'ai dit pour le Activator.CreateInstance en premier

    Je plaisante. Tant mieux si c'est résolu
    C'est vrai Je suis injuste
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  15. #15
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Saumon, je l'avais même pas vu en plus !

    Je ne voudrais pas être taxé de plaggia quand même !

    EDIT : tiens d'ailleurs aprés vérif, moi j'utilise ni assembly.createinstance, ni activator.createinstance !

    Dans ce cas, j'ai juste une remarque : la boucle n'est pas utile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Public Sub OpenTest(ByVal IClassName As String)
            Dim a As System.Reflection.Assembly = System.Reflection.Assembly.GetAssembly(Me.GetType)
            Dim f As Form = CType(Activator.CreateInstance(a.GetType(IClassName)), Form)
            f.Show()
        End Sub
    Le probléme de cette méthode à mon sens est qu'elle nécessite de passer le nom de la class avec le namespace...

    Donc dans mon framework perso, j'utilise plutôt le AppDomain.CurrentDomain.CreateInstance.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  16. #16
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Ok c'est à prendre comme infos
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

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

Discussions similaires

  1. Sub valable pour toutes les forms d'une application
    Par serana71 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/05/2010, 15h49
  2. Réponses: 2
    Dernier message: 14/08/2006, 19h23
  3. [debutant] lister tout les mots d'une page web!
    Par kriskikout dans le forum Web
    Réponses: 20
    Dernier message: 31/05/2006, 22h47
  4. [MySQL] lister toutes les tables d'une base
    Par Tr@nkill dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2006, 14h45
  5. Réponses: 7
    Dernier message: 27/10/2005, 14h24

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