扩大
缩小

窗体之间传递值的几种方法

窗体之间传递值的几种方法

场景如下:

我有一个mainFrm(父窗体), 一个subFrm(子窗体) 点击父窗体的按钮启动子窗体,点击子窗体的按钮可以给父窗体设置值。如下图

第一种方法:启动子窗体,将整个窗体(this)传递过去。(不建议使用)

步骤如下:

1.在主窗体写一个函数SetText函数(这个地方也就是嵌入代码,你需要改那个窗体的内容,就在那个窗体写一个修改的函数。

 public void SetText(string msg) //这个地方SetText是公有的
        {
            this.textBox1.Text = msg;
        }

 2.在new 子窗体的时候加入参数this.

 private void button1_Click(object sender, EventArgs e)
        {          
            subFrm frm = new subFrm(this); //这个方法的核心就是传递this
            frm.Show();
        }

3.给子窗体添加构造函数重载(子窗体持有一个mainFrm类的变量parentFrm)。

 public subFrm(mainFrm parentFrm):this()
        {
            this._parentFrm = parentFrm;
        }

4.在子窗体的button事件上添加如下代码:

 private void button1_Click(object sender, EventArgs e)
        {
            string sendText = this.textBox1.Text;
           this._parentFrm.SetText(sendText);

        }

 

  

第二种:使用委托

   步骤如下:

1.在主窗体写一个函数SetText函数(这个地方也就是嵌入代码,你需要改那个窗体的内容,就在那个窗体写一个修改的函数。

 private void SetText(string msg)
        {
            this.textBox1.Text = msg;
        }

 

2.在子窗体里面定义一个委托(算是委托类吧), public delegate void SendMsgDelegate(string msg); 这个定义要和主函数的SetText方法一致(返回值是void,参数是string)

 并且在定义一个委托(算是委托变量吧) public SendMsgDelegate sendMsg;用委托定义一个委托变量,这个委托变量只能接受返回值是void,参数是string的函数)。是类型安全的。

3.在主窗体的按钮事件上new子窗体的时候加入如下代码

 private void button1_Click(object sender, EventArgs e)
        {
            subFrm frm = new subFrm(); //new一个子窗体
            frm.sendMsg = new SendMsgDelegate(SetText); 给那个子窗体的委托变量(sendMsg)赋值(主窗体的函数SetText)
            frm.Show();
        }

4.在子窗体的按钮事件上加入如下代码

 private void button1_Click(object sender, EventArgs e)
        {
            string sendText = this.textBox1.Text; //读取自己窗体(子窗体)的textBox1的输入值
            if (sendMsg != null)//判断方法是否为空
            {
                sendMsg(sendText);//调用方法
            }

        }

df

 

 

posted on 2016-01-12 11:44  LinuxPanda  阅读(1109)  评论(0编辑  收藏  举报

导航