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
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
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)
Ca me retourne une erreur :
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)
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
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 :
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...
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()
Une âme charitable pourrait-elle m'expliquer où je fais faux?
Merci d'avance,
JFB
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
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 ...
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
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
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 :
En fait il y a deux solutions :
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
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
le namespace devrait etre dans ton strF
sinon voici un code qui fait ce que tu veux
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)
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
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)
leçon de piano, ça va me changer les idées...mais je regarde ça dès que je reviens!!
A toute,
JFB
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
Partager