Вот как мне нравится передавать параметры в другую форму и обратно:
При условии следующего дизайна формы для Form1 и Form2:
В этом примере текстовое поле 'txtBoxForm1' в Form1 передается в Form2, где оно используется для инициализации текстового поля 'txtBoxForm2' в Form2. После того как пользователь взаимодействует с Form2 и завершает ее, нажимая кнопку [Возврат к Form1], значение текстового поля 'txtBoxForm2' присваивается параметру, который возвращается (по ссылке) в текстовое поле 'txtBoxForm1' в Form1.
Кодирование выполняется в два простых шага:
Шаг 1) В Form1 передать параметр (ы) в Form2, перегрузив метод ShowDialog ():
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnSend_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
//Step 1)
//Display the form passing parameter(s) via overloading
//the ShowDialog() method.
//In this example the parameter is the 'txtBoxForm1' on Form1.
// f2.ShowDialog(); is replaced by
f2.ShowDialog(ref txtBoxForm1);
}
}
В приведенном выше коде параметром является само текстовое поле 'txtBoxForm1', которое передается по ссылке. Передача по ссылке является причиной того, что он не только передает значение текстового поля в Form2, но также может получать и отображать в Form1 любые изменения, примененные к этому параметру текстового поля при выполнении Form2.
Я поместил весь класс Form1, чтобы показать, что в этом классе нет ничего особенного, кроме перегрузки вызова метода f2.ShowDialog ().
Шаг 2) Получение и возврат параметра (ов) с помощью перегруженного метода ShowDialog ():
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void btnReturn_Click(object sender, EventArgs e)
{
this.Close();
}
//Step 2)
//Receiving and returning parameter(s) via the overloaded ShowDialog() method.
//This saves the need to have Properties and or fields associated
//to parameters when overloading the above Form() constructor instead.
public void ShowDialog(ref TextBox txtBoxForm1)
{
//Assign received parameter(s) to local context
txtBoxForm2.Text = txtBoxForm1.Text;
this.ShowDialog(); //Display and activate this form (Form2)
//Return parameter(s)
txtBoxForm1.Text = txtBoxForm2.Text;
}
}
Снова я предоставил полный код класса формы (в данном случае Form2), чтобы показать, насколько ограничено вмешательство в кодирование. Никаких дополнительных полей или свойств здесь не требуется. Это потому, что я использовал здесь инструкцию ShowDialog (), а не конструктор Form2 () из Form1 для передачи параметра.
В отличие от конструктора Form2 (), метод ShowDialog () является оболочкой фазы взаимодействия пользователя с Form2. Таким образом, его синхронизация позволяет параметру '(ref txtBoxForm1)' быть полным и достаточным представителем параметра, который мы хотим отправить и получить.
Перегрузка метода путем его повторного объявления с другим набором параметров (также называемых сигнатурой) - мощная особенность C # .net. В этом случае здесь, с одной стороны, это позволяет добавить параметр (ы) к вызову метода ShowDialog (), а с другой стороны, перегруженный метод ничего не теряет из исходной версии этого же метода, поскольку исходная версия метод платформы ShowDialog () .net также выполняется с помощью this.ShowDialog (); инструкция.
На данный момент это все для меня.
Надеюсь, это поможет!