Как передать объект из формы1 в form2 и обратно в form1?

Я сделал некоторые исследования по этому вопросу, прежде чем принимать решение об этом. Я просто не мог найти ничего, что помогло бы мне.

Я пишу приложение в C # для компактной среды 2.0.

Мне нужно взять объект данных, созданный на form1, и передать этот объект form2. Работа над объектом данных в форме2, а затем передать эти данные обратно в form1, чтобы он мог быть сохранен.

Я понимаю, что форма – это просто объект, и я также понимаю, что объекты пройдены по ссылке, а не по значению. Я также понимаю разницу между этими двумя типами. По какой-то причине я просто не могу заставить его работать.

Каков наилучший и самый чистый способ для этого?

Что вам нужно сделать, так это создать второй конструктор для второй формы, которая принимает объект как параметр … для всех, кого это касается, это может быть весь экземпляр объекта Form1, после чего вы можете получить от него все, что хотите. Сохраните этот объект во второй форме и измените его по мере необходимости. По завершении второй формы ваша первая форма будет иметь эти данные, и вы сможете делать все, что угодно, «обновляясь» после закрытия второй формы.

public partial class YourSecondForm : Form { object PreserveFromFirstForm; public YourSecondForm() { ... its default Constructor... } public YourSecondForm( object ParmFromFirstForm ) : this() { this.PreserveFromFirstForm = ParmFromFirstForm; } private void YourSecondFormMethodToManipulate() { // you would obviously have to type-cast the object as needed // but could manipulate whatever you needed for the duration of the second form. this.PreserveFromFirstForm.Whatever = "something"; } } 

Мне всегда нравилась эта модель. Таким образом, ваши формы не должны знать ни о ком другом. Вы можете настроить событие, подобное следующему, в каком-то classе EventHandler, который используется обеими формами.

 public delegate void SavingObjectHandler(MyObject obj); public event SavingObjectHandler SavingObjectEvent; public void SavingObject(MyObject obj) { if (SavingObjectEvent != null) SavingObjectEvent(obj); } 

то ваша одна форма может вызвать обработчик SavingObject, а другой может подписаться на SavingObjectEvent. Когда первая форма запускает событие, вторая форма будет уведомлена о том, нужна ли обработка, которая ему нужна, и объект будет снова доступен для первой формы после манипуляции.

Что-то вроде этого, где ObservableForm является базовым classом и содержит ChangeEvent для дальнейшей гибкости:

  public class FormMain : Form { private ObServableForm childForm = null; public FormMain () { this.childForm = new ObservableFormConcreateA(this); this.childForm.ChangeEvent += (sender, e) => Application.DoEvents(); } public void Present() { this.childForm.Show(); } } public class ObservableFormConcreateA ObServableForm { private Form workItemForm = null; private delegate void FormChangedHandler(object source, EventArgs args); //ToDo: this should go in the superclass public event FormChangedHandler ChangeEvent; public FormChild(ObServableFormworkItem) { this.workItemForm = workItem; } public void OnUserActionHandler(object sender, EventArgs e) { this.formItemForm.Property = this.txtBoxWhateverValue.Text; if(ChangeEvent != null) ChangeEvent(this, //create your args to specify which control/data changes); } 

}

У меня есть интересное решение для вас, включая закрытие. В конструкторе Form2 требуется объект Action , и всякий раз, когда вам нужно вернуть данные в 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 returnData; private TypeOfData data; public Form2(Action r) { returnData = r; } private void SomeFunction() { // Whenever it comes time to return the data you've collected returnData(data); } } 

Я использовал эту реализацию в следующих обстоятельствах: мне пришлось запрашивать пароль у пользователя, и я хотел сделать это с помощью диалогового windows, поэтому я разработал свое диалоговое окно с текстовым полем, в котором пользователь мог ввести свой пароль, и OK и Отмена. В FormClosing я вернул бы строку (их пароль), вызвав Action, и я бы использовал ее только как диалог, поэтому я мог быть уверен, что переменная будет привязана к строке к моменту продолжения кода Form1. Таким образом, мне не нужно было создавать свойство для пароля, что не имело бы смысла, потому что пароль был всего лишь временно необходимой частью данных.

  • Экран заставки до тех пор, пока нить не закончится
  • Отправить значения из одной формы в другую форму
  • Как установить прозрачность или прозрачность панели в WinForms?
  • Изменение размера windows без полей в нижнем правом углу
  • Запись в TextBox из другого streamа?
  • Прозрачный слой windows, который является кликом и всегда остается на вершине
  • как связать datatable с datagridview в c #
  • BackgroundWorker vs background Thread
  • Водяной знак TextBox в WinForms
  • Лучший способ реализовать сочетания клавиш в приложении Windows Forms?
  • Самая верхняя форма, нажатие «через» возможно?
  • Давайте будем гением компьютера.