web-dev-qa-db-fra.com

Envoyer des valeurs d'un formulaire à un autre

Je veux passer des valeurs entre deux formulaires (c #). Comment puis-je le faire?

J'ai deux formes: Form1 et Form2. 

Form1 contient un bouton. Lorsque je clique sur ce bouton, Form2 devrait s'ouvrir et Form1 devrait être en mode inactif (c'est-à-dire non sélectionnable).

Form2 contient une zone de texte et un bouton d'envoi. Lorsque je tape un message dans la zone de texte de Form2 et que je clique sur le bouton Envoyer, le Form2 doit se fermer et Form1 doit être mis en surbrillance avec la valeur soumise.

Comment puis-je le faire? Quelqu'un peut-il m'aider à le faire avec un exemple simple?.

65
Nagu

Il y a plusieurs solutions à cela, mais c'est le schéma que j'ai tendance à utiliser.

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

Et...

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

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

    }
33
nadi

Définir une propriété

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

Dans le form2

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

Obtenir les données dans form1 et form3

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

Après une série de difficultés pour passer les données d'une forme à une autre, j'ai finalement trouvé une réponse stable. Cela fonctionne comme un charme.

Tout ce que vous avez à faire est de déclarer une variable sous la forme public static datatype 'variableName' dans un formulaire et d'attribuer la valeur à cette variable que vous souhaitez transmettre à un autre formulaire et d'appeler cette variable dans un autre formulaire en utilisant directement le nom du formulaire ( Ne pas créer l'objet cette forme en tant que variables statiques peut être accédée directement ) et accéder à cette valeur de variable.

Exemple de tel est,

Formulaire 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
5
Sujith H S

Déclarer une chaîne publique dans form1

public string getdata;

Dans le bouton de form1

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

Pour envoyer des données à form1, vous pouvez essayer n’importe quel événement et code suivant cet événement.

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

Maintenant, après la fermeture de form2 et l'ouverture de form1, vous pouvez utiliser les données renvoyées dans la chaîne getdata.

5
Hassan Raza

déclarer une chaîne dans form1 public string TextBoxString;

dans l'événement click form1 ajouter

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

dans le constructeur form2

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

dans form2, variable de caisse Form1 firstformRef;

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

    }
3
Naruto

J'ai travaillé sur divers projets Winform et à mesure que les applications deviennent plus complexes (plus de dialogues et d'interactions entre elles), j'ai commencé à utiliser un système de gestion des événements pour m'aider, car la gestion de l'ouverture et de la fermeture manuelle des fenêtres sera difficile maintenir et développer plus loin. 

J'ai utilisé CAB pour mes applications, il a un système eventing mais cela risque d'être excessif dans votre cas :) Vous pouvez écrire vos propres événements pour des applications plus simples

3
armannvg

Form1 Code:

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
}

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

        }

Ça marche! 

2
OverflowReturns

Dans ce code, vous passez un texte à Form2. Form2 montre que le texte dans textBox1 . L'utilisateur tape un nouveau texte dans textBox1 et appuie sur le bouton d'envoi . Form1 récupère ce texte et l'affiche dans une zone de texte de 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;
        }
    }
}

Et ceci est le code 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();
    }
}
2
Ramazan Polat

Ok, donc Form1 a une zone de texte, vous devez d’abord définir cette zone de texte Form1 sur public dans la propriété textbox. 

Code Form1:

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

Passez Form1 en tant que this dans le constructeur.

Code Form2:

Private Form1 _firstForm;

Public Form2(Form1 firstForm)
{
    _firstForm = firstForm:
}

Public button_click()
{
    _firstForm.textBox.text=label1.text;
    This.Close();
}
1
windrider63

Les constructeurs sont le meilleur moyen de transmettre des données entre des formulaires ou des objets graphiques. Vous pouvez le faire . Dans le bouton Form1, vous devez avoir:

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

Dans le formulaire 2, lorsque l'utilisateur clique sur le bouton, il doit avoir un code comme celui-ci ou similaire:

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

Une fois dans le formulaire de chargement du formulaire 1, vous pouvez ajouter du code pour tout faire lorsque vous obtenez les valeurs du constructeur.

1
FELIXKIPRONO

Simple obtenir la valeur avec:

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

Pour définir la valeur:

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

mais vérifiez que la chaîne est "chaîne publique"

public string example = "test";
0
Dimitris Toulis

Vous pouvez utiliser une approche différente si vous le souhaitez.

  1. Using System.Action (Ici, vous transmettez simplement la fonction de formulaire principale en tant que paramètre au formulaire enfant, comme une fonction de rappel)
  2. Méthode OpenForms (vous appelez directement l'un de vos formulaires ouverts)

Utilisation de System.Action

Vous pouvez le considérer comme une fonction de rappel transmise au formulaire enfant.

// -------- 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éthode OpenForms 

Cette méthode est simple (2 lignes). Mais ne fonctionne qu'avec les formulaires ouverts . Tout ce que vous avez à faire est d'ajouter ces deux lignes à n'importe quel endroit où vous souhaitez transmettre des données.

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

J'ai fourni ma réponse à une question similaire ici

0
Ozesh

Vous pouvez utiliser ceci;

Form1 bouton1 clic

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

Et ajoutez ceci à Form2

public string info = "";

Form2 bouton1 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;
}
0
SerkanS

si vous modifiez la propriété Modifiers d'un contrôle dans un formulaire en Public, un autre formulaire peut accéder à ce contrôle . f.e. : 

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

C’est très simple ... supposons que vous avez 2 fenêtres Form1 et Form2 et que vous souhaitez envoyer un enregistrement de textbox1 de Form1 à Form2 et afficher cet enregistrement dans label1 de Form2; Puis dans Form2, créez une étiquette dont le nom est label1 et allez à la propriété de label1 et définissez 'Modifiers' = public et dans Form one, créez un textBox avec id textBox1 et un bouton de nom submit, puis écrivez le code suivant sur l'événement de clic de bouton

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

thats it ...... pour cette façon, vous pouvez lier un enregistrement de jeu de données à un autre formulaire, datagridview ......

0
Jeetendra Negi

Que diriez-vous d'utiliser un événement public

Je le ferais comme ça.

public class Form2
{
   public event Action<string> SomethingCompleted;

   private void Submit_Click(object sender, EventArgs e)
   {
       SomethingCompleted?.Invoke(txtData.Text);
       this.Close();
   }
}

et appelez-le à partir de Form1 comme ceci.

private void btnOpenForm2_Click(object sender, EventArgs e)
{
    using (var frm = new Form2())
    {
        frm.SomethingCompleted += text => {
            this.txtData.Text = text;
        };

        frm.ShowDialog();
    }
}

Ensuite, Form1 pourrait obtenir un texte de Form2 lorsque Form2 est fermé

Je vous remercie.

0
Masuri

Comment passer des valeurs de formulaire à un autre formulaire

1.) Allez à Form2 puis double-cliquez dessus. Au code tapez ceci.

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

2.) Allez à Form1 puis double-cliquez dessus. Dans le code, tapez this . // Dans votre bouton de commande dans Form1

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

vous pouvez passer en paramètre la zone de texte du Form1, comme ceci:

Sur le formulaire 1, gestionnaire:

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

Sur le formulaire 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();
}
0
Manuel