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

C# 在C中将参数从一个表单发送到另一个表单#,c#,winforms,C#,Winforms,我有两种形式(C)。在一个表单中,有一个方法,在关闭我想要在另一个表单(主表单)上更新数据的表单后,获取数据并将其存储在数据库中。如何使用OOP或简单地制作最漂亮、最完美的表单。通常,当您希望更新主表单时,您可以在该表单上创建一个公共方法,并在另一个表单拥有新数据并可以将其发送到主表单时从另一个表单调用该方法。这不应该是个问题 请注意,如果您想将数据发送到某个地方,您需要对该地方的引用,即,您需要对另一个表单中的主表单的引用。要么将this从主窗体传递到另一个窗体的构造函数,要么也可以将引用存储

我有两种形式(C)。在一个表单中,有一个方法,在关闭我想要在另一个表单(主表单)上更新数据的表单后,获取数据并将其存储在数据库中。如何使用OOP或简单地制作最漂亮、最完美的表单。

通常,当您希望更新主表单时,您可以在该表单上创建一个公共方法,并在另一个表单拥有新数据并可以将其发送到主表单时从另一个表单调用该方法。这不应该是个问题


请注意,如果您想将数据发送到某个地方,您需要对该地方的引用,即,您需要对另一个表单中的主表单的引用。要么将
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.
   }
}
公共类表单1:表单
{
公共事件事件处理程序数据已更改;
...
一旦丢失,公共覆盖无效(CancelEventArgs e)
{
//放入逻辑以确定是否应触发DataChanged事件
尝试
{
如果(DataChanged!=null)DataChanged(this,myFormCurrentData);
基数(e);
}
捕获(例外情况除外)
{
//如果任何处理程序失败,请取消关闭窗口,直到出现错误
//问题解决了。
MessageBox.Show(例如Message,“保存时出错”,MessageBoxButtons.OK);
e、 取消=真;
}
}
}
...
公开课表格2:表格
{
//从Form2打开Form1的任何位置调用
public void LaunchForm1()
{
var form1=新form1();
form1.DataChanged+=HandleDataChange;
表1.Show();
}
私有void HandleDataChange(对象发送方,MyDataObject dataObj)
{
//使用此方法进行数据验证或持久化;如果失败,
//引发描述性异常,这将阻止Form1关闭。
}
}

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

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

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

    }
公共事件处理程序updateEvent;
公共类UpdateEventTargets:EventArgs
{
公共字符串SomeVal{get;set;}//根据需要创建自定义事件参数
}
受保护的虚拟void OnFirstUpdateEvent(UpdateEventArgs e)
{
if(updateEvent!=null)
更新事件(本,e);
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
UpdatedEventArgs eventData=新的UpdatedEventArgs();
eventData.SomeVal=“test”//根据需要设置更新事件参数
OnFirstUpdateEvent(eventData);
}
公共表格2()
{
初始化组件();
}
表格1代码

    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();
    }
    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); 
        }

    }
public Form1()
{
初始化组件();
Form2 Form2=新Form2();
form2.updateEvent+=new EventHandler(form2_updateEvent);//创建事件处理程序以从表单2更新表单1
表2.Show();
}
void form2\u updateEvent(对象发送方,form2.updateEventTarget e)
{
如果(e!=null&&e.SomeVal!=null)
{
//对表格1进行更新
//根据事件参数更新网格
//MessageBox.Show(例如SomeVal);
}
}