Senden Sie Werte von einem Formular an ein anderes Formular


84

Ich möchte Werte zwischen zwei Formularen (c #) übergeben. Wie kann ich es tun?

Ich habe zwei Formen: Form1 und Form2.

Form1 enthält eine Schaltfläche. Wenn ich auf diese Schaltfläche klicke, sollte sich Form2 öffnen und Form1 sollte sich im inaktiven Modus befinden (dh nicht auswählbar).

Form2 enthält ein Textfeld und eine Schaltfläche zum Senden. Wenn ich eine Nachricht in das Textfeld von Form2 eingebe und auf die Schaltfläche "Senden" klicke, sollte Form2 geschlossen und Form1 mit dem gesendeten Wert hervorgehoben werden.

Wie kann ich es tun? Kann mir jemand helfen, dies anhand eines einfachen Beispiels zu tun?


Hast du ein Beispiel dafür?
Millar

Antworten:


58

Es gibt verschiedene Lösungen dafür, aber dies ist das Muster, das ich normalerweise verwende.

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

Und...

// Inside Form2
// Create a public property to serve the value
public string TheValue 
{
    get { return someTextBoxOnForm2.Text; }
}

Ich dachte, das wäre schlechtes Code-Verhalten. Das ist dann großartig. Ich werde auch dieses Muster verwenden
CasperT

Nun, ich denke nicht, dass es schlechtes "Verhalten" ist, aber es gibt Sicherheitsaspekte, die berücksichtigt werden müssen, bevor dieses Muster verwendet wird. (Aber tolles einfaches Beispiel +1)

1
Vergessen Sie auch nicht, dass Sie auch form2 anstelle von form2.Close () benötigen. benutze "DialogResult = DialogResult.OK;" oder es wird nicht erkannt, dass das Formular geöffnet wurde.
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
Ich habe diesen Code getestet. Wenn wir den Standardkonstruktor von Form2 nicht aufrufen, wird public Form2(string qs):this(){}das Formular nicht gut angezeigt.
Rene

Dies ist die Option, die ich verwendet habe und die für mich gut funktioniert hat!
Symon

14

Definieren Sie eine Eigenschaft

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

In dem form2

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

Abrufen der Daten in form1undform3

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

6

Nach einer Reihe von Kämpfen um die Weitergabe der Daten von einem Formular an ein anderes fand ich endlich eine stabile Antwort. Es funktioniert wie Charme.

Sie müssen lediglich eine Variable wie public static datatype 'variableName'in einem Formular deklarieren und dieser Variablen den Wert zuweisen, den Sie an ein anderes Formular übergeben möchten, und diese Variable in einem anderen Formular direkt mit dem Formularnamen aufrufen ( Objekt dieses Formulars nicht erstellen als Auf statische Variablen kann direkt zugegriffen werden ) und auf diesen Variablenwert zugegriffen werden .

Ein Beispiel dafür ist:

Form 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

3
Das Problem bei diesem Ansatz ist, dass wenn Sie mehrere Form1 geöffnet haben, diese den Wert "Menge" überschreiben. Und Ihr Form2 erhält den Wert des zuletzt geöffneten Form1.
Arash Aghlara

4

Deklarieren Sie eine öffentliche Zeichenfolge in form1

public string getdata;

In Knopf von form1

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

Um Daten an form1Sie zu senden, können Sie jedes Ereignis und jeden Code ausprobieren, die in diesem Ereignis folgen

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

Nach dem Schließen form2und Öffnen von form1können Sie die zurückgegebenen Daten in einer getdataZeichenfolge verwenden.


Ich mache das Gleiche wie von Ihnen in meinen Formularen vorgeschlagen, aber das Problem, das ich bekomme, ist, dass der Rückgabewert nicht im Textfeld angezeigt wird, solange ich erneut auf die Schaltfläche drücke.
wsDev

3

Ich habe an verschiedenen Winform-Projekten gearbeitet und da die Anwendungen komplexer werden (mehr Dialoge und Interaktionen zwischen ihnen), habe ich begonnen, ein Eventing-System zu verwenden, um mir zu helfen, da die Verwaltung des manuellen Öffnens und Schließens von Fenstern schwierig sein wird pflegen und weiterentwickeln.

Ich habe CAB für meine Anwendungen verwendet, es hat ein Ereignissystem , aber es könnte in Ihrem Fall ein Overkill sein :) Sie könnten Ihre eigenen Ereignisse für einfachere Anwendungen schreiben


+1 für Ereignisse, sie skalieren gut. Aber wo speichern Sie die Werte tatsächlich? Eine statische Klasse ist einfach genug, aber das kommt der Verwendung einer globalen Variablen nahe, es fühlt sich ... icky an. Hat jedes Formular eine eigene lokale Variable für Einstellungen, die sich darauf beziehen?

2

deklariere String in form1 public string TextBoxString;

Klicken Sie in form1 auf event add

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

im form2-Konstruktor

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

in form2 Kistenvariable Form1 firstformRef;

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

    }

Warum ein neues erstellen Form1? Warum nicht thisan den Form2Konstruktor übergeben?

2

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
}

Form2 Code:

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

        }

Es klappt!


2

In diesem Code übergeben Sie einen Text an Form2. Form2 zeigt diesen Text in textBox1. Der Benutzer gibt neuen Text in textBox1 ein und drückt auf die Schaltfläche "Senden". Form1 erfasst diesen Text und zeigt ihn in einem Textfeld auf Form1 an.

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

Und das ist Form1-Code:

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, Form1hat auch ein Textfeld. Zuerst müssen Sie dieses Form1Textfeld in der Eigenschaft textbox auf public setzen.

Code Form1:

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

Übergeben Sie Form1wie thisim Konstruktor.

Code Form2:

Private Form1 _firstForm;

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

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

Kam zu diesem Beitrag wegen eines Unterschieds. Frage, die ich beantwortet habe. Dies wird bevorzugt und in einem modernen Programm ist es oft hilfreich, die Hauptform an die Kinderform zu übergeben. Dies sollte die bevorzugte Antwort sein imo
Nico Walsemann

1

Sie können das Textfeld von Form1 wie folgt als Parameter übergeben:

Auf Form 1 Buttom Handler:

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

Auf dem Formular 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

Konstruktoren sind die besten Möglichkeiten, um Daten zwischen Formularen oder GUI-Objekten zu übertragen. In der Schaltfläche zum Klicken auf form1 sollten Sie Folgendes haben:

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

Wenn der Benutzer in Formular 2 auf die Schaltfläche klickt, sollte er einen Code wie diesen oder einen ähnlichen haben:

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

Sobald Sie sich in der Formularladung von Formular 1 befinden, können Sie Code hinzufügen, um alles zu tun, während Sie die Werte vom Konstruktor erhalten.


Vielen Dank. Das macht für mich am meisten Sinn. Ich habe alles andere auf dieser Seite ausprobiert und dies war die einzige, die funktioniert hat!
Chud37

0

So übergeben Sie die Werte vom Formular an ein anderes Formular

1.) Gehen Sie zu Form2 und doppelklicken Sie darauf. Geben Sie am Code Folgendes ein.

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

2.) Gehen Sie zu Form1 und doppelklicken Sie darauf. Geben Sie am Code Folgendes ein. // An Ihrer Befehlsschaltfläche in Form1

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

0

Das ist sehr einfach. Angenommen, Sie haben 2 Fenster Form Form1 und Form2 und möchten einen Datensatz von Textbox1 von Form1 an Form2 senden und diesen Datensatz in Label1 von Form2 anzeigen. Erstellen Sie dann in Form2 eine Beschriftung mit dem Namen label1 und gehen Sie zur Eigenschaft von label1 und setzen Sie 'Modifiers' = public. Erstellen Sie in Form 1 eine Textbox mit der ID textBox1 und einer Schaltfläche mit dem Namen submit und schreiben Sie den folgenden Code auf das Ereignis zum Klicken auf die Schaltfläche

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

das ist es ... auf diese Weise können Sie den Datensatz an die Datagrid-Ansicht eines anderen Formulars binden ......


0

Sie können einen anderen Ansatz verwenden, wenn Sie möchten.

  1. Verwenden von System.Action (Hier übergeben Sie einfach die Hauptformularfunktion als Parameter wie eine Rückruffunktion an das untergeordnete Formular.)
  2. OpenForms-Methode (Sie rufen direkt eines Ihrer offenen Formulare auf)

Verwenden von System.Action

Sie können sich das als Rückruffunktion vorstellen, die an das untergeordnete Formular übergeben wird.

// -------- 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");
}

OpenForms-Methode

Diese Methode ist einfach ( 2 Zeilen ). Funktioniert aber nur mit offenen Formularen. Alles, was Sie tun müssen, ist, diese beiden Zeilen hinzuzufügen, wo immer Sie Daten übergeben möchten.

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

Ich vorausgesetzt meine Antwort auf eine ähnliche Frage hier


0

Sie können dies verwenden;

Form1 button1 klicken

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

Und fügen Sie dies zu Form2 hinzu

public string info = "";

Form2 button1 klicken

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

Wenn Sie die Modifikatoreigenschaft eines Steuerelements in einem Formular in "Öffentlich" ändern, können andere Formulare auf dieses Steuerelement zugreifen. zB:

    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

Wie wäre es mit einem öffentlichen Event?

Ich würde es so machen.

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

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

und nenne es von Form1 so.

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

        frm.ShowDialog();
    }
}

Dann könnte Form1 einen Text von Form2 erhalten, wenn Form2 geschlossen wird

Vielen Dank.


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

// In form 2's load block
string _UserName = Form1.Username;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.