Enviar valores de un formulario a otro formulario

84

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?

Nagu
fuente
¿Tienes algún ejemplo para esto?
Millar

Respuestas:

58

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; }
}
Jesper Palm
fuente
Pensé que esto era un código de conducta incorrecto. Entonces esto es genial. También
usaré
Bueno, no creo que sea una mala "conducta", sin embargo, hay implicaciones de seguridad a considerar antes de usar este patrón. (Pero, gran ejemplo simple +1)
1
Además, no olvide que también deberá tener en form2 en lugar de form2.Close (); use "DialogResult = DialogResult.OK;" o no detectará que se abrió el formulario.
Burgo855
39
private void button1_Click(object sender, EventArgs e)
{
        Form2 frm2 = new Form2(textBox1.Text);
        frm2.Show();    
}

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

    }
nadi
fuente
2
He probado este código, si no llamamos al constructor predeterminado de Form2, public Form2(string qs):this(){}el formulario no se mostrará bien.
rene
¡Esta es la opción que utilicé y funcionó bien para mí!
Symon
14

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 form1yform3

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

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
Sujith HS
fuente
3
El problema de este enfoque es que si tiene varios Form1 abiertos, anulan el valor de "cantidad". Y su Form2 obtiene el valor del último Form1 abierto.
Arash Aghlara
4

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 evento

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

Ahora, después de cerrar form2y abrir form1, puede usar los datos devueltos en una getdatacadena.

Hassan Raza
fuente
Yo y haciendo lo mismo que sugirió en mis formularios, pero el problema que recibo es que el valor de retorno no aparece en el campo de texto siempre que presione el botón nuevamente.
wsDev
3

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

armannvg
fuente
+1 para eventos, escalan bien. Pero, ¿dónde almacena realmente los valores? Una clase estática es bastante simple, pero está cerca de usar una variable global, se siente ... asquerosa. ¿Cada formulario tiene su propia variable local para los entornos que se relacionan con él?
2

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();

    }
Naruto
fuente
¿Por qué crear uno nuevo Form1? ¿Por qué no pasar thisal Form2constructor?
2

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!

OverflowReturns
fuente
2

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();
    }
}
Ramazan Polat
fuente
2

Ok, entonces Form1tiene un cuadro de texto, en primer lugar, debe configurar este Form1cuadro 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 Form1como thisen 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();
}
windrider63
fuente
Llegué a esta publicación debido a una diferencia. Pregunta que respondí. Es preferible y en un programa moderno, pasar el formulario principal a los formularios secundarios a menudo será útil. Esta debería ser la respuesta preferida en mi opinión
Nico Walsemann
1

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();
}
Manuel
fuente
1

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.

FELIXKIPRONO
fuente
Gracias. Esto tiene más sentido para mí. ¡Probé todo lo demás en esta página y este fue el único que funcionó!
Chud37
0

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();
}
vishu_heak
fuente
0

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

Jeetendra Negi
fuente
0

Puede utilizar un enfoque diferente si lo desea.

  1. Usando System.Action (Aquí simplemente pasa la función del formulario principal como parámetro al formulario secundario como una función de devolución de llamada)
  2. Método OpenForms (usted llama directamente a uno de sus formularios abiertos)

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

Ozesh
fuente
0

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;
}
Ten un buen código
fuente
0

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        
    }
Ghorban ali arabi
fuente
-1

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

Masuri
fuente
-1
// In form 1
public static string Username = Me;

// In form 2's load block
string _UserName = Form1.Username;
Wayne McCulloch
fuente