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

来源:互联网 发布:手机木马软件监听器 编辑:程序博客网 时间:2024/05/22 15:49
 

     

问题描述: 如上图所示,将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.csnamespace 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.csnamespace 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;        }    }}