Come aggiornare la casella di testo in form1 da form2?

Ho 2 Windows Form.

In primo luogo, il modulo della finestra principale, ha una casella di testo multilinea e un pulsante. Il pulsante apre il secondo modulo in cui posso aggiungere dati all’array utilizzando l’object AddEntry.

Nel secondo modulo ho caselle di testo e un pulsante (btnAddEntry) che dovrebbe aggiornare il contenuto della casella di testo dal primo modulo.

Quando i dati sono inseriti voglio visualizzare i dati nella casella di testo dal primo modulo.

Il problema è che il codice che ho trovato non sembra funzionare.

Come potrei risolvere questo?

Per far funzionare i BASIC, procedi come segue. Crea un nuovo progetto. Niente del tuo codice corrente, windows, ecc … Il progetto predefinito creerà un modulo “Form1” lasciandolo solo per ora.

Aggiungi un nuovo modulo al progetto, verrà impostato automaticamente su “Form2” … Metti una singola casella di testo su di essa e un singolo pulsante su di esso. Per i sorrisi e il chiarimento per distinguere tra i nomi degli oggetti, cambiare il nome dei controlli su Form2 in “txtOnForm2” e “btnOnForm2” (maiuscole e minuscole per il mio esempio e leggibilità vs “txtonform2” in minuscolo). Ora, nel modulo, fai clic con il pulsante destro del mouse e fai clic su “Visualizza codice”. Ti porterà all’altra dichiarazione “Classe parziale” in cui vengono trovati i tuoi costruttori. Aggiungi quanto segue, non preoccuparti degli errori di compilazione come l’altra metà sarà quando inseriremo il codice in Form1 successivo …

// specifically typecasting the TYPE of form being passed in, // not just a generic form. We need to see the exposed elements Form1 CalledFrom; // Ensure to do the : this() to make sure default behavior // to initialize the controls on the form are created too. public Form2(Form1 viaParameter) : this() { CalledFrom = viaParameter; } private void btnOnForm2_Click(object sender, EventArgs e) { CalledFrom.ValuesByProperty = this.txtOnForm2.Text; MessageBox.Show( "Check form 1 textbox" ); string GettingBack = CalledFrom.ValuesByProperty; MessageBox.Show( GettingBack ); CalledFrom.SetViaMethod( "forced value, not from textbox" ); MessageBox.Show( "Check form 1 textbox" ); GettingBack = CalledFrom.GetViaMethod(); MessageBox.Show( GettingBack ); } 

Salvare e chiudere la finestra di progettazione e il codice di Form2.

Ora, apri Form1. Metti una singola casella di testo e un solo pulsante. I nomi predefiniti per i controlli saranno rispettivamente “textbox1” e “button1”. Lascia stare così com’è. Fare doppio clic sul pulsante (su form1). Verrà visualizzato uno snippet per il codice per quel pulsante. Incolla quanto segue

 private void button1_Click(object sender, EventArgs e) { Form2 oFrm = new Form2(this); oFrm.Show(); } public string ValuesByProperty { get { return this.textBox1.Text; } set { this.textBox1.Text = value; } } public void SetViaMethod(string newValue) { this.textBox1.Text = newValue; } public string GetViaMethod() { return this.textBox1.Text; } 

Ora, salva i moduli ed eseguili. Fare clic sul pulsante sul primo modulo, chiama il secondo con l’istanza già creata di se stesso, non una nuova istanza SECONDO di se stessa. Verrà visualizzato il secondo modulo. Sposta le windows in modo da poter vedere entrambi.

Inserisci del testo nella seconda finestra della casella di testo e fai clic sul pulsante … segui l’avanti / indietro di ciò che sta arrivando / andando.

Questa è stata la risposta altre volte, principi simili …

Dai un’occhiata a una domanda simile

Per informazioni “pass-back” da: Form2 a Form1, è necessario creare un metodo pubblico su di esso per esporre ciò che si desidera toccare. Quindi, dal secondo modulo (che in pratica ha un’istanza del puntatore al primo, chiama quel metodo con qualsiasi cosa tu voglia fare / agisci. Ciò potrebbe anche essere fatto con una proprietà pubblica su cui agire.

Da quello che potresti aver già funzionato …

 public partial class YourFirstForm { // example to expose a method on first form and pass IN a value public void SetMyObject( string ValueFromSecondForm ) { this.txtBox1.Text = ValueFromSecondForm; } // example via a property you are trying to set... identical in results public string ViaSetAsProperty { set { this.txtBox1.Text = value; } } // Now, the reverse, lets expose some things from form 1 to the second... public string GetMyObjectText() { return this.txtBox1.Text; } // or via a GETTER property... public string GettingText { get { return this.txtBox1.Text; } } // However, if you want to allow both set and get to form 1's values, // do as a single property with both getter / setter exposed.. public string TextContent { get { return this.txtBox1.Text; } set { this.txtBox1.text = value; } } } 

Ora, per come ottenere dal tuo SECONDO modulo

public partial class YourSecondForm {Form ObjRefToFirstForm;

 public YourSecondForm( Form passedInVar ) { // preserve the first form ObjRefToFirstForm = passedInVar; } // Now, however you want to handle... via a button click, the text change event, etc public void SendDataToForm1() { // via calling the METHOD on form 1 that is public ObjRefToFirstForm.SetMyObj( this.SomeOtherTextbox.Text ); // via a SETTER on form 1 ObjRefToFirstForm.ViaSetAsProperty = this.SomeOtherTextbox.Text; // sample to GET something from form 1 via method string TestGet = ObjRefToFirstForm.GetMyObjectText(); // or from the exposed property TestGet = ObjRefToFirstForm.GettingText; // Now, try via the one property that has both a setter and getter ObjRefToFirstForm.TextContent = this.SomeOtherTextbox.Text; TestGet = ObjRefToFirstForm.TextContent; } 

}

Speriamo che questo esponga i modi per ottenere e impostare il contenuto tra le forms per voi … sia come metodo () approccio e / o ottenere / impostare tramite proprietà.

Il tuo problema è che MainWindow mainWindow = new MainWindow () crea una nuova versione della tua MainWindow non un riferimento alla versione già esistente. Nel tuo modulo MainWindow, quando apri il tuo secondo modulo devi passare un riferimento al secondo modulo passandolo nel metodo Show (che lo memorizza in una variabile chiamata owner of type object) in questo modo:

 AddEntryWindow addEntryWindow = new AddEntryWindow(); addEntryWindow.ShowDialog(this); 

Quindi puoi fare riferimento alla casella di testo in questo modo:

 foreach (AddEntry list in addedEntry) { // Displaying and formating the output in text box in MainWindow. ((MainWindow)owner).txtDisplayFileContent.Text += txtUserName.Text; }