Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [vb.net]Passaggio parametri da form figlio a form padre

    Ciao a tutti
    ho un'applicazione in cui devo passare dei valori dal form figlio (frmOrdiniNuovo in questo caso) al form padre (che sarebbe il main). Come posso fare? qualcuno ha qualche idea?

    frmOrdiniNuovo.MdiParent = Me
    frmOrdiniNuovo.Show()

    Grazie
    Yu

  2. #2
    Utente di HTML.it L'avatar di fu510n
    Registrato dal
    Sep 2005
    Messaggi
    137
    I parametri devono essere passati in fase di chiusura del figlio?

    Puoi sempre fare riferimento alla proprietà MdiParent del form figlio.

    Facciamo un esempio (Di seguito i due form e le caselle di testo in essi contenute):

    Form padre: frmPadre
    -------------------------------
    txtProva (TextBox)

    Form figlio: frmFiglio
    -------------------------------
    txtParametro (TextBox)

    codice:
    Private Sub frmFiglio_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        DirectCast(Me.MdiParent, frmPadre).txtProva.Text = Me.txtParametro.Text
    End Sub

    Cosa succede in questo caso? Il form figlio, prima di chiudersi, imposta il testo di txtProva nel form padre con lo stesso valore contenuto in txtParametro.

    Spero che tu abbia capito... così me lo spieghi hahahahahahah
    Fusion

    Currency Text Box (Updated: 16 Maggio 2008): http://digilander.libero.it/cmfusion/CurrencyTextBox.html

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Però in questo caso, il frmFiglio è obbligato a conoscere sia il controllo che il nome del frmPadre, perchè contiene dei riferimenti espliciti ad essi, il che non va molto d'accordo con l'incapsulazione e la riusabilità.
    Per intenderci, se un domani volessi usare il frmFiglio in un altro progetto, dovrei andare a modificare la routine frmFiglio_FormClosing.
    Non è gravissimo, ma supponiamo di aver utilizzato lo stesso metodo molte volte e su diversi form...
    Il lavoro per andare a modificare tutte le routine potrebbe essere non banale.

    Diventa più semplice gestire la proprietà (o la variabile) del frmFiglio esclusivamente dal frmPadre.
    Nel codice seguente mostro come scrivere e leggere un valore da frmFiglio:

    Per semplicità creiamo in frmFiglio una variabile pubblica MyVar
    codice:
        Public MyVar As String = ""
    Da frmPadre, quando apro frmFiglio, posso valorizzare la variabile MyVar, modificarla mentre sono in frmFiglio, e quando chiudo il form rileggo il valore di MyVar modificato:

    codice:
        Private Sub cmdApriFiglio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdApriForm2.Click
            Dim newForm = New frmFiglio()
            REM Passo il valore alla variabile MyVar nel nuovo form
            newForm.MyVar = txtVarDaPassare.Text
            newForm.ShowDialog()
            REM Leggo il valore restituito
            txtVarDaPassare.Text = newForm.MyVar
        End Sub
    Come si può notare, frmFiglio resta indipendente da frmPadre nel senso che se lo uso in un altro progetto non devo apportare alcuna modifica, perchè appunto non esiste alcun riferimento esplicito né al controllo né al nome del form chiamante (frmPadre).

    Ciao

  4. #4
    Utente di HTML.it L'avatar di fu510n
    Registrato dal
    Sep 2005
    Messaggi
    137
    Sono d'accordo sulla riusabilità e tutto il resto ma... mi sorge un dubbio.

    Innanzitutto ho l'obbligo di richiamare il form figlio con un ShowDialog, il che non è possibile in questo caso in quanto si parla di un MdiChild.
    Seconda cosa, anche in questo modo, quando vado a richiamare "NewForm.MyVar" il form è già chiuso... persi gli handle, distrutti gli oggetti ecc... rischio di trovarmi un "NewForm" uguale a "Nothing" e incappare in una NullReferenceException. O sbaglio?
    Fusion

    Currency Text Box (Updated: 16 Maggio 2008): http://digilander.libero.it/cmfusion/CurrencyTextBox.html

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da fu510n
    Sono d'accordo sulla riusabilità e tutto il resto ma... mi sorge un dubbio.
    Mi pare cosa buona e giusta...

    Originariamente inviato da fu510n Innanzitutto ho l'obbligo di richiamare il form figlio con un ShowDialog, il che non è possibile in questo caso in quanto si parla di un MdiChild.
    Qui hai ragione al 100%, e premetto che non ho detto che il tuo codice è sbagliato (lo dico perchè non vorrei essere frainteso!).
    Però c'è un punto che anche yuripace dovrebbe tenere presente e che fa parte più della logica sulla modalità di implementazione, che sull'implementazione stessa del codice.
    Mi spiego: a noi (io e te) non è dato sapere esattamente perchè e quando il frmFiglio deve restituire un valore al frmPadre, e questo è quello che fa la differenza tra il tuo esempio ed il mio.
    In genere (non sempre), quando si restituisce un valore significa che quel valore deve servire a fare qualcosa in qualche altra parte del programma. Ora, se l'utente non chiude il form (e può farlo dato che è un MDIChild) come faccio a conoscere se e quando il valore è stato modificato o meno? Quindi il mio esempio nasce dal dubbio: siamo proprio sicuri che serva un form MDIChild in questo caso specifico?
    Ciò nonostante, può essere che io sia fuori strada, ed allora il tuo esempio è perfetto ed il mio invece è da buttare.

    Forse è un mio limite (anzi sicuramente sarà così) ma sinceramente mi è difficile pensare che è indifferente il quando l'utente chiuderà il form, e di conseguenza il quando il valore di quella variabile o proprietà sarà modificato.
    Non conoscendo però i dettagli dell'applicazione, a cosa serve quell'impostazione, ecc. è difficile dirlo con esattezza.

    Originariamente inviato da fu510n
    Seconda cosa, anche in questo modo, quando vado a richiamare "NewForm.MyVar" il form è già chiuso... persi gli handle, distrutti gli oggetti ecc... rischio di trovarmi un "NewForm" uguale a "Nothing" e incappare in una NullReferenceException. O sbaglio?
    E' palese che se il form è MDIChild hai perfettamente ragione, ma il mio esempio non funzionerebbe nemmeno perchè non potrò aprire un child in modale.

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.