Как передать данные между формами в c#

Передача данных между формами в языке c#

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

Передача данных между элементами формы

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

Создадим новое приложение типа Windows Forms Application. После чего добавим на первую форму два элемента управления: TextBox и Button.

форма

В окне Solution Explorer добавим вторую форму.

Solution Explorer

Шаблоны

вторая форма

Вторая форма

И так, для начала поработаем со второй формой.

Перейдите в окно ToolBox и добавьте на форму элемент управления DataGridView (dgv).

DataGridView

Добавление свойств

Для дальнейшей работы нам понадобиться создать три свойства:

public partial class Form2 : Form
{
public string DgvValue { get; set; }
public int DgvRowIndex { get; set; }
public string DgvCellName { get; set; }
public Form2()
{
InitializeComponent();
}
}

Свойство DgvValue используется для получения и установки значения в ячейке элемента управления DataGridView.

Свойство DgvRowIndex — индекс строки в DataGridView.

Свойство DgvCellName — имя или название ячейки, в которую необходимо вставить значение из элемента textbox.

Добавление строк в DataGridView

Для данного примера мы создадим новый метод AddRowsToDgv, с помощью которого добавим в DataGridView две строки и два столбца (Name и Age).

О том, как добавить новую строку в DataGridView более подробно можно прочитать, перейдя по ссылке.

private void AddRowsToDgv()
{
//создаём две ячейки: Name и Age
dgv.Columns.Add("Name", "Имя");
dgv.Columns.Add("Age", "Возврат");
//создаём и добавляем две строки
dgv.Rows.Add();
dgv.Rows.Add();
}

результат на картинке ниже

таблица

Передача значения в textBox

Из второй формы мы будем передать в элемент textBox выбранное нами значение ячейки в DataGridView. Передача будет происходить в момент закрытия второй формы.

Получить выбранное значение в элементе DataGridView можно разными способами, например с помощью события DataGridView_CellContentClick, которое возникает при клике на значении расположенном в ячейки.

событие CellContentClick

private void dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
try
{
//получаем значение ячейки в DataGridView
DgvValue = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

Получение значения переданного из textbox

Теперь мы опишем часть, которая отвечает за получение данных из первой формы, то есть из элемента textbox.

Для начала подпишемся на событие Form2_Load.

В данном событии будет выполняться метод AddRowsToDgv, который создаст две строки в элементе DataGridView, а также здесь мы будем получать данные переданных из первой формы.

private void Form2_Load(object sender, EventArgs e)
{
//добавляем строки в DataGrdiView
AddRowsToDgv();
try
{
//устанавливаем полученное значение в DataGridView
dgv.Rows[DgvRowIndex].Cells[DgvCellName].Value = DgvValue;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

В качестве индекса строки и названия ячейки мы используем созданные нами свойства, чтобы на первой форме мы могли более точно определить, куда передать значение из элемента textbox.

Исходник

public partial class Form2 : Form
{
public string DgvValue { get; set; }
public int DgvRowIndex { get; set; }
public string DgvCellName { get; set; }
public Form2()
{
InitializeComponent();
}
private void AddRowsToDgv()
{
dgv.Columns.Add("Name", "Имя");
dgv.Columns.Add("Age", "Возврат");
dgv.Rows.Add();
dgv.Rows.Add();
}
private void dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
try
{
DgvValue = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Form2_Load (object sender, EventArgs e)
{
AddRowsToDgv();
try
{
dgv.Rows[DgvRowIndex].Cells[DgvCellName].Value = DgvValue;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

Первая форма

Теперь поработаем с первой формой.

Данные из элемента textBox мы будем передавать во вторую форму, например при нажатии на кнопку, поэтому для начала подписываемся на событие Button_Click.

Установка значений свойств

Перед тем как передать данные во вторую форму установим значения для трёх свойств.

private void button1_Click(object sender, EventArgs e)
{
using (Form2 frm2 = new Form2())
{
//значение, которое будет передаваться из textbox
frm2.DgvValue = textBox1.Text;
//индекс строки
frm2.DgvRowIndex = 0;
//название ячейки
frm2.DgvCellName = "Name";
}
}

Событие FormClosed

Затем здесь же подписываемся на событие FormClosed. Сделаем мы это для того, чтобы, во-первых, отловить момент закрытия второй формы, а во-вторых, таким образом, мы сможем получить (на первой форме) переданное значение, которое затем установим в textbox.

private void button1_Click(object sender, EventArgs e)
{
//1. установка свойств
...
//2. подписываемся на событие закрытия второй формы
frm2.FormClosed += (closedSender, closedE) =>
{
//передаём значение из DataGridView в textbox
 textBox1.Text = frm2.DgvValue;
};
}

Открытие второй формы

И последнее что нам осталось сделать, так это отобразить или открыть вторую форму. Сделать это можно с помощью метода Show либо ShowDialog.

private void button1_Click(object sender, EventArgs e)
{
//1. установка свойств
...
//2. подписываемся на событие закрытия второй формы
...
//3. открытие второй формы
frm2.ShowDialog();
}

Полный исходник

private void button1_Click(object sender, EventArgs e)
{
using (Form2 frm2 = new Form2())
{
frm2.DgvValue = textBox1.Text;
frm2.DgvRowIndex = 0;
frm2.DgvCellName = "Name";
frm2.FormClosed += (closedSender, closedE) =>
{
textBox1.Text = frm2.DgvValue;
};
frm2.ShowDialog();
}
}

Теперь если запустить наше предложение и нажать на кнопку, расположенную на первой форме, то данные из textbox будут переданы во вторую форму в элемент DataGridView.

формы

Чтобы передать данные из второй формы нам нужно сначала выбрать значение в DataGridView, а затем просто закрыть форму. Либо можно, например, добавить на форму кнопку и передать данные с помощью неё.

Читайте также:

12 комментариев

  1. ОГРОМНОЕ СПАСИБО!!!))) ВСЕ ПОЛУЧИЛОСЬ))))

  2. Не подскажите, как открыть новую форму, в старом окне? Несколько разных таблиц некрасиво открывать в разных окнах.

  3. Форма — это и есть окно. Здесь, как вариант можно изменить свойство Visible (форма не будет отображаться, но при этом будет существовать):
    form1.Visible = false;
    frm2.ShowDialog();

  4. Спасибо за подсказку. Проблему решил другим способом.
    this.Hide()
    this.Show()

  5. Можно и так.
    Метод Hide — это лишь обёртка для свойства Visible со значением false.
    Вместо form1.Visible = false можно указать this.Visible = false тоже самое будет.

  6. Ратмир says:

    Наиболее подходящий способ, добавить во второй форме конструктор с параметрами.
    Для сворачивания главной(первой) формы, в конструкторе необходимо параметром передавать ссылку на форму из которой вызывается вторая. тогда при отработке второй формы можно вызвать(восстановит) главную.

  7. Анастасия says:

    не подскажите, как с одного текстбокса записать данные в разные строки и столбцы?

  8. //первая ячейка первая строка
    dataGridView1.Rows[0].Cells[0].Value = textBox1.Text;
    //пятая ячейка вторая строка
    dataGridView1.Rows[4].Cells[1].Value = textBox1.Text;
  9. Анастасия says:

    А в этой программе что в примере, как это сделать?

  10. Заменить textBox1.Text на DgvValue.

  11. Анастасия says:

    Извините, еще вопрос, я передаю данные из datagrid1 в datagrid2 заменила текстбокс на датагрид, но данные не передаются. Почему?

  12. Добавьте код. Потому что не понятно из вопроса, что и как передаётся.

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*