Как вы передаете объект из form1 в form2 и обратно в form1? - PullRequest
4 голосов
/ 03 февраля 2011

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 03 февраля 2011

Что вам нужно сделать, это создать второй конструктор для вашей второй формы, который принимает объект в качестве параметра ... для меня все равно, это может быть весь экземпляр объекта 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";
    }


}
2 голосов
/ 03 февраля 2011

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

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

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

0 голосов
/ 24 марта 2017

У меня есть для вас интересное решение, включающее закрытие.В конструкторе для 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.Таким образом, мне не нужно было создавать свойство для пароля, что не имело бы смысла, потому что пароль был только временно необходимой частью данных.

0 голосов
/ 03 февраля 2011

Примерно так: ObservableForm является базовым классом и содержит 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);

   }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...