C# winform 弹出窗体给父窗体传值

  Winform程序有很多传值的方法,抱着学习的态度。利用委托注册事件的方法,给窗体统一添加事件:

  首先定义一个Frm_Base:

 1 namespace 任意
 2 {
 3     public partial class Frm_base : Form
 4     {
 5         public delegate void InitHandler(BaseDTO dto); //声明初期化窗体委托
 6         public event InitHandler InitEvent; //声明初期化窗体事件
 7 
 8         #region 由子窗体调用的事件
 9 
10         public void doInitCustomerEvent(BaseDTO customer)
11         {
12             InitEvent += this.initCustomer;
13             InitEvent(customer);
14         }
15         #endregion
16 
17         #region 需要被重写的方法
18 
19         public virtual void initCustomer(BaseDTO customer)
20         {
21             return;
22         }
23         #endregion
24     }
25 }

  然后在需要接受值得父窗体中继承 Frm_Base, 并且重写Base类中的方法:

1 override public void initCustomer(BaseDTO _dto)

  具体的方法,根据具体的需求来写,需要子窗体传过来的值就定义在参数里

  之后是调用子窗体。不要问已经把this传给了子窗体,直接调用方法就行了,为什么还要用委托。

  你的子窗体是为了复用而存在,我们需要他只知道base调用了他,而他给base返回值。

1 Frm_House_List fhs = new Frm_House_List(this);
2                 fhs.ShowDialog();

  子窗体来调用事件:

 1 namespace 任意
 2 { 
 3    public partial class Frm_House_List : Form
 4     {
 5         Frm_base frm;
 6 
 7         private Frm_House_List()//屏蔽掉无参数的构造方法
 8         {
 9             InitializeComponent();
10         }
11 
12         public Frm_House_List(Frm_base _frm)
13         {
14             this.frm = _frm;
15             InitializeComponent();
16         }
17         private void btn_Click(object sender, EventArgs e)
18         {
19 
20             frm.doInitCustomerEvent(new Customer());//委托父窗体初期化方法
21           
22             this.Close();
23         }
24      }
25 }

  执行的则是你在父窗体重写的方法。