VB.NET - Cast di un oggetto form

mercoledì 25 giugno 2008 - 15.31

walteroli Profilo | Newbie

Ciao a tutti,
ho un problema di questo tipo:
all'interno del mio progetto ho una form MDI con un menù caricato dinamicamente leggendo da un DB; tra le informazioni che mi arrivano dal DB c'è anche il nome della form che la relativa voce di menù dovrà lanciare.

Il problema è: come faccio a recuperare l'oggetto form che esiste all'interno del mio progetto sapendone solo il nome???

Ho già provato con DirectCast ed Handler, ma non ne sono uscito...

Grazie a tutti

LordS Profilo | Newbie

Puoi usare le Reflection...

Esempio


Dim NomeForm As String = "Form2"

Dim NomeReflect As String = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
If NomeReflect.EndsWith(".") = False Then
NomeReflect &= "."
End If

NomeReflect &= NomeForm
Dim TipoForm As Type = Type.GetType(NomeReflect)

CType(TipoForm.GetConstructor(System.Type.EmptyTypes).Invoke(Nothing), Form).Show()

---

Basta che cambi il contenuto il nome di NomeForm e ti apre il Form di conseguenza.

Buon lavoro

aiedail92 Profilo | Expert

Ciao

Potresti usare la Reflection: ottieni l'assembly della tua applicazione con Assembly.GetExecutingAssembly, dall'assembly ottieni il tipo in base al nome con l'istruzione GetType(String), e in seguito chiami il costruttore sul tipo per creare l'oggetto. Scrivo una funzione che fa una cosa generalizzata per ciascun tipo:

''' <summary> ''' Carica un oggetto di tipo T dall'assembly corrente ''' </summary> ''' <typeparam name="T">Tipo restituito</typeparam> ''' <param name="name">Nome del tipo (incluso namespace)</param> ''' <param name="params">parametri del costruttore, ''' oppure nothing per il costruttore predefinito</param> ''' <returns>Un'istanza del tipo identificato da name</returns> Function LoadObject(Of T)(ByVal name As String, ByVal ParamArray params() As Object) As T Dim result As T Dim curAssembly As Assembly = Assembly.GetExecutingAssembly() Dim tp As Type Try tp = curAssembly.GetType(name, True, True) Catch Throw End Try Dim parameters() As Type If params Is Nothing Then parameters = Type.EmptyTypes Else ReDim parameters(params.Length - 1) For i As Integer = 0 To params.Length - 1 parameters(i) = params(i).GetType() Next End If result = tp.GetConstructor(parameters).Invoke(params) Return result End Function

E questo è un esempio di come potresti usare la funzione:
Sub Test() Dim altraForm As Form = LoadObject(Of Form)("TuoNamespace.AltraForm", Nothing) altraForm.Show() End Sub


Luca

aiedail92 Profilo | Expert

Tre secondi di ritardo

Luca

LordS Profilo | Newbie

Na... l'importante è il pensiero, ho visto che è piu attivo questo forum che altri che ho visitato per cui ho deciso di dare una mano qua piuttosto che ad altri con nomi piu altisonanti.

walteroli Profilo | Newbie

Grazie ad entrambi!

Siete stati molto utili...

Walter

aiedail92 Profilo | Expert

È un piacere aiutare

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5