在c#中从一个表单发送参数到另一个表单

本文关键字:表单 参数 另一个 一个 | 更新日期: 2023-09-27 18:11:11

我有两种形式(c#)。在一个表单中,有一种方法可以在关闭我想要在另一个表单(主表单)上更新数据的表单后获取数据并将其存储在数据库中。如何使用OOP或简单地做得最漂亮和好。

在c#中从一个表单发送参数到另一个表单

一般来说,当你想让主表单更新时,你可以在那个表单上创建一个公共方法,当它有新的数据并可以将它们发送到主表单时,从另一个表单调用它。这应该不成问题。

注意,如果你想发送数据到某个地方,你需要一个对那个地方的引用,也就是说,你需要一个对另一个表单中的主表单的引用。要么将this从主表单传递到另一个表单的构造函数,或者您也可以将引用存储在Program类的静态字段中(在Main方法中创建主表单)等。

对oop最友好的解决方案可能是在任何表单上"触发"数据更新,该事件由另一个表单的方法订阅和处理。下面是一个基本的连接:

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.
   }
}

你不必使用事件;也可以使用一个简单的委托,它可以做几乎相同的事情,同时也可以在表单的构造函数中指定(因此需要提供处理程序)。

您可以这样做,以便从一个表单更新另一个表单的值…

表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 && e.SomeVal != null)
        {
            // Do the update on Form 1 
            // depend on your event arguments update the grid  
            //MessageBox.Show(e.SomeVal); 
        }
    }