首先我来说一下父子级的窗口:
一个Form1是父窗口,一个Form2是子窗口。
我是这样在Form1处理Form2的关系的
Form1里Form2 frm = new Form2();
frm.Owner = this;
frm.Show();Form2里Form1 frm = null;
frm = (Form1)this.Owner;
这样做确实完成了某一组功能,但是当另外一组功能也需要Form2一样的功能的时间,我发现我只能再写一份像Form2一样的窗口,原因是在Form2里的定义语句里指定了父窗口,所以我不知道怎么样来让别的窗口来调用Form2。说的有点拗口,简单地说就像是一个业务单据的“输入”和“编辑”窗口,都需要一个“商品选择”子窗口,假设我先做好的子窗口是“输入”的,那么子窗口中的定义语句就指定为“输入”父窗口,当我想让“编辑”窗口也使用这个子窗口时就不行了。另外一个问题是关于同一级别的窗口引用,比如说有一个业务流程有“采购单”和“收货单”,当我在输入“收货单”的时候想从“采购单”引入数据,这时如果能在“采购单”.Show()的过程中把“收货单”传递过去的那操作会方便很多,但因为“采购单”并不是“收货单”的子窗口,所以我不知道如何处理它们的关系,现在我只是使用一个全局变量来传递“采购单”的ID,然后“收货单”接收到值之后再进行处理。不知道各位牛人、高手、前辈有什么好的办法或思路没有?

解决方案 »

  1.   

    为什么不行?没看懂
    Form1 frm = null;
    frm = (Form1)this.Owner;
    干啊要这样写?
    子窗口中根本就不用定义父窗口的。mdi父窗口点击按钮打开子窗口:
                if (!(frm == null))
                {
                    frm.Close();
                    frm.Dispose();
                }
                frm = new form1();
                frm.WindowState = FormWindowState.Maximized;
                frm.MdiParent = this;
                frm.Show(); 非mdi窗口可以直接这样写:
                  form1 frm = new form1 ();
                frm.proCardID = int.Parse(sId);//传入参数
                frm.ShowDialog(); //也可以用show 一回事
                frm.Dispose();
    传参数么,子form里做个public变量,new之后show之前传入就可以,哪里要弄得这么麻烦??!!
      

  2.   

    感谢Jenemy8023!这样写的原因是在子窗口中要操作父窗口的控件。
    上面的代码我是根据下面改写的。//先将父窗口中的控件设为public 
    //然后实例化子窗口时,将当前的父窗口传进去 
      Form2 frm = new Form2(this); 
      Form2.show(); 
    //Form2为新弹出来的子窗口,this为当前打开的主窗体 
    //子窗口中的构造方法改下 
      private Form1 main=null; 
      public Form2(Form1 form) 
      { 
          this.main = form; 
      }
    你所写的“传入参数”这一步我没看懂,不知道什么意思?
      

  3.   

    Form1:IMyInterface
    {
    public void do();
    }IMyInterface frm =this.Owner as IMyInterface ; 
    frm.do();
      

  4.   

    //先将父窗口中的控件设为public 
    //然后实例化子窗口时,将当前的父窗口传进去 
      Form2 frm = new Form2(this); 
      Form2.show(); 
    //Form2为新弹出来的子窗口,this为当前打开的主窗体 
    //子窗口中的构造方法改下 
      private Form1 main=null; 
      public Form2(Form1 form) 
      { 
          this.main = form; 
      }就这样,
    你调用时,
    写个
    Form2 f2=new Form2(this);
    这样就实现了你说的“传入参数”
      

  5.   


    呵,这个方法跟我所讲的方法并没有本质区别。
    假若我有一个Form3要和Form1一样使用Form2作为子窗口,那要怎么做?
    像上面的这种办法是不行的,因为Form2中指定了main是Form1类的实例。
      

  6.   

    父用子  直接调用实例变量子用父 用 this.Parent
      

  7.   

    明白了!!!原来是这样,因为重新创建一个窗口对象,一切是空的。因为程序现在正在运行,新创建那个等于新窗口了,与当前的父窗口无关。所以要在显示子窗时给出父窗口是那个,然后在子窗口中this.Owner.Function();明白了!!!
      

  8.   


    明白了!!!原来是这样,因为重新创建一个窗口对象,一切是空的。因为程序现在正在运行,新创建那个等于新窗口了,与当前的父窗口无关。所以要在显示子窗时给出父窗口是那个,然后在子窗口中this.Owner.Function();明白了!!! 
     
    因为如果新实例一个窗口对象,是新的窗口,与你想操作的窗口无关。所以只能 From f = null;f = this.Owner;这时的f才是你的父窗口。如果 Form f = null;
    f = new MyParent();这样的话是一个新实例。