有A、B两个窗口,A窗口中有一个按钮和一个方法,A中的方法需要使用B窗口返回的数据
1、单击A窗口中的按钮打开B
2、B关闭时执行A窗口中的事件需要用委托来完成,不能使用showdialog(),B窗口打开是非模式的(Show()),最好是能应用到多个窗口,比如C窗口也有按钮和事件,也需要打开C窗口执行同上的操作。

解决方案 »

  1.   

    补充下,后面那个事打开B窗口; 还有C窗口中的方法与A窗口不一样
      

  2.   

    假如A窗口的按钮事件中代码如下:
    frmB B = new frmB();
    B.mdiparent = this.mdiParent;
    B.Show();
    MessageBox.Show("B窗口已关闭!");这里怎么样能使B在show之后不执行后面那段代码,只有当B关闭时才执行,类似showdialog,但是不能用showdialog,因为用这个的话其他MDI子窗口在B显示时无法操作
      

  3.   

    代码可以这样写,注册窗体的 FormClosed 事件
    frmB B = new frmB();
    B.MdiParent = this.MdiParent;
    B.FormClosed += (sender, e) =>
    {
        frmB fb = (frmB)sender;
        // 访问 fb 的字段属性方法
        MessageBox.Show("B窗口已关闭!");
    };
    B.Show();
      

  4.   

    FormB b = new FormB();b.FormClosed += (s, e) =>
     {
       string data = b.Data; // 获取B的数据
       AMethod(data);     // 将B的数据用来调用方法
     }
      

  5.   

    http://topic.csdn.net/u/20110407/19/c1068d69-7331-4d02-bc0b-f5ba7a5f8dd8.html
      

  6.   


    这样的话在每次需要这样做得时候都需要注册在当前窗口注册FrmClosed事件,还能有其他方法实现么,
      

  7.   


    看了你的帖子,我想问下MDI下的子窗口,A打开B,如果其中有判断语句存在,判断之外的代码也要在B关闭后执行怎么写?
    if(i = 1)
    {
       frmB B = new frmB();
       B.mdiparent = this.mdiParent;
       B.Show();
    }
    else
    {
       frmC C = new frmC();
       C.mdiparent = this.mdiParent;
       C.Show();
    }
    MessageBox.Show("弹出窗口已关闭!");
    这里的MessageBox.Show("弹出窗口已关闭!") 需要在B或者C关闭后执行,难道要注册关闭事件里面写两次?
      

  8.   


    最好是能阻塞消息,就是show之后的代码要在窗口关闭后再执行
      

  9.   

    那你就这样吧
    frmB B = new frmB();
    B.MdiParent = this.MdiParent;
    B.Show();
    while (!f.IsDisposed)
    {
        Application.DoEvents();
    }
    MessageBox.Show("B窗口已关闭!");
      

  10.   

    Show 最合适就是注册事件,不论系统提供的还是自定义的
      

  11.   

         public static void ShowMyDialg(Form form)
            {
                using (System.Threading.ManualResetEvent mRest = new System.Threading.ManualResetEvent(false))
                {
                    form.FormClosed += delegate(object sender1, FormClosedEventArgs e1)
                    {
                        mRest.Set();
                    };
                    form.Show();
                    while (!mRest.WaitOne(20, false))
                    {
                        Application.DoEvents();
                    }
                    mRest.Close();
                }
            }帮看看这个咋样?