Chcę przekazać wartości między dwoma formularzami (C #). Jak mogę to zrobić?
Mam dwa formularze: Form1 i Form2.
Form1 zawiera jeden przycisk. Kiedy kliknę ten przycisk, Form2 powinien się otworzyć, a Form1 powinien być w trybie nieaktywnym (tj. Nie można go wybrać).
Form2 zawiera jedno pole tekstowe i jeden przycisk przesyłania. Kiedy wpiszę jakąkolwiek wiadomość w polu tekstowym Form2 i kliknę przycisk Prześlij, Form2 powinien zostać zamknięty, a Form1 powinien zostać podświetlony z przesłaną wartością.
Jak mogę to zrobić? Czy ktoś może mi w tym pomóc na prostym przykładzie.
c#
winforms
modal-dialog
Nagu
źródło
źródło
Odpowiedzi:
Istnieje kilka rozwiązań tego problemu, ale to jest wzór, którego zwykle używam.
// Form 1 // inside the button click event using(Form2 form2 = new Form2()) { if(form2.ShowDialog() == DialogResult.OK) { someControlOnForm1.Text = form2.TheValue; } }
I...
// Inside Form2 // Create a public property to serve the value public string TheValue { get { return someTextBoxOnForm2.Text; } }
źródło
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(textBox1.Text); frm2.Show(); }
public Form2(string qs) { InitializeComponent(); textBox1.Text = qs; }
źródło
public Form2(string qs):this(){}
formularz nie będzie dobrze wyświetlany.Zdefiniuj właściwość
public static class ControlID { public static string TextData { get; set; } }
w
form2
private void button1_Click(object sender, EventArgs e) { ControlID.TextData = txtTextData.Text; }
Pobieranie danych do
form1
iform3
private void button1_Click(object sender, EventArgs e) { string text= ControlID.TextData; }
źródło
Po serii zmagań o przekazanie danych z jednej formy do drugiej w końcu znalazłem stabilną odpowiedź. Działa jak urok.
Wszystko, co musisz zrobić, to zadeklarować zmienną jako
public static datatype 'variableName'
w jednej formie i przypisać do tej zmiennej wartość, którą chcesz przekazać do innej postaci i wywołać tę zmienną w innej postaci, używając bezpośrednio nazwy formularza ( nie twórz obiektu tego formularza jako do zmiennych statycznych można uzyskać bezpośredni dostęp ) i uzyskać dostęp do tej wartości zmiennej.Przykładem jest
Formularz 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
źródło
Zadeklaruj publiczny ciąg w
form1
public string getdata;
W przycisku
form1
form2 frm= new form2(); this.hide(); form2.show();
Aby wysłać dane
form1
, możesz wypróbować dowolne zdarzenie i kod następujący w tym zdarzeniuform1 frm= new form1(); form1.getdata="some string to be sent to form1";
Teraz po zamknięciu
form2
i otwarciuform1
można użyć zwróconych danych w postacigetdata
ciągu.źródło
Pracowałem nad różnymi projektami winform, a ponieważ aplikacje stają się bardziej złożone (więcej okien dialogowych i interakcji między nimi), zacząłem używać jakiegoś systemu zdarzeń, aby mi pomóc, ponieważ zarządzanie ręcznym otwieraniem i zamykaniem okien będzie trudne utrzymywać i dalej rozwijać.
Użyłem CAB do moich aplikacji, ma system zdarzeń, ale w twoim przypadku może to być przesada :) Możesz napisać własne zdarzenia dla prostszych aplikacji
źródło
zadeklaruj ciąg w publicznym łańcuchu form1 TextBoxString;
w formularzu 1 klik zdarzenie dodaj
private void button1_Click(object sender, EventArgs e) { Form1 newform = new Form1(); newform = this; this.Hide(); MySecform = new Form2(ref newform); MySecform.Show(); }
w konstruktorze form2
public Form2(ref Form1 form1handel) { firstformRef = form1handel; InitializeComponent(); }
w skrzynce form2 zmienna Form1 firstformRef;
private void Submitt_Click(object sender, EventArgs e) { firstformRef.TextBoxString = textBox1.Text; this.Close(); firstformRef.Show(); }
źródło
Form1
? Dlaczego nie przejśćthis
doForm2
konstruktora?Kod 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 }
Kod 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(); }
To działa!
źródło
W tym kodzie przekazujesz tekst do Form2. Form2 pokazuje, że tekst w textBox1. Użytkownik wpisuje nowy tekst do textBox1 i naciska przycisk przesyłania. Form1 pobiera ten tekst i wyświetla go w polu tekstowym na 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; } } }
A to jest kod 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(); } }
źródło
Ok, więc
Form1
ma pole tekstowe, przede wszystkim musisz ustawić toForm1
pole tekstowe jako publiczne we właściwości textbox.Formularz kodu 1:
Public button1_click() { Form2 secondForm = new Form2(this); secondForm.Show(); }
Podaj
Form1
jakthis
w konstruktorze.Formularz kodu 2:
Private Form1 _firstForm; Public Form2(Form1 firstForm) { _firstForm = firstForm: } Public button_click() { _firstForm.textBox.text=label1.text; This.Close(); }
źródło
możesz przekazać jako parametr pole tekstowe Form1, na przykład:
W uchwycie dolnym Form 1:
private void button2_Click(object sender, EventArgs e) { Form2 newWindow = new Form2(textBoxForReturnValue); newWindow.Show(); }
W formularzu 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(); }
źródło
Konstruktorzy to najlepsze sposoby przekazywania danych między formularzami lub obiektami Gui. Możesz to zrobić. W formularzu 1 kliknięcie powinieneś mieć:
Form1.Enable = false; Form2 f = new Form2(); f.ShowDialog();
W formularzu 2, gdy użytkownik kliknie przycisk, powinien mieć kod taki lub podobny:
this.Close(); Form1 form = new Form1(textBox1.Text) form.Show();
Po załadowaniu formularza formularza 1 możesz dodać kod, aby wykonać cokolwiek, tak jak otrzymujesz wartości z konstruktora.
źródło
Jak przekazać wartości z formularza do innego formularza
1.) Idź do Form2, a następnie kliknij dwukrotnie. W kodzie wpisz this.
public Form2(string v) { InitializeComponent(); textBox1.Text = v; }
2.) Idź do Form1, a następnie kliknij dwukrotnie. W kodzie wpisz this. // Na twoim przycisku polecenia w Form1
private void button1_Click(object sender, EventArgs e) { Form2 F2 = new Form2(textBox1.Text); F2.Show(); }
źródło
To jest bardzo proste. załóżmy, że masz 2 okna formularz Form1 i Form2 i chcesz wysłać rekord pola tekstowego1 z Form1 do Form2 i wyświetlić ten rekord w etykiecie1 formularza2; następnie w Form2 utwórz etykietę o nazwie label1 i przejdź do właściwości label1 i ustaw 'Modifiers' = public, a w Form One utwórz TextBox z id textBox1 i przyciskiem do przesyłania nazwy, a następnie napisz następujący kod na zdarzenie kliknięcia przycisku
button1_Click(object sender, EventArgs e) { Form2 obj=new Form2(); obj.label1.text=textBox1.text.ToString(); obj.show(); }
to wszystko ... w ten sposób możesz powiązać rekord zbioru danych z datagridview innego formularza ......
źródło
Jeśli chcesz, możesz skorzystać z innego podejścia.
Korzystanie z System.Action
Możesz o tym myśleć jako o funkcji zwrotnej przekazanej do formularza potomnego.
// -------- 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"); }
Metoda OpenForms
Ta metoda jest łatwa ( 2 linie ). Ale działa tylko z otwartymi formularzami. Wszystko, co musisz zrobić, to dodać te dwie linie, gdziekolwiek chcesz przekazać jakieś dane.
Main frmMain = (Main)Application.OpenForms["Main"]; frmMain.UpdateSettings("Some data");
I pod warunkiem moją odpowiedź na podobne pytanie tutaj
źródło
Możesz tego użyć;
Przycisk Form1 1 kliknięcie
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); this.Hide(); frm2.Show(); }
I dodaj to do Form2
public string info = "";
Przycisk Form2 1 kliknięcie
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; }
źródło
Jeśli zmienisz właściwość modyfikatorów kontrolki w formularzu na publiczną, inne formularze będą miały dostęp do tej kontrolki. 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 }
źródło
Co powiesz na korzystanie z wydarzenia publicznego
Zrobiłbym to w ten sposób.
public class Form2 { public event Action<string> SomethingCompleted; private void Submit_Click(object sender, EventArgs e) { SomethingCompleted?.Invoke(txtData.Text); this.Close(); } }
i nazwij to z Form1 w ten sposób.
private void btnOpenForm2_Click(object sender, EventArgs e) { using (var frm = new Form2()) { frm.SomethingCompleted += text => { this.txtData.Text = text; }; frm.ShowDialog(); } }
Następnie Form1 może pobrać tekst z Form2, gdy Form2 jest zamknięty
Dziękuję Ci.
źródło
// In form 1 public static string Username = Me; // In form 2's load block string _UserName = Form1.Username;
źródło