2013-06-01 1 views
5

Sto cercando di cambiare il valore di una casella di testo si trova nellacasella di testo Modifica da un'altra classe

public partial class Form1 : Form 

da un'altra classe. Ho provato qualcosa di simile

public void echo(string text) 
{ 
    this.textBox1.AppendText(text + Environment.NewLine); 
} 

da un'altra classe che sto chiamando come

Form1 cout = new Form1(); 
cout.echo("Does this work?"); 

E ho uscita vuota. Ho anche provato ad aggiungere la parola chiave static al metodo echo, ma ho ottenuto lo stesso risultato. Ho cercato su Stack   Overflow e non ho trovato alcuna soluzione per funzionare. E una cosa che mi innesca, se aggiungo lo cout.Show() lo stesso modulo compare con il contenuto valido di textBox1. Perché?

Perché non viene visualizzato subito il contenuto? E come posso risolvere questo?

risposta

10

Ogni volta che si dicono nuova Form1(), si sta creando un'istanza distinta e separata di quella forma.Invece, è necessario creare una variabile nella classe che si sta tentando di accedere al modulo. Ad esempio, passiamo nel costruttore:

public class MyClass { 
    public Form1 MyForm; 

    public MyClass(Form1 form){ 
     this.MyForm = form; 
    } 

    public void echo(string text) { 
     this.MyForm.textBox1.AppendText(text + Environment.NewLine);    
    } 

} 

noti che si accede al caso particolare di Form1 nel metodo eco:

public void echo(string text) { 
    this.MyForm.textBox1.AppendText(text + Environment.NewLine); 
} 
+0

Aham, ottenuto che. Tutti voi ragazzi mi avete dato la risposta giusta e la spiegazione del perché questo sta accadendo, ma dal momento che nFreeze ha scritto una soluzione per questo, segnerò la sua risposta come corretta. Grazie a tutti! – Dejano

+1

È inoltre necessario modificare "modificatori" in "Pubblico" per la casella di testo. – Hadron

4

Il problema è qui:

Form1 cout = new Form1() ; 
cout.echo("Does this work?"); 

si sta creando una nuova versione del modulo principale, Form1.

Cos'è questa altra classe, e come viene istanziata?

Sono disponibili due opzioni:

  1. Quando il codice nel Form1 crea la classe, gli do un esempio per this, e chiamare il metodo di echo su quel riferimento (l'unica) istanza di Form1.

  2. Aggiungere un event a questa altra classe, che viene attivata quando desidera fornire alcune informazioni. Il tuo codice Form1 registrerà un gestore di eventi su questo evento e effettuerà la chiamata allo echo stesso, quando l'evento verrà attivato.

0

Si sta creando un nuovo Form1. Il motivo per cui appare quando chiami Show() è perché stai mostrando la nuova finestra che hai creato. Non sono sicuro di quale sia il tuo reale intento, perché non so da dove lo chiami, ma quello che vuoi fare è chiamare lo echo per il Form1 che è già stato creato.

1

Invece di provare a utilizzare coutMessageBox.Show("Does this work?");

Ora l'invio di valore di testo da una forma all'altra.

protected void btnNext_Click(object sender, EventArgs e) 
{ 
    MyForm2 x = new MyForm2(); 
    x.Query = "My Query"; // here "Query" is your custom public string variable on form2 
    x.Show() 
} 
1

Non è necessario creare un altro oggetto di Form1.

provare questo codice e penso, si indovina che cosa sta accadendo:

Form1 cout = new Form1(); 
cout.Show(); 
cout.echo("Does this work?");