2014-11-19 1 views
-1

У меня есть основная форма, MainForm, которая открывается другой формой, NewPasswordForm. Это происходит, когда я нажимаю AddButton в основной форме. Код ниже:Возврат информации из другой формы, заканчивается на следующую форму:

MainForm : Form { 
    private void AddButton_Click(object sender, EventArgs e) { 
     NewPasswordForm newPassword = new NewPasswordForm(); 
     using (NewPasswordForm form = new NewPasswordForm()) 
     { 
      var result = form.ShowDialog(); 
      if (result == DialogResult.OK) 
      { 
       Console.WriteLine("Made it work"); 
       Login login = new Login(); 
       //Need to get passed the login information from the NewPasswordForm 
       //so that I can add it to a list of Logins 
      } 
     }    
    } 
} 

NewPaswordForm имеет четыре поля для заполнения. После того, как я нажал на кнопку добавления в NewPasswordForm Я хочу

public partial class NewPasswordForm : Form { 
    Login login = new Login(); 
    private void AddButton_Click(object sender, EventArgs e) { 
     //Do stuff with the four fields to creat a Login 
     //pass the login along with the DialogResult.OK below. 
     this.DialogResult = DialogResult.OK; 
    } 

Мой вопрос, как я могу идти о передаче этой информации, как только я нажимаю AddButton на NewPasswordForm?

+0

Способ, которым я это сделал, - добавить публичные свойства в NewPasswordForm и получить доступ к ним из MainForm после завершения ShowDialog(). – gcarvelli

ответ

2

Вот пример кода публичного объекта недвижимости I (и Eugene Sh.). отметил:

public partial class NewPasswordForm : Form { 

    public Login LoginInfo { get; private set; } 

    private void AddButton_Click(object sender, EventArgs e) { 
     LoginInfo = new Login(); 
     //Do stuff with the four fields to create a Login 
     //pass the login along with the DialogResult.OK below. 
     this.DialogResult = DialogResult.OK; 
    } 
} 

Тогда, как только вы вернулись на MainForm:

MainForm : Form { 
    private void AddButton_Click(object sender, EventArgs e) { 
     //NewPasswordForm newPassword = new NewPasswordForm(); // Don't need this line 
     using (NewPasswordForm form = new NewPasswordForm()) 
     { 
      var result = form.ShowDialog(); 
      if (result == DialogResult.OK) 
      { 
       Console.WriteLine("Made it work"); 
       Login login = form.LoginInfo; 

       // do something 
      } 
     }    
    } 
} 

Edit: я просто понял, что есть два NewPasswordForms воплощенные в методе AddButton_Click. Для этой операции вам не нужны два.

+1

'this.DialogResult = DialogResult.OK;' Фактически закрывает форму. Это довольно хорошо. – Funlamb

+0

Ну, я буду проклят. Из http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspxMSDN: «Если форма отображается в виде диалогового окна, установка этого свойства со значением из перечисления DialogResult задает значение результата диалогового окна для формы, скрывает модальное диалоговое окно и возвращает управление вызывающей форме. " Я исправлю это сейчас. – gcarvelli

+0

Да. Я обнаружил, что это поднимает этот вопрос раньше. Хорошая маленькая особенность. – Funlamb

3

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

Обновление: Я беру это из комментариев в соответствии с просьбой. Возникает вопрос: почему бы не определить и не запустить событие вместе с необходимыми данными и не уловить его из основной формы. Ответ заключается в том, что архитектура, управляемая событиями, предназначена для проектирования систем REACTIVE, реагируя на асинхронные события, задаваемые различными компонентами. Но в этом случае роль такого события выполняется нажатой кнопкой. Нет причин добавлять асинхронное поведение помимо этого. После нажатия кнопки ОПРЕДЕЛЕН, что свойство установлено и готово к чтению. Событие будет на месте, если мы захотим запустить какой-то процесс после нажатия кнопки и дождитесь окончания. Но это не так.

Смежные вопросы