窗体参数传递---委托、事件

本文详细介绍了在窗体间通过构造函数和委托事件进行参数传递的方法,解决了窗体间参数传递的问题,并通过实例代码展示了正确实现步骤。
 

     

问题描述: 如上图所示,将Form1点击按钮,将Form2显示并将其值传递给Form2中

            简单讲,现在有两种方式可以完成二者之间的参数传递,首先第一种:(1) 定义带参的构造函数 (2) 委托、事件

(一) 构造函数传参

抛出的问题中,我们可以明确Form1的值传递给Form2,;我们可以定义Form2一个带参的构造函数,在实现button_click事件时将

Form1的内容传递给Form2,这样即可完成参数传递任务。

        public Form2( string str)
        {
           // 定义带参构造函数
            InitializeComponent();
            this.textBox1.Text = str;
        }
        private void button1_Click(object sender, EventArgs e)
        {
          // 在Form1的click事件响应中实现参数传递
            Form2 frm = new Form2(this.textBox1.Text);
            frm.Show();
        }

(二)委托及事件
   其实利用委托及事件完成参数传递降低了窗体间的耦合,其方法如下:

   (1) 定义弹出窗体的委托、委托的一个事件,及该事件响应的地方;

   (2) 在父窗体中定义响应的方法,并在实例化窗体时注册该方法给弹出窗体。

    问题描述中,Form1为传出参数窗体,称之为“弹出窗体”;Form2为接受参数窗体,称之为“父窗体”。

    首先定义Form1的一个委托、一个委托的事件,及触发该事件的地方:

   public delegate void MyDelegate1(string str); //委托
    public event MyDelegate1 MyEvent1;//事件
    private void button1_Click(object sender, EventArgs e)
    {
          Form2 frm2 = new Form2();
          MyEvent1(this.textBox1.Text);
         frm2.Show();
     }  //触发事件地点

其次是定义响应方法,及窗体实例化:

        public Form2( )
        {
            InitializeComponent();
            Form1 frm1 = new Form1();             
            //Form1 frm1 = Form1.Instance();            
            frm1.MyEvent1 +=new MyDelegate1(frm1_MyEvent1);
        }
        void frm1_MyEvent1(string str)
        {
            this.textBox1.Text = str;
        }

运行期间出现如下错误:


由于Form2的构造函数再次实例化了一个新的Form1。。。。(究其原因,待定,不是很清楚)

但是正确的方向是,定义一个静态实例化窗体,如下代码:

        private Form1()
        {
            InitializeComponent();
        }
        private static Form1 _instance = null;
        public static Form1 Instance()
        {
            if (_instance == null)
                _instance = new Form1();
            return _instance;
        }

然后将Form2中实例化Form1方式修改为如下:

public Form2( ) 
{ 
   InitializeComponent(); 
   //Form1 frm1 = new Form1(); --------------> 由于Form1构造函数成为私有,故不能使用。删除
   Form1 frm1 = Form1.Instance(); -----------> 使用单一的窗体实例化
  frm1.MyEvent1 +=new MyDelegate1(frm1_MyEvent1); 
}

至此完成了问题描述内容!
若问题描述换成:Form1点击按钮显示Form2,Form2中值修改显示在Form1中,亦可参照上述方式完成参数传递;

若问题描述换成:Form1点击按钮显示Form2,并将Form1中值显示在Form2中;修改Form2中值,点击按钮内容显示在Form1中。则完整的源代码如下所示:

//Form1.cs
namespace Weituo
{
    public delegate void MyDelegate1(string str);
    public partial class Form1 : Form
    {
        public event MyDelegate1 MyEvent1;
        private Form1()
        {
            InitializeComponent();
        }
        private static Form1 _instance = null;
        public static Form1 Instance()
        {
            if (_instance == null)
                _instance = new Form1();
            return _instance;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.MyEvent +=new MyDelegate(frm2_MyEvent);
            MyEvent1(this.textBox1.Text);
            frm2.Show();
        }
        private void frm2_MyEvent(string str)
        {
            this.textBox1.Text = str;
        }

    }
}

Form2.cs 文件

//Form2.cs
namespace Weituo
{
    public delegate void MyDelegate(string str);
    public partial class Form2 : Form
    {
        public event MyDelegate MyEvent;

        public Form2( )
        {
            InitializeComponent();
            //Form1 frm1 = new Form1();
            Form1 frm1 = Form1.Instance();
            frm1.MyEvent1 +=new MyDelegate1(frm1_MyEvent1);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MyEvent(this.textBox1.Text);
        }
        void frm1_MyEvent1(string str)
        {
            this.textBox1.Text = str;
        }
    }
}




 


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值