在C#中将参数从一种形式发送到另一种形式

时间:2011-10-11 17:33:21

标签: c# winforms

我有两种形式(C#)。在一种形式中,有一种方法可以在关闭我希望在另一个(主窗体)上更新数据的表单之后获取数据并将它们存储在数据库中。如何使用OOP或简单地做到最美丽和最好。

3 个答案:

答案 0 :(得分:1)

通常,当您想要更新主窗体时,可以在该窗体上创建一个公共方法,并在具有新数据时从另一个窗体中调用它,并将它们发送到主窗体。这应该不是问题。

请注意,如果您想将数据发送到某个地方,则需要对该地点的引用,即您需要在其他表单中引用主表单。将this从主窗体传递到另一个窗体的构造函数,或者您也可以将引用存储在Program类的静态字段中(在Main方法中创建主要形式)等。

答案 1 :(得分:0)

对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 :(得分:0)

您可以执行以下操作,以便从另一种形式更新一个表单中的值...

表单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); 
        }

    }