窗体间的传值有很多方法,最简单的就是设置所有权方法。不过利用事件也是一种方法。顺便学习下事件.
1,建立两个窗体,Form1和Form2.Form1上有一个BUTTON控件,用于show出Form2.还有一个lable控件,用于看效果.form2上只有一个button控件,用于触发事件.
2,form1代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace test
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
            
            
        }        private void button1_Click(object sender, EventArgs e)
        {//单击该按钮时SHOW出第二个窗体
            Form2 fm2 = new Form2();
            fm2.myevent += new Form2.mydelegate(gengxin);//在SHOW出窗体的同时订阅FORM2的事件,调用gengxin()方法.
            fm2.ShowDialog();
        }
        public void gengxin() //用于修改label的方法
        {
            this.label1.Text = "改了吗";
        }
    }3,Form2代码:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace test
{
    public partial class Form2 : Form
    {        public delegate void mydelegate();//定义一个委托
         public event mydelegate myevent;//定义上诉委托类型的事件
        
        
        public Form2()
        {
            InitializeComponent();
            
        }        private void button1_Click(object sender, EventArgs e)
        {
            //在单击该窗体上的按钮时触发事件
            if(myevent!=null)
            {
                myevent();
            }
        }
    }
}
}4,对事件了解不深,希望大家指教!

解决方案 »

  1.   

    这个方法不错啊,2个窗体之间的耦合小了,form2的可重用性高了
      

  2.   

    恩,可是你的例子里并没有明显的体现出传值的操作。this.label1.Text = "改了吗";这里 this.label1.Text 要是想取得 Form2 里输入的值,该如何处理?解决办法——只能是修改delegate:public delegate void mydelegate(string txt);//定义一个委托然后在引发事件的地方 —— myevent(),把Form2上的值传给 txt 再由 txt 传给 Form1 的Label1所以,这里用事件或者委托传递说白了是绕了个大弯
      

  3.   

    Label lab=Application.FindForms["Form1"].Controls["label1"] as Label;
    if(lab!=null)
      lab.Text="改了吗?";我一般用上面的方法.
      

  4.   

    不错,感觉不用事件吧,这不是委托调用吗?
    public event mydelegate myevent;//定义上诉委托类型的事件 
    ->public mydelegate myevent;
    不知道event,在起什么作用?还请指点。
      

  5.   

    利用事件不错,我在这里讲到了另外几种方法,也好用的。
    窗体的参数传递
    http://blog.csdn.net/zhzuo/archive/2006/05/05/708941.aspx#sec5
      

  6.   

    也可以把委托中的参数写成:
    public delegate void mydelegate(object sender, myEventArgs e);
    其中myEventArgs是一个类,从EventArgs类继承下来的。在这个类中可以添加任何类型的自定义参数用于传值。在Form2中:
    private void button1_Click(object sender, EventArgs e) 

         //在单击该窗体上的按钮时触发事件 
          if(myevent!=null) 
         {
            myEventArgs e = new myEventArgs();
            e.自定义参数1 = 值;
             e.自定义参数2 = 值;
             ......
            myevent(this, e); 
         } 
    }在Form1中:
    public void gengxin(object sender, myEventArgs e) //用于修改label的方法 

        this.label1.Text = e.自定义参数;
    }
     
      

  7.   

    public event mydelegate myevent;//定义上诉委托类型的事件
    Form2中这一句出错
    [找不到类型或命名空间名称“mydelegate”(是否缺少 using 指令或程序集引用?)]