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 :

Ouvrir Form depuis variable


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut Ouvrir Form depuis variable
    Bonjour,

    En corollaire à mon autre post, ma question est toute simple : comment ouvrir un formulaire à partir d'une variable? ... genre :

    dim mavar as ?
    mavar=me.combobox.selecteditem (ou autre)
    mavar.show

    Un grand merci d'avance!

    Amicalement,

    JFB

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    question qui revient souvent, et répondu assez souvent aussi, fait une recherche sur le forum
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Merci Sperot, je dois être plus bête que la moyenne... J'avais bien vu que la question avait déjà été posée, mais je n'arrive pas à implémenter les solutions, que ce soit via directcast ou validator machin... Et surtout j'aimerais comprendre...

    J'ai une variable string mavar,
    mavar= me.combobox1.selecteditem (qui est le nom du formulaire que je veux ouvrir, soit form4 par exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim mavar As String = Me.ComboBox1.SelectedItem
    Dim f As Form = CType(Activator.CreateInstance(Nothing, mavar).Unwrap, Form)
    Ca me retourne une erreur :
    Impossible de charger le type 'Form4' à partir de l'assembly 'OrderManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

    Apparemment, il a bien considéré ma variable, mais il ne trouve pas le type Form4, alors que la classe existe...

    Je sèche...

    Merci d'avance. JFB

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Bonsoir à tous,

    Excusez-moi de revenir à la charge, mais je sèche toujours...

    Voici le code que j'essaye, qui correspond aux deux posts que j'ai trouvé sur le même sujet en vb.net sur ce forum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim strF As String = Me.TextBox1.Text
    'Dim frm As New Form = CType(Activator.CreateInstance(Nothing, strF).Unwrap, Form)
    Dim frm As Form = DirectCast(System.Activator.CreateInstance(System.Type.GetType(strF, True, True)), Form)
    frm.Show()
    Je saisis le nom de mon form dans le textbox, et dans les deux cas, j'ai le même message : impossible de charger le type frmAvion à partir de l'assembly.... Mon form frmAvion existe bel et bien...

    Une âme charitable pourrait-elle m'expliquer où je fais faux?

    Merci d'avance,

    JFB

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il faut peut etre le namespace devant
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Sperot,

    C'est une question ou une suggestion?

    Si c'est une question, je n'ai pas la réponse, si c'est une suggestion, je ne sais pas où indiquer le namespace. Pour info, la solution "commentée" est texto celle que tu donnais dans un autre post, sans plus de détails. Et pour info aussi, les deux posts traitant du sujet ne disent pas si la solution a fonctionné... et j'en doute, en tout cas en l'état.

    Je vais trouver une solution, merci de ton aide,

    JFB

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par fxbrg Voir le message
    C'est une question ou une suggestion?

    un peu des 2


    enfin c'est quasi sur
    et par défaut un projet possède un namespace (voir dans les propriétés du projet)

    sinon il reste possible de boucler sur les types de l'assembly pour voir si y en a un qui ressemble (opérateur like) à ce que tu cherches


    m'enfin c'est pas des choses pour les non initiés, ca reste du code pas très sur (enfin je ne connais pas ton niveau)

    il y a surement un moyen plus propre de faire ce que tu veux, mais il faudrait que tu détailles ce qui t'as amené à faire ca ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Mon niveau : je me débrouille en Access/VBA, j'ai commencé ce matin en VisualStudio/VBNet...

    La raison de mon choix : dans l'appli (une gestion de devis avec des articles complexes), je veux mettre à la disposition du chef de projet un tableau de bord pour lui permettre de régler les paramètres de calcul des dits articles. Il y a un tas de paramètres, que j'ai regroupés en un paquet de formulaires. J'ai deux solutions : soit je mets un bouton d'ouverture pour chaque form, soit, ce que j'ai déjà fait sous Access, je liste mes forms de paramétrages (qui ont tous un préfixe commun) dans le projet, j'alimente une combobox avec leur nom ( (ça, ça fonctionne au poil), sur sélection dans la combobox, je récupère leur nom (ma fameuse variable string) et j'ouvre le form qui va bien.

    C'est peut-être tordu comme approche, et je ne vais peut-être pas, au final, la garder, mais je voudrais bien comprendre comment, dans l'absolu, ouvrir un fichier à partir d'une variable string...ce qui se fait fingers in the nose et couramment en vba (parce que moins "typé", je suppose)

    Pour revenir au NameSpace, il est bien indiqué dans mon projet, mais j'en fais quoi... et pour info le message d'erreur complet est Impossible de charger le type xxx à partir de l'assembly yyy, où yyy est le nom de mon assembly et mon Namespace...

    J'ai essa&yé de convertir mon string en type, mais il ne veut pas... Bref, je cale!!

    Encore merci,

    JFB

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si ton namespace est machin et ta form form4
    il faut faire demander une instance de machin.form4

    un combobox pour ouvrir des fenetre, c'est en effet étrange, enfin on reconnait bien là l'access ^^


    le mieux serait peut etre de faire un menu
    si tu as moins de 5 forms, tu peux tout coder à la main, pas la peine de faire un truc générique
    si tu as en une 20aine et que ca évolue dans le temps, il parrait en effet judicieux d'essayer de gagner des lignes de code


    sinon je peux te proposer une autre approche semi automatisée, est plus basée sur la programmation orientée objet, plutot que de se battre avec des string
    enfin il faudrait que je sache comment tu remplies ton combobox



    et sinon pour apprendre un peu ce qui existe en vb.net, ca se passe ici : http://plasserre.developpez.com/vsommair.htm
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Le site de plasserre, c'est mon site de chevet :-) C'est d'ailleurs étrange qu'il en existe si peu sur le sujet...

    Bon, question syntaxe, c'est sûr que le changement est brutal... alors comment passer ce namespace.nomdemonform...?

    Mon namespace est testMDI, pour l'instant, l'appel se fait avec la variable strF...

    ....Type.GetType(strF, True, True) Où dois-je indiquer ce f%@%%u namespace? lol

    Et pour répondre à ta question, comment remplis-je ma combobox (j'ai plutôt 25 forms et le pouce, et le code générique permet de gérer le futur), j'utilise ce bout de code, honteusement copié ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Menu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim a As Reflection.Assembly = System.Reflection.Assembly.GetAssembly(Me.GetType)
       For Each t As Type In a.GetTypes
         If GetType(Form).IsAssignableFrom(t) Then
           Dim f As Form = CType(Activator.CreateInstance(t), Form)
           Me.ComboBox1.Items.Add(f.Name)
         End If
      Next
    End Sub
    En fait il y a deux solutions :
    1/ soit je remplis ma combo avec les noms des forms comme ci-dessus, ma combo affiche, mais je suis dans la galère pour ouvrir les forms - comme tu le sais!,
    2/ soit je remplis la combo avec les forms (Me.ComboBox1.Items.Add(f)), c'est cool pour ouvrir les forms, mais je ne les vois pas dans la combo (les lignes sont vierges bien que présentes...) Héritage d'Access et ses combo multicolonnes, je me disais que j'aurais pu afficher les noms des forms tout en ayant l'objet form comme valeur réelle, mais fume, ça ne marche pas, ou alors je ne sais pas faire... - mais sur le principe, une combo capable de lister des objets forms et d'afficher des strings, ça le fait?)

    Bref,

    Amicalement,

    JFB

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le namespace devrait etre dans ton strF


    sinon voici un code qui fait ce que tu veux

    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
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub Menu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
       Me.ComboBox1.DisplayMember = "Text"
     
                Dim resultat As New ArrayList
                Dim a As Reflection.Assembly = System.Reflection.Assembly.GetAssembly(Me.GetType)
                For Each t As Type In a.GetTypes
                    If Not GetType(Form).IsAssignableFrom(t) Then Continue For
                    If t Is Me.GetType Then Continue For ' cette ligne sert à ne pas ajouter la form actuelle dans le combobox
     
                    Dim f As Form = CType(Activator.CreateInstance(t), Form)
     
                    Me.ComboBox1.Items.Add(f)
     
                Next
     
    End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If ComboBox1.SelectedItem Is Nothing Then Exit Sub
            Dim f As Form = DirectCast(Me.ComboBox1.SelectedItem, Form)
            f.Show()
        End Sub
    dans le combobox je place des instances de form, et je dis au combobox que ce qu'il doit afficher c'est la propriété Text (titre de la fenetre)
    j'ai mis le code qui ouvre la fenetre sur un clic de bouton par exemple

    niveau ergonomie, un combobox est loin de valoir des menus avec des sous menus ...


    sinon ce code a toutefois un problème, c'est que si tu fermes une fenetre ouverte avec ce système, elle n'est pas réutilisable !
    ou alors il faudrait intercepter tous les formclosing pour rendre la fenetre invisible plutot que de la fermer

    en plus ca t'obliges à instancier toutes les fenetre au démarrage de l'appli, pas terrible niveau perf


    la solution serait d'enregistrer le type (donc ni une instance de form, ni le nom de son type, mais bien son type) dans le combobox et d'instancier à partir du type
    par contre seule une instance de la form peut te donner son titre ...

    pour ca que j'en reviens à dire qu'un bon vieux menu c'est quand meme beaucoup mieux
    car en plus ca te permet pas d'instancier des form qui requièrent des paramètres dans le new (t'en as ptete pas)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    leçon de piano, ça va me changer les idées... mais je regarde ça dès que je reviens!!

    A toute,

    JFB

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Re :-)

    En fait il me manquait la première ligne (que j'avais écrite mais pas au bon endroit...) dans le code de renseignement du combobox... et le petit plus pour ne pas lister le menu, c'est cool :-)

    Je ne saurais peut-être jamais comment ouvrir un form à partir d'une variable texte, mais ce code fait exactement ce que je voulais, ce qui est bien l'essentiel!!

    Un énorme merci, je ne te dis pas à charge de revanche, tu vois pourquoi :-)

    Amicalement,

    JFB

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

Discussions similaires

  1. Ouvrir un Form depuis Form1
    Par Arthur59 dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/01/2010, 21h46
  2. Réponses: 17
    Dernier message: 15/04/2007, 12h28
  3. Ouvrir word depuis une form
    Par cyberma dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/03/2007, 14h34
  4. Ouvrir une form depuis une class
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 01/09/2006, 11h13
  5. Ouvrir Form depuis SousForm selon Id
    Par samlepiratepaddy dans le forum Access
    Réponses: 12
    Dernier message: 09/11/2005, 10h59

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