Отправить значения из одной формы в другую форму

Я хочу передать значения между двумя формами (c #). Как мне это сделать?

У меня есть две формы: Form1 и Form2.

Form1 содержит одну кнопку. Когда я нажимаю на эту кнопку, форма Form2 должна открыться, и форма Form1 должна быть в неактивном режиме (т.е. недоступна для выбора).

Form2 содержит одно текстовое поле и одну кнопку отправки. Когда я набираю любое сообщение в текстовом поле формы Form2 и нажимаю кнопку «Отправить», форма Form2 должна закрыться, а форма Form1 должна выделяться с указанным значением.

Как мне это сделать? Может ли кто-нибудь помочь мне сделать это на простом примере.

13.10.2009 11:59:04
У вас есть пример для этого?
Millar 13.12.2012 23:59:37
19 ОТВЕТОВ

Есть несколько решений для этого, но это шаблон, который я склонен использовать.

// 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; }
}
53
7.11.2017 08:20:38
Я думал, что это было плохое поведение кода. Это здорово тогда. Я также буду использовать этот шаблон
CasperT 13.10.2009 12:34:00
Что ж, я не думаю, что это плохое «поведение», однако есть некоторые последствия для безопасности, которые необходимо учитывать перед использованием этого шаблона. (Но, отличный простой пример +1)
anon271334 18.02.2011 05:20:02
Также не забывайте, что вам также нужно иметь на form2 вместо form2.Close (); использовать "DialogResult = DialogResult.OK;" или он не обнаружит, что форма была открыта.
Burgo855 13.08.2018 01:18:10

объявить строку в публичной строке form1 TextBoxString;

в form1 нажмите событие добавить

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

    }
2
13.10.2009 12:33:41
Зачем создавать новый Form1? Почему бы не перейти thisк Form2конструктору?
user565869 29.01.2013 21:30:20

Я работал над различными проектами winform, и, поскольку приложения становятся более сложными (больше диалогов и взаимодействий между ними), я начал использовать некоторую систему обработки событий, чтобы выручить меня, потому что управление открытием и закрытием окон вручную будет затруднено. поддерживать и развивать дальше.

Я использовал CAB для своих приложений, у него есть система обработки событий, но это может быть излишним в вашем случае :) Вы можете написать свои собственные события для более простых приложений

3
13.10.2009 12:47:04
+1 для событий, они хорошо масштабируются. Но где вы на самом деле храните значения? Статический класс достаточно прост, но он близок к использованию глобальной переменной, кажется ... странным. Есть ли у каждой формы своя локальная переменная для настроек, которые к ней относятся?
user565869 29.01.2013 21:31:37
private void button1_Click(object sender, EventArgs e)
{
        Form2 frm2 = new Form2(textBox1.Text);
        frm2.Show();    
}

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

    }
36
16.10.2011 15:20:13
Я проверил этот код, если мы не вызовем конструктор по умолчанию Form2, public Form2(string qs):this(){}форма не будет отображаться хорошо.
rene 26.03.2012 09:47:45
Это вариант, который я использовал, и он работал отлично для меня!
Symon 31.10.2019 16:53:00

Код 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
}

Код формы 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();

        }

Оно работает!

2
5.02.2012 04:24:53

Определить свойство

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;   
}
13
17.05.2014 09:20:07

Как передать значения из формы в другую форму

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();
}
0
21.03.2013 12:17:06

Вы можете передать в качестве параметра текстовое поле 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();
}
1
31.10.2013 13:51:13

Объявите открытую строку в 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строки.

4
17.05.2014 09:17:23
Я и делаю то же самое, что вы предложили в моих формах, но проблема, которую я получаю, заключается в том, что возвращаемое значение не появляется в текстовом поле, пока я снова нажимаю кнопку.
wsDev 20.05.2015 10:32:39

После серии попыток передачи данных из одной формы в другую я наконец нашел устойчивый ответ. Это работает как шарм.

Все, что вам нужно сделать, это объявить переменную как public static datatype 'variableName'в одной форме и присвоить значение этой переменной, которое вы хотите передать другой форме, и вызвать эту переменную в другой форме, используя непосредственно имя формы ( Не создавайте объект этой формы как статические переменные могут быть доступны напрямую ) и получить доступ к значению этой переменной.

Пример таков,

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
5
13.03.2014 07:50:23
Проблема этого подхода заключается в том, что если у вас открыто несколько форм Form1, они переопределяют значение количества. И ваша Form2 получает значение последней открытой Form1.
Arash Aghlara 30.09.2015 00:07:49

В этом коде вы передаете текст в 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();
    }
}
2
23.04.2014 23:19:54

Это очень просто. Предположим, у вас есть 2 окна формы Form1 и Form2, и вы хотите отправить запись textbox1 из Form1 в Form2 и отобразить эту запись в label1 Form2; затем в Form2 создайте метку с именем label1 и перейдите к свойству label1 и установите 'Modifiers' = public, а в первой форме создайте textBox с идентификатором textBox1 и кнопкой имени submit, затем напишите следующий код для события нажатия кнопки

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

вот и все ... для этого способа вы можете привязать запись набора данных к представлению данных другой формы ......

0
31.03.2015 20:40:19

Конструкторы - лучший способ передачи данных между формами или объектами графического интерфейса. Вы можете сделать это. В кнопке form1 нажмите:

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

В форме 2, когда пользователь нажимает кнопку, он должен иметь такой код или подобный:

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

Оказавшись внутри загрузки формы 1, вы можете добавить код, который будет делать что угодно, когда вы получаете значения из конструктора.

1
22.05.2017 09:14:45
Спасибо. Это имеет смысл для меня. Я попробовал все остальное на этой странице, и это было единственное, что сработало!
Chud37 5.10.2018 21:29:19

Вы можете использовать другой подход, если хотите.

  1. Использование System.Action (здесь вы просто передаете функцию основных форм в качестве параметра дочерней форме, например, функции обратного вызова)
  2. Метод OpenForms (вы напрямую вызываете одну из ваших открытых форм)

Использование 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");

Я предоставил свой ответ на подобный вопрос здесь

0
22.02.2018 05:36:28

Хорошо, поэтому Form1есть текстовое поле, в первую очередь вы должны установить это Form1текстовое поле в public в свойстве textbox.

Форма кода 1:

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

Пройдите Form1как thisв конструкторе.

Форма кода 2:

Private Form1 _firstForm;

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

Public button_click()
{
    _firstForm.textBox.text=label1.text;
    This.Close();
}
1
5.04.2018 21:20:30

Вы можете использовать это;

Form1 button1 click

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

И добавить это в Form2

public string info = "";

Form2 button1 click

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
4.07.2018 13:07:44

если вы измените свойство модификаторов элемента управления в форме на общедоступное, другие формы могут получить доступ к этому элементу управления. 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        
    }
0
22.07.2018 05:33:28

Как насчет использования публичного мероприятия

Я бы сделал это так.

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 закрыта

Спасибо.

-1
2.10.2018 05:38:29
// In form 1
public static string Username = Me;

// In form 2's load block
string _UserName = Form1.Username;
-1
10.01.2020 11:20:50