Invia valori da un modulo a un altro modulo


85

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

Ho due moduli: Form1 e Form2.

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

Form2 contiene una casella di testo e un pulsante di invio. Quando digito un messaggio nella casella di testo di Form2 e faccio clic sul pulsante di invio, Form2 dovrebbe chiudersi e Form1 dovrebbe evidenziarsi con il valore inviato.

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


Hai qualche esempio per questo?
Millar

Risposte:


58

Ci sono diverse soluzioni a questo, ma questo è il modello che tendo a 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; }
}

Ho pensato che fosse una cattiva condotta in codice. Questo è fantastico allora.
Userò

Beh, non penso che sia una cattiva "condotta", tuttavia ci sono implicazioni sulla sicurezza da considerare prima di utilizzare questo modello. (Ma, ottimo esempio semplice +1)

1
Inoltre, non dimenticare che dovrai anche avere su form2 invece di form2.Close (); utilizzare "DialogResult = DialogResult.OK;" o non rileverà che il modulo è stato aperto.
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;

    }

2
Ho testato questo codice, se non chiamiamo il costruttore predefinito di Form2, public Form2(string qs):this(){}il modulo non verrà mostrato bene.
rene

Questa è l'opzione che ho usato e per me ha funzionato perfettamente!
Symon

14

Definisci 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;   
}

Recupero dei dati in form1eform3

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

6

Dopo una serie di lotte per passare i dati da un modulo all'altro, ho finalmente trovato una risposta stabile. Funziona come un fascino.

Tutto quello che devi fare è dichiarare una variabile come public static datatype 'variableName'in una forma e assegnare il valore a questa variabile che vuoi passare a un'altra forma e chiamare questa variabile in un'altra forma usando direttamente il nome del modulo ( Non creare l'oggetto di questo modulo come è possibile accedere direttamente alle variabili statiche ) e accedere a questo valore della 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

3
Il problema di questo approccio è che se si dispone di più di Form1 aperti, sovrascrivono il valore "quantità". E il tuo Form2 ottiene il valore dell'ultimo Form1 aperto.
Arash Aghlara

4

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 form1te puoi provare qualsiasi evento e codice che segue in quell'evento

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

Ora dopo la chiusura form2e l'apertura di form1, puoi utilizzare i dati restituiti in getdatastringa.


Io e facendo la stessa cosa suggerita da te nei miei moduli, ma il problema che ricevo è che il valore di ritorno non appare nel campo di testo finché premo di nuovo il pulsante.
wsDev

3

Ho lavorato su vari progetti winform e man mano che le applicazioni diventano più complesse (più dialoghi e interazioni tra di loro), ho iniziato a utilizzare un sistema di eventi per aiutarmi, perché la gestione dell'apertura e chiusura manuale delle finestre sarà difficile da mantenere e sviluppare ulteriormente.

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


+1 per gli eventi, scalano bene. Ma dove memorizzi effettivamente i valori? Una classe statica è abbastanza semplice, ma è vicino all'uso di una variabile globale, sembra ... icky. Ciascun modulo ha la propria variabile locale per le impostazioni ad esso correlate?

2

dichiarare stringa in form1 stringa pubblica TextBoxString;

in form1 clic 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 crate variable Form1 firstformRef;

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

    }

Perché crearne uno nuovo Form1? Perché non passare thisal Form2costruttore?

2

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!


2

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 acquisisce il 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();
    }
}

2

Ok, quindi Form1ha una casella di testo, prima di tutto devi impostare questa Form1casella di testo come pubblica nella proprietà della casella di testo.

Codice Form1:

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

Passa Form1come thisnel costruttore.

Codice Form2:

Private Form1 _firstForm;

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

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

È venuto a questo post a causa di un diff. Domanda a cui ho risposto. Questo è preferibile e in un programma moderno, il passaggio del mainform ai childrenforms sarà spesso utile. Questa dovrebbe essere la risposta preferita imo
Nico Walsemann

1

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

Sul gestore del pulsante della Form 1:

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

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

1

I costruttori sono i modi migliori per passare i dati tra i moduli o gli oggetti Gui, puoi farlo. Nel pulsante di clic form1 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 all'interno del caricamento del modulo del modulo 1, puoi aggiungere codice per fare qualsiasi cosa mentre ottieni i valori dal costruttore.


Grazie. Questo ha più senso per me. Ho provato tutto il resto in questa pagina e questo è stato l'unico che ha funzionato!
Chud37

0

Come passare i valori da un modulo a un altro

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

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

2.) Goto Form1 quindi fare doppio clic su di esso. Al codice digita this. // Nel pulsante di comando in Form1

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

0

Questo è molto semplice. si supponga di avere 2 form finestra Form1 e Form2 e si desidera inviare il record di textbox1 da Form1 a Form2 e visualizzare questo record in label1 di Form2; quindi in Form2 crea un'etichetta il cui nome è label1 e vai alla proprietà di label1 e imposta 'Modifiers' = public e in Form one crea un textBox con id textBox1 e un pulsante di nome invia quindi scrivi il seguente codice sull'evento clic del pulsante

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

questo è tutto ... in questo modo puoi associare il record del set di dati a un datagridview di un altro modulo ...


0

Puoi utilizzare un approccio diverso se lo desideri.

  1. Utilizzo di System.Action (qui si passa semplicemente la funzione del form principale come parametro al form figlio come una funzione di callback)
  2. Metodo OpenForms (chiami direttamente uno dei tuoi moduli aperti)

Utilizzando System.Action

Puoi pensarla come una funzione di callback passata al form 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<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");
}

Metodo OpenForms

Questo metodo è semplice ( 2 righe ). Ma funziona solo con moduli aperti. Tutto quello che devi fare è aggiungere queste due righe dove vuoi passare dei dati.

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

Ho fornito la mia risposta a una domanda simile qui


0

Puoi usarlo;

Fare clic sul pulsante 1 di Form1

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

E aggiungilo a Form2

public string info = "";

Form2 button1 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

se si modifica la proprietà Modifiers di un controllo in un form in Public, un altro form può accedere a quel 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        
    }

-1

Che ne dici di utilizzare un evento pubblico

Lo farei così.

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

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

e chiamalo da Form1 in questo modo.

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

        frm.ShowDialog();
    }
}

Quindi, Form1 potrebbe ottenere un testo da Form2 quando Form2 è chiuso

Grazie.


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

// In form 2's load block
string _UserName = Form1.Username;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.