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.
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 }