Invia valori da un modulo a un altro modulo

Voglio passare i valori tra due moduli (c #). Come posso farlo?

Ho due forms: Form1 e Form2.

Form1 contiene un pulsante. Quando clicco su quel pulsante, Form2 dovrebbe aprirsi e Form1 dovrebbe essere in modalità intriggers (cioè non selezionabile).

Form2 contiene una casella di testo e un pulsante di invio. Quando si digita un messaggio nella casella di testo di Form2 e si fa clic sul pulsante di invio, il Form2 dovrebbe chiudersi e Form1 dovrebbe evidenziare con il valore inviato.

Come posso farlo? Qualcuno può aiutarmi a farlo con un semplice esempio.

Ci sono diverse soluzioni a questo, ma questo è lo schema che tendo ad usare.

// Form 1 // inside the button click event using(Form2 form2 = new Form2()) { if(form2.ShowDialog() == DialogResult.OK) { someControlOnForm1.Text = form2.TheValue; } } 

E…

 // Inside Form2 // Create a public property to serve the value public string TheValue { get { return someTextBoxOnForm2.Text; } } 
 private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(textBox1.Text); frm2.Show(); } 

  public Form2(string qs) { InitializeComponent(); textBox1.Text = qs; } 

Definire una proprietà

 public static class ControlID { public static string TextData { get; set; } } 

Nel form2

 private void button1_Click(object sender, EventArgs e) { ControlID.TextData = txtTextData.Text; } 

Ottenere i dati in form1 e form3

 private void button1_Click(object sender, EventArgs e) { string text= ControlID.TextData; } 

Dopo una serie di difficoltà nel passare i dati da una forma all’altra ho finalmente trovato una risposta stabile. Funziona come un fascino.

Tutto quello che devi fare è dichiarare una variabile come public static datatype 'variableName' in un modulo e assegnare il valore a questa variabile che vuoi passare ad un altro modulo e chiamare questa variabile in un altro modulo usando direttamente il nome del modulo ( Do not creare oggetti di questo modulo come variabili statiche accessibili direttamente ) e accedere a questo valore variabile.

Esempio di tale è,

form1

 public static int quantity; quantity=TextBox1.text; \\Value which you want to pass 

form2

 TextBox2.Text=Form1.quantity;\\ Data will be placed in TextBox2 

Dichiara una stringa pubblica in form1

 public string getdata; 

Nel pulsante di form1

 form2 frm= new form2(); this.hide(); form2.show(); 

Per inviare dati a form1 puoi provare qualsiasi evento e codice seguito in quell’evento

 form1 frm= new form1(); form1.getdata="some string to be sent to form1"; 

Ora dopo la chiusura di form2 e l’apertura di form1 , è ansible utilizzare i dati restituiti nella stringa getdata .

dichiarare la stringa in form1 public string TextBoxString;

in form1 fare clic su evento aggiungi

 private void button1_Click(object sender, EventArgs e) { Form1 newform = new Form1(); newform = this; this.Hide(); MySecform = new Form2(ref newform); MySecform.Show(); } 

in form2 constructer

 public Form2(ref Form1 form1handel) { firstformRef = form1handel; InitializeComponent(); } 

in form2 cassa variabile Form1 firstformRef;

 private void Submitt_Click(object sender, EventArgs e) { firstformRef.TextBoxString = textBox1.Text; this.Close(); firstformRef.Show(); } 

Ho lavorato su vari progetti di winform e poiché le applicazioni diventano più complesse (più dialoghi e interazioni tra di esse), ho iniziato a utilizzare un qualche sistema di eventing per aiutarmi, perché la gestione delle windows di apertura e chiusura manualmente sarà difficile mantenere e sviluppare ulteriormente.

Ho usato CAB per le mie applicazioni, ha un sistema di event ma potrebbe essere eccessivo nel tuo caso 🙂 Potresti scrivere i tuoi eventi per le applicazioni più semplici

Codice Form1:

 private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.ShowDialog(); MessageBox.Show("Form1 Message :"+Form2.t.Text); //can put label also in form 1 to show the value got from form2 } 

Codice Form2:

  public Form2() { InitializeComponent(); t = textBox1; //Initialize with static textbox } public static TextBox t=new TextBox(); //make static to get the same value as inserted private void button1_Click(object sender, EventArgs e) { this.Close(); } 

Funziona!

In questo codice, si passa un testo a Form2. Form2 mostra quel testo in textBox1. L’utente digita il nuovo testo in textBox1 e preme il pulsante di invio. Form1 prende quel testo e lo mostra in una casella di testo in Form1.

 public class Form2 : Form { private string oldText; public Form2(string newText):this() { oldText = newText; btnSubmit.DialogResult = DialogResult.OK; } private void Form2_Load(object sender, EventArgs e) { textBox1.Text = oldText; } public string getText() { return textBox1.Text; } private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { DialogResult = System.Windows.Forms.DialogResult.OK; } } } 

E questo è il codice Form1:

 public class Form1:Form { using (Form2 dialogForm = new Form2("old text to show in Form2")) { DialogResult dr = dialogForm.ShowDialog(this); if (dr == DialogResult.OK) { tbSubmittedText = dialogForm.getText(); } dialogForm.Close(); } } 

Come passare i valori dalla forma a un’altra forma

1.) Vai a Form2 quindi fai doppio clic su di esso. Al codice digita questo.

 public Form2(string v) { InitializeComponent(); textBox1.Text = v; } 

2.) Vai a Form1 quindi fai doppio clic su di esso. Al codice digita questo. // Al tuo pulsante di comando in Form1

 private void button1_Click(object sender, EventArgs e) { Form2 F2 = new Form2(textBox1.Text); F2.Show(); } 

puoi passare come parametro la casella di testo del Form1, in questo modo:

Sul gestore del buttom Form 1:

 private void button2_Click(object sender, EventArgs e) { Form2 newWindow = new Form2(textBoxForReturnValue); newWindow.Show(); } 

Nel modulo 2

 public static TextBox textBox2; // class atribute public Form2(TextBox textBoxForReturnValue) { textBox2= textBoxForReturnValue; } private void btnClose_Click(object sender, EventArgs e) { textBox2.Text = dataGridView1.CurrentCell.Value.ToString().Trim(); this.Close(); } 

Questo è molto semplice. si supponga di disporre di 2 windows Form1 e Form2 e si desidera inviare record di textbox1 da Form1 a Form2 e visualizzare questo record in label1 di Form2; quindi in Form2 creare un’etichetta il cui nome è label1 e andare alla proprietà di label1 e impostare ‘Modifiers’ = public e in Form one creare un textBox con id textBox1 e un pulsante di nome submit quindi scrivere il codice seguente sull’evento click del pulsante

 button1_Click(object sender, EventArgs e) { Form2 obj=new Form2(); obj.label1.text=textBox1.text.ToString(); obj.show(); } 

è così … in questo modo è ansible associare il record del set di dati alla vista datagrid di un’altra forma ……

I costruttori sono i modi migliori per passare i dati tra le forms o gli oggetti Gui che puoi fare. Nel pulsante di selezione del modulo1 dovresti avere:

 Form1.Enable = false; Form2 f = new Form2(); f.ShowDialog(); 

Nel modulo 2, quando l’utente fa clic sul pulsante, dovrebbe avere un codice come questo o simile:

 this.Close(); Form1 form = new Form1(textBox1.Text) form.Show(); 

Una volta dentro il caricamento del form del modulo 1, puoi aggiungere del codice per fare qualsiasi cosa quando ottieni i valori dal costruttore.

Puoi usare un approccio diverso se vuoi.

  1. Utilizzo di System.Action (Qui si passa semplicemente la funzione form principale come parametro alla forma figlio come una funzione di callback)
  2. Metodo OpenForms (chiama direttamente uno dei tuoi moduli aperti)

Utilizzando System.Action

Si può pensare ad esso come una funzione di callback passata al modulo figlio.

 // -------- IN THE MAIN FORM -------- // CALLING THE CHILD FORM IN YOUR CODE LOOKS LIKE THIS Options frmOptions = new Options(UpdateSettings); frmOptions.Show(); // YOUR FUNCTION IN THE MAIN FORM TO BE EXECUTED public void UpdateSettings(string data) { // DO YOUR STUFF HERE } // -------- IN THE CHILD FORM -------- Action UpdateSettings = null; // IN THE CHILD FORMS CONSTRUCTOR public Options(Action UpdateSettings) { InitializeComponent(); this.UpdateSettings = UpdateSettings; } private void btnUpdate_Click(object sender, EventArgs e) { // CALLING THE CALLBACK FUNCTION if (UpdateSettings != null) UpdateSettings("some data"); } 

Metodo OpenForms

Questo metodo è facile ( 2 linee ). Ma funziona solo con le forms che sono aperte. Tutto quello che devi fare è aggiungere queste due righe dove vuoi passare alcuni dati.

 Main frmMain = (Main)Application.OpenForms["Main"]; frmMain.UpdateSettings("Some data"); 

Ho fornito la mia risposta a una domanda simile qui

Ok, quindi Form1 ha una casella di testo, prima di tutto devi impostare questa casella di testo Form1 come pubblica nella proprietà textbox.

Codice Form1:

 Public button1_click() { Form2 secondForm = new Form2(this); secondForm.Show(); } 

Passare Form1 come this nel costruttore.

Codice Form2:

 Private Form1 _firstForm; Public Form2(Form1 firstForm) { _firstForm = firstForm: } Public button_click() { _firstForm.textBox.text=label1.text; This.Close(); } 

Puoi usare questo;

Modulo1 clic1

 private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); this.Hide(); frm2.Show(); } 

E aggiungi questo a Form2

 public string info = ""; 

Pulsante Form1 clic

 private void button1_Click(object sender, EventArgs e) { info = textBox1.Text; this.Hide(); BeginInvoke(new MethodInvoker(() => { Gogo(); })); } public void Gogo() { Form1 frm = new Form1(); frm.Show(); frm.Text = info; } 

Semplice ottenere il valore con:

 var form1 = new Form1(); string sample = form1.examplestring; 

Per impostare il valore:

 var form1 = new Form1(); form1.examplestring = example; 

ma controlla la stringa come “stringa pubblica”

 public string example = "test"; 

se si modifica la proprietà modificatori di un controllo in un modulo su Pubblico, un altro modulo può accedere a tale controllo. fe:

  Form2 frm; private void Form1_Load(object sender, EventArgs e) { frm = new Form2(); frm.Show(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(frm.txtUserName.Text); //txtUserName is a TextBox with Modifiers=Public }