2 голоса
 
753 просмотра
6.01.2018 / 22:00  Витаминыч

Передача данных в главную форму

Встал вопрос, как просто и правильно реализовать передачу данных в главную форму из вспомогательной.
Так как я создавал DataGridView через конструктор формы и там же привязал столбцы к данным (QA #232, QA #234), то программно добавить новую строку я не могу, к тому же, это и не требуется, т.к. имеется привязка к List<>.

На главной форме таблица, внизу кнопка Добавить, клик по которой создает новую форму. Вот эта форма:
https://pp.userapi.com/c834400/v834400712/7a451/44C7BA7fR1Q.jpgКнопке Добавить назначено свойство DialogResult.OK, нажатие на нее должно как-то передать новую запись в List, который доступен только в главной форме.
Ответы
 
1 голос
 
# 6.01.2018 / 22:12  Витаминыч
А решение очень простое)
Код второй формы:
  1. public partial class AddRecordForm : Form
  2. {
  3.         private void BAddItem_Click(object sender, EventArgs e) => DialogResult = DialogResult.OK;
  4.         public AddRecordForm() => InitializeComponent();
  5.         public Record ReturnData() => (new Record(Convert.ToInt32(tbAddId.Text), tbAddName.Text, Convert.ToDouble(tbAddMass.Text), tbAddDim.Text, tbAddMat.Text)); // Метод отправки данных в любую форму
  6. }
И код главной формы:
  1. public partial class Form1 : Form
  2. {
  3.         Record record;
  4.         List<Record> lr = new List<Record>();
  5.         AddRecordForm f2;
  6.         // ...
  7.         private void BtAdd_Click(object sender, EventArgs e) {
  8.             f2 = new AddRecordForm(); // 1
  9.             f2.ShowDialog();
  10.             if (f2.DialogResult == DialogResult.OK) {
  11.                 lr.Add(f2.ReturnData()); // 2
  12.                 dataGridView1.DataSource = null; // 3
  13.                 dataGridView1.DataSource = lr;
  14.             }
  15.             f2 = null; // 4
  16.         }
  17.         // ...
  18. }
Обработчик кнопки Добавить на главной форме
1. Создаем новую форму, чтобы поля были пустыми, вызываем как диалоговое окно
2. Если в той форме происходит событие DialogResult.OK, то добавляем данные в лист через метод ReturnData().
3. Обнуляем привязку DataSource и заново добавляем лист. Иначе не таблица остается без изменений, но в списке данные будут.
4. Удаляем форму, чтобы не засорять память.

https://pp.userapi.com/c834400/v834400805/7b9e2/vDmt-Wfq6fc.jpg
Рис. 1. Таблица до изменений

https://pp.userapi.com/c834400/v834400805/7b9e9/tHk04Dm2ZhA.jpg
Рис. 2. Добавляем данные

https://pp.userapi.com/c834400/v834400805/7b9f0/67UcNHRMFvU.jpg
Рис. 3. Изменения в таблице

Итого: новая форма никак не изменяет данные в главной форме и более того, она вообще ничего не знает о других формах (инкапсуляция). Так же не требуется вспомогательный статический класс для общих данных.
Изм. Витаминыч от 6.01.2018 / 22:30
Всего: 1

Реклама

Мы в соцсетях

tw tg yt gt