父窗口给子窗口传值我用的是重写构造函数
 private void button1_Click(object sender, EventArgs e)
        {
            FrmChild frm = new FrmChild(textBox1.Text);
            frm.ShowDialog();
        }
但是子窗口给父窗口传值怎么做呢。不可能还用FrmMain.ShowDialog()这就会有调出一个父窗口了,请问如何做呢

解决方案 »

  1.   

    用委托和事件
    在FrmChild添加:
    public delegate MyDelegate(string text);//可以有多个参数,其他数据类型
    public event MyDelegate MyEvent = null;//定义事件,即委托实例
    在想要传值的地方,比如FrmChild的某个button_Click事件中添加:
    if(MyEvent != null)
    {
      MyEvent(textBox2.Text);//这里可以传其他值
    }
    在FrmMain里添加:
    private void button1_Click(object sender, EventArgs e)
    {
    FrmChild frm = new FrmChild(textBox1.Text);
    frm.MyEvent += new MyDelegate(frm_MyEvent);
    frm.ShowDialog();
    }void frm_MyEvent(string text)
    {
      //这里处理从frm中传过来的值
    }简单的流程就是这样,自己再看看委托和事件,多看看例子,自己写写就明白了。
      

  2.   

    不用show  你可以在new子窗体的时候指定它的owner  也就是父窗体   然后把父窗体要操作的变量设置成public,即可访问。
    也可以按楼上说的使用委托。
      

  3.   

    在窗体1里
            private void button4_Click(object sender, EventArgs e)
            {
                Form2 form2 = new Form2(this.textBox1.Text,this.textBox2 ); //利用带参数的构造函数在父子窗体间的数据交互,此处参数为主窗体Form1中需要与子窗体Form2进行数据交互的控件名,参数类型和个数要与Form2中定义的一致
                form2.ShowDialog();  //此模式打开,只能对于当前窗体进行操作,而form2.Show()是以非模式打开,即可同时操作多个窗体
                form2.Dispose();
            }在窗体2里
            private TextBox textBox1_2;  //在Form2中增加了一个类数据成员textBox1_2用来保存构造函数传来的变量,不过他们并不属于Form2的Controls容器
            public Form2(string text,TextBox textbo) //添加相应的参数与Form1中构造函数中的参数一致
            {
                InitializeComponent();
                
                this.textBox1.Text = text;
                this.textBox2.Text = textbo.Text;//此句将Form1的textBox2中的数据传递到Form2的textBox2中,如同textBox1的参数传递,屏蔽此句则只由form2单向form1传递数据,不主动接受form1的数据
                this.textBox1_2 = textbo;  //用textBox1_2将实例中的数据传递给Form2参数
            }        private void button1_Click(object sender, EventArgs e)
            {
                this.textBox1_2.Text = this.textBox2.Text;
                this.Close();
            }
      

  4.   

    public partial class Form1 : Form 

    private void button1_Click(object sender, EventArgs e) 

    Form2 frm2 = new Form2(); 
    frm2.Show(this); 

    } public partial class Form2 : Form 

    private void button1_Click(object sender, EventArgs e) 

    Form1 frm1 = (Form1)this.Owner; 
    ((TextBox)frm1.Controls["textBox1"]).Text = this.textBox2.Text; 
    this.Close(); 


      

  5.   

    WinForm传值 总结
      

  6.   

    这里我觉得关键是要理解引用类型这样一个概念.在WinForm里面一个Form即一个窗体就是一个类,是引用类型,作为引用类型,赋值的时候传递的是一个引用,或者说是地址.假设存在一个Form1,里面有一个公共的int型属性Size,那么:
    Form1 f1 = new Form1();
    f1.Size = 10;
    Form2 f2 = f1;
    f2.Size = 20;
    上面四行代码结束,f1和f2的Size的值都会是20,因为f1和f2引用的都是一个Form1的对象,此时通过谁去改变里面的属性,那么另一个因为也引用这个对象所以值也会跟着改变.
    由以上的分析:
    ParForm(主窗体)、ChiForm(子窗体),
    现在要实现你要求的功能:
    首先需要在子窗体里面定义一个公共的主窗体的对象变量,即在ChiForm中:
    public ParForm Par = new ParForm();
    现在按正常的操作步骤:
    1.从主窗体显示子窗体,即在主窗体相应的代码区(可能是一个Click事件),
    ChiForm chi = new ChiForm();
    //给子窗体的父窗体对象赋值,即把自己的引用传递给子窗体的变量
    chi.Par = this;
    //给子窗体需要赋值的地方赋值,该步骤可以代替楼主构造函数里面实现的东西,此过程也即为父窗体给子窗体传值
    实现代码
    //显示子窗体
    chi.Show();
    2.在子窗体中改变父窗体的值,即给父窗体传值
    通过对chi.Par操作即可,因为chi.Par在1的步骤中已经将父窗体本身传过来了,所以只要对chi.Par进行操作,那么原来的父窗体相应的值也会相应的改变,此过程即实现了子窗体传递值给父窗体.以上几位子-父窗体传值,这里本人觉得最重要的莫过于对引用的理解.当然,其实通过公共的静态变量其实也可以做到这样的一个效果,即子窗体和父窗体都去对一些公共的静态变量进行操作,通过这些静态的公共变量进行传值.
      

  7.   

    通过事件,属性,或构造函数都可以实现。我在文章中提供了详细代码实现,楼主看了应该不会再有问题。
    http://blog.csdn.net/zhzuo/archive/2006/05/05/708941.aspx
    Windows窗体间的数据交互
    http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx