У меня есть для вас интересное решение, включающее закрытие.В конструкторе для Form2 требуется объект Action<TypeOfThing>
, и всякий раз, когда вам нужно вернуть данные в Form1, вызовите это действие и передайте данные в него.Например:
class Form1 : Form
{
private void SomeFunction()
{
TypeOfData data;
Form2 form2 = new Form2((d) => { data = d; });
form2.ShowDialog() // or whatever you do with form2
// After you've definitely got your data object from Form2
DoStuff(data);
}
}
class Form2 : Form
{
private Action<TypeOfData> returnData;
private TypeOfData data;
public Form2(Action<TypeOfData> r)
{
returnData = r;
}
private void SomeFunction()
{
// Whenever it comes time to return the data you've collected
returnData(data);
}
}
Я использовал эту реализацию в следующих обстоятельствах: мне пришлось запросить пароль у пользователя, и я хотел сделать это с помощью диалогового окна, поэтому я разработал свое диалоговое окнос текстовым полем, где пользователь может ввести свой пароль, и кнопки OK и Отмена.В FormClosing я бы возвращал строку (их пароль), вызывая Action, и я бы использовал эту форму только в качестве диалогового окна, поэтому я мог быть уверен, что переменная будет присвоена строке к тому времени, когда код продолжится вForm1.Таким образом, мне не нужно было создавать свойство для пароля, что не имело бы смысла, потому что пароль был только временно необходимой частью данных.