Вопрос, рассматриваемый в данной статье, скорее относится к теме построения архитектуры приложения, а не конкретно рассматриваемой проблемы. Передавать данные от одной формы в другую вовсе не составляет труда. Для этого достаточно контрол, данные которого мы хотим получить, сделать открытым, то есть пометить модификатором public. Также, возможен и другой вариант. Например, в первой форме мы создаем объект второй формы, передав в конструктор ссылку на себя, то есть, передав из первой формы во вторую ссылку на первую
SecondForm secondForm = new SecondForm(this);
Естественно, перед этим следует позаботиться о создании перегрузки конструктора второй формы.
И такой способ достаточно распространен. Однако, со своей простотой, он несет много потенциальных проблем, главная из которых – нарушение принципа инкапсуляции. Одним словом, вторая форма ничего не должна знать о существовании первой и, уж тем более, не должна иметь возможность влиять на неё.
Решение данной проблемы достаточно простое. Обратимся непосредственно к коду.
В дизайнере создаем главную форму (она будет запускаться при запуске приложения). Поместим один TextBox, Lable и Button.

По нажатию на кнопке будет открываться вторая форма и текст из текстового поля главной формы передастся в текстовое поле второй формы. Изначально, вторая форма выглядит так:

Аналогично первой, она имеет те же контролы. Больше нам и не надо.
Точка входа в приложение запускает главную форму:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace From1FormTo2
{
static class Program
{
// The main entry point for the application.
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
Код главной формы выглядит так:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace From1FormTo2
{
public partial class MainForm : Form
{
//вторая форма
SecondForm secondForm;
//конструктор
public MainForm()
{
InitializeComponent();
}
//обработчик события передачи данных
//от главной формы ко второй
private void btn_mainForm_Click(object sender, EventArgs e)
{
secondForm = new SecondForm(tb_mainForm.Text.Trim());
secondForm.ShowDialog();
if (secondForm.DialogResult == DialogResult.OK)
tb_mainForm.Text = secondForm.ReturnData();
}
}
}
Соответственно, не забудьте подключить кнопку на событие Click.
Здесь, в классе главной формы, есть поле SecondForm secondForm, представляющее объект- вторую форму.
При нажатии на кнопке «Передать», создается вторая форма (вызывается перегруженный конструктор, его мы еще создадим) и запускается методом ShowDialog().
В данном случае нам подходит именно этот метод. При чем, после этого мы обязательно проверяем, не закрыли
ли вторую форму, а выполнили клик по её кнопке. Если, на второй форме был выполнен клик по кнопке,
значит первая форма должна принять данные от второй. Это происходит путем вызова метода ReturnData() у второй формы.
Теперь самое интересное – код второй формы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace From1FormTo2
{
public partial class SecondForm : Form
{
//перегруженный конструктор
public SecondForm(string data)
{
InitializeComponent();
tb_secondForm.Text = data;
}
//обработчик события передачи данных
//от второй формы к главной
private void btn_secondForm_Click
(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
//открытый метод для доступа к
//текстовому полю данной формы
public string ReturnData()
{
return (tb_secondForm.Text.Trim());
}
}
}
Как видим, имеется единственная перегрузка конструктора, который принимает тип string. Помним, что мы пытаемся передавать текст из TextBox.
В конструкторе происходит плановая инициализация компонент и установка текста текстового поля в переданное значение от первой формы.
Далее, подписавшись на событие Click для кнопки второй формы, мы создали обработчик btn_secondForm_Click,
который и имитирует работу кнопки «Ok» любого диалогового окна. Таким образом, нажимая на кнопке «Отправить» (второй формы), мы приводим в исполнение условие
(secondForm.DialogResult == DialogResult.OK)
первой формы, ввиду чего, вызывая метод secondForm.ReturnData(),
мы устанавливаем тектовое поле первой формы в значение тектового поля второй формы.
Работа данного метода, я думаю, уже не требует пояснений. Он просто возвращает текст из единственного текстового поля, при этом, оставляя его приватным.
В итоге, мы передали данные во вторую форму из первой и со второй в первую не нарушая принципы инкапсуляции.
Попробуйте внести текст «ааа» в текстовое поле первой формы и выполнить нажатие на кнопке. Вы увидите в открывшейся второй форме этот текст в её текстовом поле. Попробуйте изменить текст на «ааа ппп» и нажать на кнопку. Вы увидите как после закрытия второй формы данный текст отобразится в текстовом поле главной формы.

Теперь, я думаю, вы будете более правильно осуществлять передачи данных между формами.
В следующей статье мы поговорим, как передавать данные между вебформами в приложениях ASP.NET.