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?
c#
winforms
modal-dialog
Nagu
quelle
quelle
Antworten:
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; } }
quelle
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(textBox1.Text); frm2.Show(); }
public Form2(string qs) { InitializeComponent(); textBox1.Text = qs; }
quelle
public Form2(string qs):this(){}
das Formular nicht gut angezeigt.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
form1
undform3
private void button1_Click(object sender, EventArgs e) { string text= ControlID.TextData; }
quelle
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
quelle
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
form1
Sie zu senden, können Sie jedes Ereignis und jeden Code ausprobieren, die in diesem Ereignis folgenform1 frm= new form1(); form1.getdata="some string to be sent to form1";
Nach dem Schließen
form2
und Öffnen vonform1
können Sie die zurückgegebenen Daten in einergetdata
Zeichenfolge verwenden.quelle
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
quelle
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(); }
quelle
Form1
? Warum nichtthis
an denForm2
Konstruktor übergeben?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!
quelle
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(); } }
quelle
Ok,
Form1
hat auch ein Textfeld. Zuerst müssen Sie diesesForm1
Textfeld in der Eigenschaft textbox auf public setzen.Code Form1:
Public button1_click() { Form2 secondForm = new Form2(this); secondForm.Show(); }
Übergeben Sie
Form1
wiethis
im Konstruktor.Code Form2:
Private Form1 _firstForm; Public Form2(Form1 firstForm) { _firstForm = firstForm: } Public button_click() { _firstForm.textBox.text=label1.text; This.Close(); }
quelle
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(); }
quelle
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.
quelle
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(); }
quelle
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 ......
quelle
Sie können einen anderen Ansatz verwenden, wenn Sie möchten.
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
quelle
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; }
quelle
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 }
quelle
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.
quelle
// In form 1 public static string Username = Me; // In form 2's load block string _UserName = Form1.Username;
quelle