2013-07-24 27 views
5

Sto lottando per capire come passare i valori tra le forme. Ho quattro moduli e voglio passare le informazioni recuperate dallo Login alla quarta e ultima forma.Passaggio di valori tra Windows Form C#

Questo è quello che ho finora.

In questa funzione:

private void btnLogin_Click(object sender, EventArgs e) 

ho deserializzati i dati che voglio in questo modo:

NewDataSet resultingMessage = (NewDataSet)serializer.Deserialize(rdr); 

Poi, quando chiamo il modulo successivo ho fatto questo:

Form myFrm = new frmVoiceOver(resultingMessage); 
myFrm.Show(); 

Quindi, il mio modulo VoiceOver si presenta così:

Quando eseguo il debug, è possibile vedere i dati nel loginData nel secondo modulo, ma non riesco ad accedervi nell'evento btnVoiceOverNo_Click. Come posso accedervi così posso passarlo al modulo successivo?

+2

È necessario un membro di frmVoiceOver a cui si passa loginData. Qualcosa come _loginData = loginData, dove _loginData esiste nella classe form come NewDataSet _loginData. –

+1

possibile duplicato di [passaggio di valori tra moduli (winforms)] (http://stackoverflow.com/questions/3062575/passing-values-between-forms-winforms) –

+0

Il login e i moduli appartengono alla stessa applicazione (exe)? Se è così, non c'è bisogno di serializzazione/deserializzazione: le buone vecchie proprietà semplici funzioneranno. Sembra anche che la logica "pull" (le forme chiedono Login per le informazioni) sia migliore qui della logica "push" quando Login invia i dati nei moduli. –

risposta

11

È necessario inserire loginData in una variabile locale all'interno della classe frmVoiceOver per poter accedere ad esso da altri metodi. Attualmente è ambito al costruttore:

class frmVoiceOver : Form 
{ 
    private NewDataSet _loginData; 

    public frmVoiceOver(NewDataSet loginData) 
    { 
     _loginData = loginData; 

     InitializeComponent(); 
    } 

    private void btnVoiceOverNo_Click(object sender, EventArgs e) 
    { 
     // Use _loginData here. 
     this.Close(); 
     Form myFrm = new frmClipInformation(); 
     myFrm.Show(); 
    } 
} 

Inoltre, se le due forme sono nello stesso processo probabilmente non c'è bisogno di serializzare i dati e può semplicemente passarla come standard di riferimento al costruttore del form.

Google qualcosa come "C# variable scope" per capire di più in questo settore come si incontrerà il concetto tutto il tempo. Apprezzo che tu sia autodidatta, quindi sto solo cercando di sostenerlo :-)

3

In varie situazioni potremmo aver bisogno di passare valori da un modulo ad un altro quando si verifica qualche evento. Ecco un semplice esempio di come è possibile implementare questa funzionalità.

Si consideri che esistono due forme Form1 e Form2 in cui Form2 è figlio di Form1. Entrambe le forme hanno due caselle di testo in cui ogni volta che il testo viene modificato nella casella di testo di Form2, la casella di testo di Form1 viene aggiornata.

seguito è il codice di Form1

private void btnShowForm2_Click(object sender, EventArgs e) 
{ 
    Form2 form2 = new Form2();    
    form2.UpdateTextBox += new EventHandler<TextChangeEventArgs>(txtBox_TextChanged); 
    form2.ShowDialog();   
} 

private void txtBox_TextChanged(object sender, TextChangeEventArgs e) 
{ 
    textBox1.Text = e.prpStrDataToPass;    
} 

seguito è il codice di Form2

public event EventHandler<TextChangeEventArgs> UpdateTextBox; 

private string strText; 

public string prpStrText 
{ 
    get { return strText; }   
    set 
    { 
      if (strText != value) 
      { 
       strText = value; 
       OnTextBoxTextChanged(new TextChangeEventArgs(strText)); 
      } 
    } 
} 

private void textBox_Form2_TextChanged(object sender, EventArgs e) 
{ 
    prpStrText = txtBox_Form2.Text; 
} 

protected virtual void OnTextBoxTextChanged(TextChangeEventArgs e) 
{    
    EventHandler<TextChangeEventArgs> eventHandler = UpdateTextBox; 
    if (eventHandler != null) 
    { 
      eventHandler(this, e); 
    } 
} 

Per superare i valori che dovremmo memorizzare i dati in una classe che è derivato da EventArgs

public class TextChangeEventArgs : EventArgs 
{ 
    private string strDataToPass; 

    public TextChangeEventArgs(string _text) 
    { 
     this.strDataToPass = _text; 
    } 

    public string prpStrDataToPass 
    { 
     get { return strDataToPass; } 
    } 
} 

Ora ogni volta che il testo cambia in Form2, lo stesso testo viene aggiornato nella casella di testo di Form1.

Problemi correlati