Quiero pasar valores entre dos formularios (c #). ¿Cómo puedo hacerlo?
Tengo dos formas: Form1 y Form2.
Form1 contiene un botón. Cuando hago clic en ese botón, Form2 debería abrirse y Form1 debería estar en modo inactivo (es decir, no seleccionable).
Form2 contiene un cuadro de texto y un botón de envío. Cuando escribo cualquier mensaje en el cuadro de texto de Form2 y hago clic en el botón enviar, Form2 debería cerrarse y Form1 debería resaltarse con el valor enviado.
¿Cómo puedo hacerlo? ¿Alguien puede ayudarme a hacer esto con un ejemplo simple?
c#
winforms
modal-dialog
Nagu
fuente
fuente
Respuestas:
Hay varias soluciones para esto, pero este es el patrón que suelo usar.
// Form 1 // inside the button click event using(Form2 form2 = new Form2()) { if(form2.ShowDialog() == DialogResult.OK) { someControlOnForm1.Text = form2.TheValue; } }
Y...
// Inside Form2 // Create a public property to serve the value public string TheValue { get { return someTextBoxOnForm2.Text; } }
fuente
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(textBox1.Text); frm2.Show(); }
public Form2(string qs) { InitializeComponent(); textBox1.Text = qs; }
fuente
public Form2(string qs):this(){}
el formulario no se mostrará bien.Definir una propiedad
public static class ControlID { public static string TextData { get; set; } }
En el
form2
private void button1_Click(object sender, EventArgs e) { ControlID.TextData = txtTextData.Text; }
Obtener los datos
form1
yform3
private void button1_Click(object sender, EventArgs e) { string text= ControlID.TextData; }
fuente
Después de una serie de dificultades para pasar los datos de un formulario a otro, finalmente encontré una respuesta estable. Funciona a las mil maravillas.
Todo lo que necesita hacer es declarar una variable como
public static datatype 'variableName'
en un formulario y asignar el valor a esta variable que desea pasar a otro formulario y llamar a esta variable en otro formulario usando directamente el nombre del formulario ( No cree el objeto de este formulario como se puede acceder directamente a las variables estáticas ) y acceder a este valor de variable.Ejemplo de esto es,
Formulario 1
public static int quantity; quantity=TextBox1.text; \\Value which you want to pass
Form2
TextBox2.Text=Form1.quantity;\\ Data will be placed in TextBox2
fuente
Declare una cadena pública en
form1
public string getdata;
En el botón de
form1
form2 frm= new form2(); this.hide(); form2.show();
Para enviar datos
form1
, puede probar cualquier evento y código siguiente en ese eventoform1 frm= new form1(); form1.getdata="some string to be sent to form1";
Ahora, después de cerrar
form2
y abrirform1
, puede usar los datos devueltos en unagetdata
cadena.fuente
He trabajado en varios proyectos de winform y a medida que las aplicaciones se vuelven más complejas (más diálogos e interacciones entre ellas), comencé a usar algún sistema de eventos para ayudarme, porque la administración de abrir y cerrar ventanas manualmente será difícil de mantener y desarrollar más.
He usado CAB para mis aplicaciones, tiene un sistema de eventos, pero podría ser excesivo en tu caso :) Podrías escribir tus propios eventos para aplicaciones más simples
fuente
declarar cadena en form1 cadena pública TextBoxString;
en formulario 1 clic evento agregar
private void button1_Click(object sender, EventArgs e) { Form1 newform = new Form1(); newform = this; this.Hide(); MySecform = new Form2(ref newform); MySecform.Show(); }
en form2 constructer
public Form2(ref Form1 form1handel) { firstformRef = form1handel; InitializeComponent(); }
en form2 variable de caja Form1 firstformRef;
private void Submitt_Click(object sender, EventArgs e) { firstformRef.TextBoxString = textBox1.Text; this.Close(); firstformRef.Show(); }
fuente
Form1
? ¿Por qué no pasarthis
alForm2
constructor?Código 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 }
Código 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(); }
¡Funciona!
fuente
En este código, pasa un texto a Form2. Form2 muestra ese texto en textBox1. El usuario escribe texto nuevo en textBox1 y presiona el botón enviar. Form1 toma ese texto y lo muestra en un cuadro de texto en 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; } } }
Y este es el código 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(); } }
fuente
Ok, entonces
Form1
tiene un cuadro de texto, en primer lugar, debe configurar esteForm1
cuadro de texto como público en la propiedad del cuadro de texto.Formulario de código 1:
Public button1_click() { Form2 secondForm = new Form2(this); secondForm.Show(); }
Pase
Form1
comothis
en el constructor.Formulario de código 2:
Private Form1 _firstForm; Public Form2(Form1 firstForm) { _firstForm = firstForm: } Public button_click() { _firstForm.textBox.text=label1.text; This.Close(); }
fuente
puedes pasar como parámetro el cuadro de texto del Form1, así:
En el controlador de botones de Form 1:
private void button2_Click(object sender, EventArgs e) { Form2 newWindow = new Form2(textBoxForReturnValue); newWindow.Show(); }
En la Form 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(); }
fuente
Los constructores son las mejores formas de pasar datos entre formularios u objetos Gui. Puede hacer esto. En el botón formulario 1 clic debe tener:
Form1.Enable = false; Form2 f = new Form2(); f.ShowDialog();
En el formulario 2, cuando el usuario hace clic en el botón, debe tener un código como este o similar:
this.Close(); Form1 form = new Form1(textBox1.Text) form.Show();
Una vez dentro de la carga del formulario del formulario 1, puede agregar código para hacer cualquier cosa a medida que obtiene los valores del constructor.
fuente
Cómo pasar los valores de un formulario a otro formulario
1.) Vaya a Form2 y luego haga doble clic en él. En el código, escriba esto.
public Form2(string v) { InitializeComponent(); textBox1.Text = v; }
2.) Vaya a Form1 y luego haga doble clic en él. En el código, escriba esto. // En su botón de comando en Form1
private void button1_Click(object sender, EventArgs e) { Form2 F2 = new Form2(textBox1.Text); F2.Show(); }
fuente
Esto es muy simple. suponga que tiene 2 formularios de ventana Form1 y Form2 y desea enviar el registro de textbox1 de Form1 a Form2 y mostrar este registro en label1 de Form2; luego en Form2 cree una etiqueta cuyo nombre sea label1 y vaya a la propiedad de label1 y establezca 'Modifiers' = public y en el Formulario uno cree un textBox con id textBox1 y un botón de nombre enviar y luego escriba el siguiente código en el evento de clic de botón
button1_Click(object sender, EventArgs e) { Form2 obj=new Form2(); obj.label1.text=textBox1.text.ToString(); obj.show(); }
eso es todo ... de esta manera puede vincular el registro del conjunto de datos a la vista de cuadrícula de datos de otro formulario ...
fuente
Puede utilizar un enfoque diferente si lo desea.
Usando System.Action
Puede pensar en ello como una función de devolución de llamada que se pasa al formulario secundario.
// -------- 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<string> UpdateSettings = null; // IN THE CHILD FORMS CONSTRUCTOR public Options(Action<string> UpdateSettings) { InitializeComponent(); this.UpdateSettings = UpdateSettings; } private void btnUpdate_Click(object sender, EventArgs e) { // CALLING THE CALLBACK FUNCTION if (UpdateSettings != null) UpdateSettings("some data"); }
Método OpenForms
Este método es fácil ( 2 líneas ). Pero solo funciona con formularios abiertos. Todo lo que necesita hacer es agregar estas dos líneas donde quiera que quiera pasar algunos datos.
Main frmMain = (Main)Application.OpenForms["Main"]; frmMain.UpdateSettings("Some data");
Proporcioné mi respuesta a una pregunta similar aquí.
fuente
Puedes usar esto;
Botón Form1 1 clic
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); this.Hide(); frm2.Show(); }
Y agregue esto a Form2
public string info = "";
Botón Form2 1 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; }
fuente
si cambia la propiedad de modificadores de un control en un formulario a público, otro formulario puede acceder a ese control. 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 }
fuente
¿Qué tal usar un evento público?
Yo lo haría así.
public class Form2 { public event Action<string> SomethingCompleted; private void Submit_Click(object sender, EventArgs e) { SomethingCompleted?.Invoke(txtData.Text); this.Close(); } }
y llámalo desde Form1 así.
private void btnOpenForm2_Click(object sender, EventArgs e) { using (var frm = new Form2()) { frm.SomethingCompleted += text => { this.txtData.Text = text; }; frm.ShowDialog(); } }
Entonces, Form1 podría obtener un texto de Form2 cuando Form2 está cerrado
Gracias.
fuente
// In form 1 public static string Username = Me; // In form 2's load block string _UserName = Form1.Username;
fuente