Отправить параметры из одной формы в другую на C #

#c# #winforms

#c# #winforms

Вопрос:

У меня есть две формы (C #). В одной форме есть метод, который принимает данные и сохраняет их в базе данных после закрытия формы, которую я хочу использовать в другой (основной форме) для обновления данных. Как это сделать с помощью ООП или просто сделать максимально красиво и хорошо.

Ответ №1:

Обычно, когда вы хотите разрешить обновление основной формы, вы создаете общедоступный метод в этой форме и вызываете его из другой формы, когда у нее есть новые данные и она может отправлять их в основную форму. Это не должно быть проблемой.

Обратите внимание, что если вы хотите отправить данные куда-либо, вам нужна ссылка на это место, т. Е. Вам нужна ссылка на основную форму в другой форме. Либо передайте this из основной формы в конструктор другой формы, либо вы также можете сохранить ссылку в статическом поле в Program классе (сделайте это в Main методе, в котором вы создаете основную форму) и т.д.

Ответ №2:

Наиболее удобным для ООП решением, вероятно, было бы иметь событие в любой форме, которая «запускает» обновление данных, на которое подписано и обрабатывается методом другой формы. Вот базовая настройка:

 public class Form1:Form
{
   public event EventHandler<MyDataObject> DataChanged;

   ...

   public override void OnClosing(CancelEventArgs e)
   {
      //Put in logic to determine whether we should fire the DataChanged event
      try
      {
         if(DataChanged != null) DataChanged(this, myFormCurrentData);
         base.OnClosing(e);
      }
      catch(Exception ex)
      {
         //If any handlers failed, cancel closing the window until the errors
         //are resolved.
         MessageBox.Show(ex.Message, "Error While Saving", MessageBoxButtons.OK);
         e.Cancel = true;
      }
   }
}

...

public class Form2:Form
{
   //Called from wherever you would open Form1 from Form2
   public void LaunchForm1()
   {
      var form1 = new Form1();
      form1.DataChanged  = HandleDataChange;
      form1.Show();
   }

   private void HandleDataChange(object sender, MyDataObject dataObj)
   {
      //Do your data validation or persistence in this method; if it fails,
      //throw a descriptive exception, which will prevent Form1 from closing.
   }
}
  

Вам не обязательно использовать событие; также можно использовать простой делегат, и он будет выполнять практически то же самое, при этом его можно указать в конструкторе формы (таким образом, требуется предоставить обработчик).

Ответ №3:

Вы можете сделать что-то подобное для обновления значений в одной форме из другой формы…

Код формы 2

     public event EventHandler<UpdatedEventArgs> updateEvent;

    public class UpdatedEventArgs : EventArgs
    {
        public string SomeVal { get; set; } // create custom event arg for your need
    }

    protected virtual void OnFirstUpdateEvent(UpdatedEventArgs e)
    {
        if (updateEvent != null)
            updateEvent(this, e);
    }


    private void button1_Click(object sender, EventArgs e)
    {
        UpdatedEventArgs eventData = new UpdatedEventArgs(); 
        eventData.SomeVal = "test"; // set update event arguments, according to your need

        OnFirstUpdateEvent(eventData);
    }

    public Form2()
    {
        InitializeComponent();
    }
  

Код формы 1

     public Form1()
    {
        InitializeComponent();

        Form2 form2 = new Form2();
        form2.updateEvent  = new EventHandler<Form2.UpdatedEventArgs>(form2_updateEvent); // create event handler to update form 1 from form 2
        form2.Show();
    }

    void form2_updateEvent(object sender, Form2.UpdatedEventArgs e)
    {
        if (e != null amp;amp; e.SomeVal != null)
        {
            // Do the update on Form 1 
            // depend on your event arguments update the grid  
            //MessageBox.Show(e.SomeVal); 
        }

    }