littleguga
@littleguga
Не стыдно не знать, а стыдно не интересоваться.

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

Как правильно передавать данные между формами.
Есть форма 1 - в ней есть таблица, при нажатии на кнопку "добавить" - появляется вторая форма, в которой вводится нужная информация, обрабатывается и т.д. После нажатия кнопки "ок" во 2 форме - строка добавляется в таблицу.
1. Допустимо ли делать через родителя?
В первой форме:
addForm addFormWindow = new addForm(){ Owner = this };
addFormWindow.ShowDialog();

Во второй:
public void addFormBtn_Click(object sender, EventArgs e)
if (this.Owner != null)
	{
		main f = (main)this.Owner;
		f.dataView.Rows.Add(codeUser.Text, nameUser.Text, surnameUser.Text, fatherUser.Text);
	}


2. Если использовать делегаты:
2.1 Делегат - ссылка на метод, которая позволяет вызывать этот метод через обращение к этой ссылке, так?
2.2 Можете, пожалуйста, посоветовать какой-либо урок, ибо из профессорвеб.ру и документации msdn, к сожалению, ничего не понял.

Заранее благодарен за ответ!
  • Вопрос задан
  • 4261 просмотр
Решения вопроса 3
Neuroware
@Neuroware
Программист в свободное от работы время
1. Работать будет
но могут быть проблемы с вторичным использованием формы добавления, к примеру если захочется форму 3 и на ней будет уже dataView2 то работать не будет

2. Можно, но не думаю что это нужно,
советую читать в сторону Events, в двух словах, на форме 2 создается событие с параметрами, которые нужно передать в первую форму, первая форма подписывается на нее и делает с этими параметрами что ее душе угодно, вторая форма когда нужно вызывает event и передает параметры. Такая реализация может иметь смысл если в диалоге нужно например выбрать несколько записей или параметров.

Вариант 3 (проще)
Создать параметры на 2 форме (гуглить по "C# get;set;"), соответственно на второй форме они заполняются
На первой форме вызывается ShowDialog и в зависимости от результата просто читаются эти параметры из формы.
Ответ написан
Комментировать
yarosroman
@yarosroman Куратор тега C#
C# the best
Сделать класс-модель, и в форме два переделать конструктор, который принимает эту модель в качестве параметра, а в форме два, по событию от кнопки на форме два, заполнять модель, и далее после ShowDialog, смотреть результат диалога и уже заполнять вашу таблицу,

например
public clacc Model
{
   string Name {get;set;}
   int Age {get; set;}
}


в AddFormWindow делаем так
public class AddFormWindow 
{
    private Model _model;

    public AddFormWindow(Model value) : base()
   {
        if (value!=null)
        {
             _model=value;
        }
        else
            throw new ArgumentNullException("Can`t be NULL");
   }

    public void addFormBtn_Click(object sender, EventArgs e)
    {
         _model.Name=NameBox.Text;
        _model.Age=Int32.Parce(Agebox.Text);
    }
}


в коде вызова пишем
Model model = new Model();
addForm addFormWindow = new addForm(model);
if (addFormWindow.ShowDialog()==DialogResult.OK)
{
//делаем тут необходимые манипуляции, все данные из формы находятся в model
}


естественно свойствам DialogResult кнопок на форме2 присваиваем необходимые значения DialogResult.Ok и DialogResult.Cancel

В какой технологии написано все? для WinForms можно использовать паттерн MVP, для WCF (да и вообще XAML) лучше перейти на MVVM, тогда уберется взаимосвязанность объектов, появится возможность тестирования, повторность использования объектов.
Ответ написан
newross
@newross
Product owner
Варианты с дополнительными свойствами формы или передачей параметров в конструктор просты, но лучше использовать отдельный сервис - класс, в котором будут хранится передаваемые свойства и какая-то логика работы с ними. И, в идеале, использовать ioc-контейнер для получения этого сервиса в формах. Тогда будет гарантия, что формы используют одни и те же данные.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы