我有一个主窗体form1, 通过showdialog的方式打开form2,然后在form2中再通过showdialog的方式分别打开form3,form4,form5三个窗体,并且在打开form3,或者form4,或者form5的同时隐藏它们的上一层窗体form2. 然后将form3(或form4,或form5)的参数传递到form1中,请问应该如何实现呢?

解决方案 »

  1.   

    简单处理:把窗体的成员变量设定为public
    这样其它窗体可以直接访问到;
    规范处理:
    使用事件绑定,数据发生变化后,触发事件,
    完成数据传递
      

  2.   

    showdialog不行,show可以。通过委托传值控制 http://www.cnblogs.com/guwei4037/p/8084725.html
      

  3.   

    在设计的模式中,对象之间不要“(直接或者间接)循环依赖”,而要搞懂”依赖倒置“的道理。这是面向对象设计的五大基本原则中的一条。所谓”隐藏上一层、传递给上一层“都是纯粹外行的需求描述,还没有到设计那一层。在设计中form4不依赖form3,form5不依赖form4,那么”关闭窗体、传递结果“根本不是子窗体的指责。当父窗体以 showdialog 方式打开子窗体之前,他就应该隐藏(hide方法)自己的窗体。当showdialog阻塞方法调用完毕,父窗体form2就应该抛出相应的事件来通知自己的宿主窗体有什么属性改变——可以读取——了。总之,不理解依赖倒置原则的人通常就是因为不懂事件驱动设计概念。
      

  4.   

    在设计中form4不依赖form3,form5不依赖form4    --> 在设计中form3、form4、form5 均不依赖form2子窗体是一个服务,是写了一次就可以用在各种宿主系统调用中的。不是跟”上层窗体“纠结的东西。设计对象之间的交互,假设 A 依赖于 B,那么 B 就不要依赖于 A,这样才能达到起码地“解耦”的目的。
      

  5.   

    另外,通知属性改变的机制在 .net 中叫做 INotifyPropertyChanged,可以用这个考一下应聘的人,来判断他是否学过 .net 模式。
      

  6.   

    窗体传递对象:
    User user = new User();
    user.ID = ..... .;
    user.UserName =..... ;
    FrmMain frm = new FrmMain(user);//这里是传对象,也可以传递参数
    this.Hide();//隐藏
    frm.Show();//显示窗体//需要显示的窗体
    private User user = new User();
    //构造函数
    public FrmMain(User user)
            {
                InitializeComponent();
                frm = this;
                this.user = user;//传递用户对象
            }传递参数
    在窗体设置参数ID
     public int ID;//获取参数的窗体FrmMain frm = new FrmMain();
    frm.ID = ...... ;
    frm.Show();
      

  7.   

    看代码就明白了,Form4,Form5跟Form3差不多定义:
    public class Form1
        {
            public string parameter { get; set; }        private void btn_clicked()
            {
                Form2 f2 = new Form2();
                f2.form1 = this;
                f2.ShowDialog();
            }
        }    public class Form2
        {
            public Form1 form1 { get; set; }        private void btn_clicked()
            {
                Form3 f3 = new Form3();
                f3.form1 = form1;
                f3.ShowDialog();
            }
        }    public class Form3
        {
            public Form1 form1 { get; set; }        public void invokeForm1()
            {
                form1.parameter = "xxx";
            }
        }
      

  8.   

    https://bbs.csdn.net/topics/360140208/
      

  9.   

    public不知道可行吗
      

  10.   

    最好是用属性赋值的方式传值,winform直接有个现成的Tag属性,例如form1.tag=form2.tag,当然这种用法在窗体内部使用属性时要转换,如果不想转换就自行定义属性,如果属性是多个窗体都有的,那么就定义一个公共窗体,其他窗体集成它
      

  11.   

    FORM_A
    public void button1_Click(object sender,EventArgs e)
    {
           form3 f3=new form3();
          f3.Owner=this;
          f2.Show();
    }FORMBprivate void button1_Click(object sender,EventArgs e)
    {
            form1 f1=(form1)this.Owner;
          ((TextBox)f1.Controls["this.textBox1"]).Text="ReturnString";
           this.Hide();
    }试试这个。
      

  12.   

    给你提供三种方法:
    1、写一个类库,存放你所有子窗口可能会更改的参数。并将类变量置于顶层窗口,类变量在顶层,相对于子窗体就是全局变量类型。子窗体中用构造函数来接收更改就行。
    例如:
    主窗体下:
    Para para = new Para();
    子窗体构造函数里面增加:        
    Para para;
    public InitialSet(Para _para)
      {
            InitializeComponent();
             para = _para;
     }
    之后便能对这些参数随意更改,例如para.X=2;这时候你顶层窗口的para.X也等于2了。第二种方法是委托的方式,也可说是回调函数的方式,在子窗体要回传参数时,调用回调函数就行第三种就是子窗体的参数写public,例如public int X{get;set;}.这样在子窗体showdialog结束,获取X的值就行这三种为了方便对参数进行管理,个人感觉写个类库舒服点
      

  13.   

    form2中再通过showdialog打开后隐藏,from1就可以直接读取form2的属性,其它的窗口相同