Scambio di informazioni tra form

di il
6 risposte

Scambio di informazioni tra form

Ciao a tutti, apro questo argomento per chiedervi un aiuto in merito al passaggio di informazioni tra form.
Faccio un esempio.
Ipotizziamo di avere due form chiamati "Form3" e "Form4"; in entrambi i form ci sono una textbox ed un bottone.
Al click del bottone di "Form3" vorrei che il testo inserito nella textbox sia copiato nella textbox di "Form4" e viceversa. Ho provato in questo modo ma ad ogni click del bottone mi viene aperto un nuovo form con il testo inserito mentre io vorrei che lo scambio del testo avvenisse senza l'apertura di nuovi form.
Public Class Form3
    Private Sub B_Form3_Click(sender As Object, e As EventArgs) Handles B_Form3.Click
        Dim Form_Secondario As New Form4
        Form_Secondario.Show()

        Form_Secondario.TB_Form4.Text = TB_Form3.Text
    End Sub
End Class
Public Class Form4
    Private Sub B1_Form4_Click(sender As Object, e As EventArgs) Handles B1_Form4.Click
        Dim Form_Principale As New Form3
        Form_Principale.Show()

        Form_Principale.TB_Form3.Text = TB_Form4.Text
    End Sub
End Class
Secondo voi come dovrei fare?
Grazie mille, ciao.

6 Risposte

  • Re: Scambio di informazioni tra form

    È pacifico che se in Form4 dichiari una [New Form3], della precedente Form3 non hai riferimenti. Secondo me devi fare attenzione a non confondere il concetto di Oggetto con quello di Classe.

    Per risolvere problematiche simili, io mi son trovato comodo a dichiarare una proprietà di tipo Form3 nella classe Form4 e passare il riferimento dopo la creazione:
    
    Public Class Form3
        Private Sub B_Form3_Click(sender As Object, e As EventArgs) Handles B_Form3.Click
            Dim Form_Secondario As New Form4
            Form_Secondario.Chiamante = Me    'assegno il riferimento
            Form_Secondario.TB_Form4.Text = TB_Form3.Text
            Form_Secondario.Show()    'forse ShowDialog() sarebbe più appropriato...
            If Form_Secondario.DialogResult = DialogResult.Ok Then     'Aggiorno il dato solo se ho clicckato sul bottone corretto di Form_Secondario
                TB_Form3.Text = Form_Secondario.TB_Form4.Text
            End If
        End Sub
    End Class
    Public Class Form4
        Public Property Chiamante As Form3
        Private Sub B1_Form4_Click(sender As Object, e As EventArgs) Handles B1_Form4.Click
            Me.DialogResult = DialogResult.Ok  'Magari valutare l'uso di DialogResult.Yes
            Me.Close
        End Sub
    End Class
    
    Così, dall'istanza di Form3, creai una nuova Form4 e ne inizializzi il valore della TextBox. Se cliccki sul bottone appropriato ritorni DialogResult.Ok. Se c'è l'ok, aggiorni il dato nella Form 3 da cui sei partito.

    Magari esistono strade più eleganti, ma con questa non mi trovo male.
    Nel tua caso specifico comunque il riferimento al chiamante non serve... Infatti non lo uso. XD

    A volerlo usare, si poteva aggiustare ad esempio: [Code]Private Sub B1_Form4_Click(sender As Object, e As EventArgs) Handles B1_Form4.Click Chiamante.TB_Form3.Text = TB_Form4.Text End Sub e togliendo l'ultimo If in Form3
  • Re: Scambio di informazioni tra form

    Ok io l'avrei fatta ancora piu semplice

    nel button del form A

    FormB.Textbox1.Text = Textbox1.Text ( in questo modo avrai nella Textbox1 del FormB il testo della Textbox del FormA)

    Viceversa da A a B sostanzialmente basta specificare su che form si trova il controllo ed hai risolto
  • Re: Scambio di informazioni tra form

    orione1976 ha scritto:


    Ok io l'avrei fatta ancora piu semplice
    Accedere direttamente da un Form ai controlli di un altro Form non è in generale una buona idea: sembra più semplice all'inizio, ma poi l'architettura - soprattutto se incrociata - diventa inscindibile dall'interfaccia grafica, indistinguibile dalla stessa e crea una rete di fitte dipendenze che portate a un certo livello finiscono per complicarla l'architettura, al posto di renderla più semplice.

    Se la TextBox del secondo Form veicola una informazione specifica, io renderei tale TextBox privata e inaccessibile e fornirei delle proprietà con cui leggere il valore (o dei metodi), consentendo quindi al Form secondario di "proteggere" il controllo visuale e la logica che porta dall'estrazione del testo dalla casella alla fornitura della stringa come valore.

    Rimanendo in questo modo l'implementazione del Form "privata" e sigillata, potrà essere modificata in qualsiasi modo si ritenga opportuno, senza doversi preoccupare di aggiornare possibile codice dipendente.

    E' necessario avere ben chiara la OOP e i relativi corollari per strutturare correttamente il codice.

    Ciao!
  • Re: Scambio di informazioni tra form

    Concordo con chi suggerisce di tenere staccate le Form, ovvero evitare di aggiornare i campi di una form da codice che risiede in una form diversa

    Quando devo fare qualcosa di questo tipo, di solito lavoro con gli eventi: al cambiare del valore nella textox della Form4 si scatena un evento intercettato dalla Form3 che si occupa di aggiornare i propri dati. I parametri (es: contenuto della textbox) vengono passati nei parametri dell'evento, così da disaccopiare i controlli

    Di norma tendo anche a dare nomi significativi agli eventi: anzichè Form4_Text1, chiamarlo RagioneSocialeCambiata (o quel che è).


    Quando questo comportamento risulta troppo brigoso da ottenere (registrazione/deregistrazione eventi in troppe parti del codice), passo alla gestione delle code: quando cambia il testo della textbox, mettiamo il valore nella coda. Chi è registrato per riceverlo, lo scoda e lo elabora. Di norma si nota un delay più alto negli aggiornamenti rispetto agli eventi, però tutto sommato funziona

    Vedi un pò te se usare una di queste alternative
  • Re: Scambio di informazioni tra form

    Mah, non capisco perchè... ma non dico che avete torto, semplicemente non comprendo... è una cosa che vb.net consente e almeno io non ho mai notato ne ralentamenti ne problemi di trasposto dati, ovviamente parliamo di portare il txt di una textbox quindi non è una cosa stratosferica.... infondo l'utente chiedeva alla pressione di un bottone di passare un campo da una parte all'altra... poi ovvio che se deve fare altre 100 cose allora il discorso cambia no?
  • Re: Scambio di informazioni tra form

    La strada che stai facendo "funziona", quindi in fin dei conti va bene.

    Quello che ti stiamo suggerendo è un qualcosa che ti aiuta a rendere più manutenibile il codice.
    Ci metti di più a scriverlo la prima volta, devi imparare magari argomenti nuovi (eventi o code)... Però nel lungo periodo ne hai dei vantaggi, specie se l'applicazione cresce.

    Finchè resta un'applicazione da due form e/o un esercizio, allora va benissimo anche come stai facendo
Devi accedere o registrarti per scrivere nel forum
6 risposte