RICHIAMARE UN FORM CON NOME VARIABILE

di il
17 risposte

RICHIAMARE UN FORM CON NOME VARIABILE

Ciao a tutti,
come da oggetto avrei necessità di richiamare un form il cui nome però si genera in base a delle scelte e quindi è variabile.
Ho una stringa che contiene il nome del Form (per esempio CLIENTI) ... se sapessi già di voler aprire il Form CLIENTI, scriverei CLIENTI.Show() ed avrei risolto ... nel mio caso nella stringa potrebbe esserci il nome CLIENTI o FORNITORI o ALTRO ... in pratica qualcosa tipo :

Dim STRINGA As String
STRINGA = "F" & VARIABILECHESIGENERA
Dim NOMEFORM As Form
NOMEFORM = STRINGA
NOMEFORM.Show()

Così non va perchè non posso assegnare al form una stringa ... ho provato anche con NOMEFORM = CType(STRINGA, Form) ma non va comunque ...
Spero di essere stato chiaro ...

Saluti

Roberto

17 Risposte

  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Forse non ho capito bene ma sembrerebbe che basti aggiungere un if sul valore nome ed a secondo del valore riscontrato esegua un form piuttosto che un altro
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Ciao ... il problema non è come chiamare un Form piuttosto che un altro ... il problema è proprio come chiamare il Form.
    Nel senso che essendo variabile non so quale sarà il Form da richiamare e quindi devo poter richiamarlo tramite una variabile.
    Ma non va per come l'ho scritto io ...
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    NOMEFORM.Name è una stringa impostabile
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Purtroppo sembra non sia così facile ... non mi fa attribuire alla proprietà .Name una stringa
    Mi dice ... "Riferimento a un oggetto non impostato su un'istanza di oggetto"

    In un'altra parte del progetto ho inserito NUOVOFORM = Me ed ha funzionato perché il nome che dovevo attribuire a NOMEFORM doveva essere il Form attualmente in uso ... in questo caso devo scegliere in base a delle condizioni che cambiano in funzione di scelte utente ...
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    E certo che ti dà la null pointer exception: non hai istanziato l'oggetto col new, quindi è nullo e non puoi accedere a un suo metodo.

    Se i form esistono non devi usare il dim, ma i metodi Show e Hide andando a vedere i form attivi con Application.OpenForms
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Grazie per la risposta …
    Il mio problema però è che il Form che richiamerò non sarà già attivo …
    Per capirci meglio …
    Da un Form Padre con vari menù, io richiamo il Form per esempio Nazionalità che all'interno contiene un campo Valuta che è legato ad un'altra tabella (la tabella valute appunto).
    Quando mi trovo su quel campo ho impostato che premendo F4 si apre un Form che io ho generalizzato in modo che possa visualizzare l'elenco di qualsiasi tabella in base ad un campo Public che il tasto F4 gli passa in modo da sapere quale tabella visualizzare.
    Fin qui tutto ok … nello stesso Form però ho inserito un tasto NUOVA per creare una nuova tabella che magari non esiste nell'elenco … e qui viene il mio problema … cliccando sul tasto NUOVA io devo richiamare il Form (che già esiste al livello di progettazione ma non sarà attivo in quel momento) relativo alla gestione di quella tabella.
    Piuttosto che creare tanti controlli per richiamare il Form giusto … in base al campo Public passato dall'F4 (che è una stringa) mi basterebbe anteporre a questa stringa una "F" ed ottenere il nome del Form da richiamare (ho dato ai Form il nome della tabella che gestiscono precedendoci una "F").
    Il mio problema è : come faccio a richiamare .Show del Form il cui nome è contenuto nella stringa suddetta ?
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Salve,
    so che e' una soluzione hard coded, ma io farei un select case:
    select case true
    Case string.compare(strNomeForm, "frmPippo", true)= 0
    dim frm as new frmPippo
    frm.show
    Case string.compare(strNomeForm, "frmPluto", true)= 0
    dim frm as new frmPluto
    frm.show
    ....

    saluti omnia
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Ho capito, vuoi fare le schifezze con le reflections
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim nomeForm As String = "Form2"
            Try
                System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & nomeForm).Show()
            Catch ex As Exception
                MsgBox("Il form " & nomeForm & " non esiste!")
            End Try
        End Sub
    End Class
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    asql ha scritto:


    Salve,
    so che e' una soluzione hard coded, ma io farei un select case:
    select case true
    Case string.compare(strNomeForm, "frmPippo", true)= 0
    dim frm as new frmPippo
    frm.show
    Case string.compare(strNomeForm, "frmPluto", true)= 0
    dim frm as new frmPluto
    frm.show
    ....

    saluti omnia
    Volevo evitare proprio tutti quegli If, in quel caso avrei potuto farlo senza problemi …

    Weierstrass ha scritto:


    Ho capito, vuoi fare le schifezze con le reflections
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim nomeForm As String = "Form2"
            Try
                System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & nomeForm).Show()
            Catch ex As Exception
                MsgBox("Il form " & nomeForm & " non esiste!")
            End Try
        End Sub
    End Class
    Avevo già provato una soluzione del genere ... ma mi dice SEMPRE che il Form non esiste …
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Io avevo provato in questo modo :
    
    Dim nomeForm As String = "NOMEFORM"
    Dim Fullname As String = Application.ProductName & "." & nomeForm
    DirectCast(Activator.CreateInstance(Type.GetType(Fullname, True, True)), Form).Show()
    
    Che credo sia similare al tuo … ma non va allo stesso modo ...
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Ma come fai a dire che non va?

    Fai un progetto nuovo, con un form solo che si chiama Form1 che contiene un pulsante solo che si chiama Button1 e prova esattamente questo
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim nomeForm As String = "Form1"
            Try
                System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & nomeForm).Show()
            Catch ex As Exception
                MsgBox("Il form " & nomeForm & " non esiste!")
            End Try
        End Sub
    End Class
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Xlibfrank2017 : ti consiglierei di leggere uno o più tutorial sulla reflection per risolvere il tuo quesito, questo può essere uno : https://www.pierotofy.it/pages/guide/Guida_al_Visual_Basic_dotNET/La_Reflection_Parte_I/
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    Hai ragione … progetto nuovo come hai detto tu … funziona … nel mio no …

    C'è qualcosa che dovrei sapere relativo alla gestione dei Parent ?

    Tutti i Form che apro indico che sono figli del Form principale (per essere aperti tutti all'interno del Form padre).

    Se faccio così però funziona :
    
    If LINKTABELLA = "VALUTE" Then
                FVALUTE.Show()
                Exit Sub
    End If
    
    E' che voglio evitare tutti gli If per controllare quale Form aprire in base a LINKTABELLA …
  • Re: RICHIAMARE UN FORM CON NOME VARIABILE

    gian82 ha scritto:


    Xlibfrank2017 : ti consiglierei di leggere uno o più tutorial sulla reflection per risolvere il tuo quesito, questo può essere uno : https://www.pierotofy.it/pages/guide/Guida_al_Visual_Basic_dotNET/La_Reflection_Parte_I/
    Non sono ancora a quel livello … speravo fosse più semplicemente associabile un nome ad un Form e richiamarlo …
    Proverò a capirci qualcosa … spero …

    Grazie
Devi accedere o registrarti per scrivere nel forum
17 risposte