Я хочу передавать значения между двумя формами (c #). Как мне это сделать?
У меня две формы: Form1 и Form2.
Form1 содержит одну кнопку. Когда я нажимаю на эту кнопку, должна открыться форма Form2, а форма Form1 должна находиться в неактивном режиме (т. Е. Недоступна для выбора).
Форма 2 содержит одно текстовое поле и одну кнопку отправки. Когда я ввожу какое-либо сообщение в текстовое поле формы 2 и нажимаю кнопку отправки, форма 2 должна закрываться, а форма Form1 должна выделяться переданным значением.
Как мне это сделать? Может ли кто-нибудь помочь мне сделать это на простом примере.
c#
winforms
modal-dialog
Нагу
источник
источник
Ответы:
Для этого есть несколько решений, но я обычно использую именно этот шаблон.
// Form 1 // inside the button click event using(Form2 form2 = new Form2()) { if(form2.ShowDialog() == DialogResult.OK) { someControlOnForm1.Text = form2.TheValue; } }
И...
// Inside Form2 // Create a public property to serve the value public string TheValue { get { return someTextBoxOnForm2.Text; } }
источник
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(textBox1.Text); frm2.Show(); }
public Form2(string qs) { InitializeComponent(); textBox1.Text = qs; }
источник
public Form2(string qs):this(){}
форма не будет отображаться хорошо.Определить свойство
public static class ControlID { public static string TextData { get; set; } }
в
form2
private void button1_Click(object sender, EventArgs e) { ControlID.TextData = txtTextData.Text; }
Получение данных
form1
иform3
private void button1_Click(object sender, EventArgs e) { string text= ControlID.TextData; }
источник
После серии борьбы за передачу данных из одной формы в другую я наконец нашел стабильный ответ. Это работает как шарм.
Все, что вам нужно сделать, это объявить переменную как
public static datatype 'variableName'
в одной форме и присвоить этой переменной значение, которое вы хотите передать в другую форму, и вызвать эту переменную в другой форме, используя непосредственно имя формы ( не создавайте объект этой формы как к статическим переменным можно обращаться напрямую ) и получить доступ к этому значению переменной.Пример таков:
Форма 1
public static int quantity; quantity=TextBox1.text; \\Value which you want to pass
Форма 2
TextBox2.Text=Form1.quantity;\\ Data will be placed in TextBox2
источник
Объявить публичную строку в
form1
public string getdata;
В кнопке
form1
form2 frm= new form2(); this.hide(); form2.show();
Чтобы отправить данные,
form1
вы можете попробовать любое событие и код, следующий за этим событием.form1 frm= new form1(); form1.getdata="some string to be sent to form1";
Теперь после закрытия
form2
и открытияform1
вы можете использовать возвращаемые данные в видеgetdata
строки.источник
Я работал над различными проектами winform, и по мере того, как приложения становятся более сложными (больше диалогов и взаимодействий между ними), я начал использовать некоторую систему событий, чтобы помочь мне, потому что управлять открытием и закрытием окон вручную будет сложно поддерживать и развивать дальше.
Я использовал CAB для своих приложений, у него есть система событий, но в вашем случае это может быть излишним :) Вы можете написать свои собственные события для более простых приложений
источник
объявить строку в form1 public string TextBoxString;
в форме 1 событие клика добавить
private void button1_Click(object sender, EventArgs e) { Form1 newform = new Form1(); newform = this; this.Hide(); MySecform = new Form2(ref newform); MySecform.Show(); }
в конструкторе form2
public Form2(ref Form1 form1handel) { firstformRef = form1handel; InitializeComponent(); }
в переменной контейнера form2 Form1 firstformRef;
private void Submitt_Click(object sender, EventArgs e) { firstformRef.TextBoxString = textBox1.Text; this.Close(); firstformRef.Show(); }
источник
Form1
? Почему бы не перейтиthis
кForm2
конструктору?Код формы 1:
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 }
Код формы 2:
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(); }
Оно работает!
источник
В этом коде вы передаете текст в форму Form2. Form2 показывает этот текст в textBox1. Пользователь вводит новый текст в textBox1 и нажимает кнопку отправки. Form1 берет этот текст и показывает его в текстовом поле на 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; } } }
А это код 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(); } }
источник
Хорошо
Form1
, у вас есть текстовое поле, прежде всего вы должны сделать этоForm1
текстовое поле общедоступным в свойстве текстового поля.Код Form1:
Public button1_click() { Form2 secondForm = new Form2(this); secondForm.Show(); }
Передать
Form1
какthis
в конструкторе.Код Form2:
Private Form1 _firstForm; Public Form2(Form1 firstForm) { _firstForm = firstForm: } Public button_click() { _firstForm.textBox.text=label1.text; This.Close(); }
источник
вы можете передать в качестве параметра текстовое поле Form1, например:
В обработчике кнопок формы 1:
private void button2_Click(object sender, EventArgs e) { Form2 newWindow = new Form2(textBoxForReturnValue); newWindow.Show(); }
По форме 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(); }
источник
Конструкторы - лучший способ передавать данные между формами или объектами Gui, которые вы можете сделать. В кнопке form1 click у вас должно быть:
Form1.Enable = false; Form2 f = new Form2(); f.ShowDialog();
В форме 2, когда пользователь нажимает кнопку, он должен иметь такой или аналогичный код:
this.Close(); Form1 form = new Form1(textBox1.Text) form.Show();
Оказавшись внутри формы загрузки формы 1, вы можете добавить код, чтобы делать что угодно, когда вы получаете значения из конструктора.
источник
Как передать значения из формы в другую форму
1.) Перейдите к Form2, затем дважды щелкните по ней. В коде введите это.
public Form2(string v) { InitializeComponent(); textBox1.Text = v; }
2.) Перейдите к Form1, затем дважды щелкните по ней. В коде введите это. // На вашей командной кнопке в Form1
private void button1_Click(object sender, EventArgs e) { Form2 F2 = new Form2(textBox1.Text); F2.Show(); }
источник
Это очень просто. предположим, что у вас есть 2 оконных формы Form1 и Form2, и вы хотите отправить запись textbox1 из Form1 в Form2 и отобразить эту запись в label1 Form2; затем в Form2 создайте метку с именем label1 и перейдите к свойству label1 и установите 'Modifiers' = public, а в Form one создайте textBox с идентификатором textBox1 и кнопкой с именем submit, затем напишите следующий код при событии нажатия кнопки
button1_Click(object sender, EventArgs e) { Form2 obj=new Form2(); obj.label1.text=textBox1.text.ToString(); obj.show(); }
вот и все ... таким образом вы можете привязать запись набора данных к datagridview другой формы ...
источник
Если хотите, вы можете использовать другой подход.
Использование System.Action
Вы можете думать об этом как о функции обратного вызова, передаваемой дочерней форме.
// -------- 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 Метод
Это простой способ ( 2 строки ). Но работает только с открытыми формами. Все, что вам нужно сделать, это добавить эти две строки туда, где вы хотите передать какие-либо данные.
Main frmMain = (Main)Application.OpenForms["Main"]; frmMain.UpdateSettings("Some data");
Я дал свой ответ на аналогичный вопрос здесь
источник
Вы можете использовать это;
Форма 1 кнопка 1 щелчок
private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); this.Hide(); frm2.Show(); }
И добавьте это в Form2
public string info = "";
Форма 2 кнопка 1 щелчок
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; }
источник
если вы измените свойство Modifiers элемента управления в форме на Public, другие формы смогут получить доступ к этому элементу управления. 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 }
источник
Как насчет использования публичного мероприятия
Я бы сделал это вот так.
public class Form2 { public event Action<string> SomethingCompleted; private void Submit_Click(object sender, EventArgs e) { SomethingCompleted?.Invoke(txtData.Text); this.Close(); } }
и вызовите его из формы Form1 вот так.
private void btnOpenForm2_Click(object sender, EventArgs e) { using (var frm = new Form2()) { frm.SomethingCompleted += text => { this.txtData.Text = text; }; frm.ShowDialog(); } }
Затем Form1 может получить текст из Form2, когда Form2 закрыта
Спасибо.
источник
// In form 1 public static string Username = Me; // In form 2's load block string _UserName = Form1.Username;
источник