第一次 用C#开发WinForm程序,问大家一个简单问题关于模式窗口:(遇到的问题就是和下面举例一样)
  我有一个主窗口Main ,点击 Main 上面的一个按钮 弹出模式窗口 A,然后在点击A中的一个按钮 弹出模式窗口B,同时关闭A,点击B中按钮弹出模式窗口C,同时关闭B。怎么实现?
  我这么写的 :
    Main中:A a=New A(); a.ShowDialog();  此时 Main 上面弹出 模式窗口A
    A中:    B b=New B(); b.ShowDialog(); this.Close(); 此时 Main 上面弹出 窗口A ,A上面有B,关闭B的时候,A,B都关了
   请问这种现在怎么解决?
   

解决方案 »

  1.   

    吧 B b=New B(); b.ShowDialog(); this.Close();这些写到main里面,然后在A中调用。
      

  2.   

    你应该搞清楚变量的生存周期。
    将所有窗口声明写到main中。
      

  3.   

    主窗体:
    private void button1_Click(object sender, EventArgs e)
            {
                Form2 fm = new Form2();
                fm.Show();
            }
    其他窗体:
     private void button1_Click(object sender, EventArgs e)
            {
                Form3 fm = new Form3();
                fm.Show();
                this.Close();
            }
      

  4.   

    我要的是弹出模式窗口
    不是要的Show(),
    show 当然可以,但是可以操作主界面了
    我要的希望是 A弹出B的时候,关闭A
      

  5.   

    主窗体: 
    private void button1_Click(object sender, EventArgs e) 
            { 
                Form2 fm = new Form2(); 
                fm.ShowDialog(); 
            } 
    其他窗体: 
    private void button1_Click(object sender, EventArgs e) 
            { 
                Form3 fm = new Form3(); 
                this.Hide();
                //opacity=0; //这个是隐藏本窗体,也可以试一试。
                fm.ShowDialog(); 
                this.Close(); //注意这个Close()是在关Form3时这个窗体也关掉,不是在开Form3时这个窗体关掉。
            }
      

  6.   

    先hide主窗体
    然后showDialog
    关闭子窗体的时候释放主窗体
      

  7.   

    主窗体: 
    private void button1_Click(object sender, EventArgs e) 
            { 
                Form2 fm = new Form2(); 
                fm.ShowDialog(); 
            } 
    其他窗体: 
    private void button1_Click(object sender, EventArgs e) 
            { 
                Form3 fm = new Form3(); 
                this.Hide(); 
                //opacity=0; //这个是隐藏本窗体,也可以试一试。 
                fm.ShowDialog(); 
                this.Close(); //注意这个Close()是在关Form3时这个窗体也关掉,不是在开Form3时这个窗体关掉。 
            }我的代码和你的一样,就是没写隐藏,我想找的解决方法是 不隐藏 能否实现关闭!
      

  8.   

    模式窗体本来就是阻塞式的,如下面的语句:
        b.ShowDialog(); 
       this.Close(); 一定要等b窗体关闭后,b.ShowDialog() 才会返回,然后继续执行this.Close();如果要实现你要的效果,在主窗体中写如下代码,然后在A中调用:
         a.Close();
        B b=New B();
        b.ShowDialog(); 
    我没有实际测试,你自己测一下,看行不行;
      

  9.   

    A中:    B b=New B(); b.ShowDialog(); this.Hide();
      

  10.   

    如果使用this.close()可能会将应用程序关闭叼,建议使用this.hide(),先将前窗体隐藏再执行一次函数application.DoEvent()然后使用show()函数显示下一窗体
      

  11.   

      Main中:A a=New A(); a.ShowDialog();  此时 Main 上面弹出 模式窗口A 
        A中:    B b=New B(); b.ShowDialog(); this.Close();问题是你这样写,本来就是b.ShowDialog()以后关闭a啊……去掉this.Close();写个假的吧,a closing 事件里 b.ShowDialog()呵呵Form.ShowDialog (IWin32Window) 在ShowDialog的时候 把(this) 也就是a 传过去在B的构造里面关闭a这样就达到楼主的要求了
      

  12.   

    你可以试试MDI的。比如设置一下窗体 的MdiParent属性。或者重写MdiChildren属性。当然也可以不设置为MDI的。用窗体的Owner和OwnedForms属性。
      

  13.   

    真不行的话。就把窗体隐藏了。在单击事件中增加this.Opacity = 0.00;来隐藏窗体
      

  14.   

    其实A,B两个窗口并不是从属关系,而是因果关系,所以AB两个窗口的开关操作都应该在Mail里进行.当A窗口某按钮按下时,应该是给A窗口的Restut赋某一值,然后结束窗体,退回到main,而Main则检查A的结果值来决定是不是打开B窗口.
      

  15.   

     Form a = new FormA()
     Form b = new FormB() DialogRestult rel =  a.ShowDialog() if(rel = DialogResutl.OK)
         b.ShowDialog
      

  16.   

    iTidy是说将语句写在Main中吗?
    可是Main中写的是以下内容:
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    就把你说的内容写到里面吗?
    请赐教!!
      

  17.   

        Main中:A a=New A(); a.ShowDialog();  此时 Main 上面弹出 模式窗口A
        A中:    B b=New B(); b.ShowDialog(); this.Close();改為:
         Main中:A a=New A(); a.ShowDialog();
         A中: B b=New B(); this.Dispose(); b.ShowDialog(); 
    用Dispose,而且寫在ShowDialog之前
      

  18.   


    main到a:
    双击a上的按钮: 
       b fr =new b();
       fr.show();
       this.hiden();
    a到b:
    双击b上的按钮:
       c fr=new c();
        fr.show();
        this.hiden();
    这样做的时候最后关闭b页面的时候进程中a不会关闭·!
    所以在关闭程序的时候应该写一个FromCloseing 事件
     代码简单一句话:Application.Exit();
     这里没VS 单词可能不对 但应该是这样的!用智能杳寻一定找的到的!
     
      
        
      

  19.   

    同志们:
    LZ的意思是在打开B的时候A自动关闭,打开C的时候B自动关闭
    你们的程序是实现这个的吗?
      

  20.   

    hao145424的代码行是行 就是需要开着的窗口自动最小化了,需要关的窗口确实关着了
    我想这个问题可能是和你用的是show()有关
      

  21.   

    //主窗体
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frm = new Form2();
                frm.ShowDialog();
            }
    //第2个窗体
            private void button1_Click(object sender, EventArgs e)
            {
                this.Hide();
                Form1 frm1 = new Form1();
                frm1.Show();
                Form3 frm = new Form3();
                frm.ShowDialog();
                frm1.Hide();
            }
    这样就可以实现你说的要求
      

  22.   

    首先要有个思想就是无论如何,ShowDialog的本体都是mainForm因为要关闭A,所以就不能在A上ShowDialog这个是不符合逻辑的mainForm 里面用一个属性来记录要show的Form实例然后在关闭前一个Dialog的时候填充这个属性。在mainForm的激活事件里用这个实例ShowDialog。就可以了
    //mainFrom
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public Form showForm = null; //简化用公共变量        private void btnShowA_Click(object sender, EventArgs e)
            {
                A a = new A(this);
                a.ShowDialog();        }        private void Form1_Activated(object sender, EventArgs e)
            {
                if (showForm != null)
                {
                    try
                    {
                        showForm.ShowDialog();
                    }
                    catch
                    {
                        showForm = null;
                    }
                }
            }
        }//A Form
    public partial class A : Form
        {
            private Form1 mainForm;//注意是Form1
            public A(Form1 x)
            {
                InitializeComponent();
                mainForm = x;
            }        private void btnShowB_Click(object sender, EventArgs e)//关闭后show B
            {
                mainForm.showForm = new B();
                this.Dispose();
            }        private void button1_Click(object sender, EventArgs e)//关闭后无反应
            {
                mainForm.showForm = null;
                this.Close();
            }
        }//B Form
    public partial class B : Form
        {
            public B()
            {
                InitializeComponent();
            }
        }B以后的自己扩展一下
      

  23.   

    我指的是MainForm,也就是你说的第一个Form.也就是你下面里的Form1的一个对象,主窗体.
      

  24.   

    我现在手头没有VS环境,我就直接说吧,代码可能有些不准,但思路差不多MainForm://构造两个窗体对象
    Form a = new FormA()
    Form b = new FormB()private void button1_Click(object sender, EventArgs e)//这是主窗口的按钮事件
    {
       DialogResult rel =  a.ShowDialog()
       
       if (rel == DialogResult.OK)//假设A窗体点OK按钮时关闭A,打开B
           b.ShowDialog()
    }FormA:private void buttonOK_Click(object sender, EventArgs e)
    {
        //如果FormA的OK按钮被点击,设置本窗体DialogResult,并关窗本窗体
        this.DialogResult = DialogResult.OK
        this.Close()
    }
        差不多是这样子吧.上面大家的思路都在于用FormA来打来B,但其实不用,只要让FormA返回一个结果,由MainForm来打来FormB就行了.
      

  25.   

    发现你还要关闭FormC,原理是一样的.你的愿意是当一个窗体完成一定的操作,你要根据这个窗体的操作结果,来判断是否打开新的窗体,对吧.(当然你这个条件可以永远为真,比如你就是想关掉一个就开另一个) 所以你的思路就是,等一个窗体关闭后,主窗体得到它的结果(一般可以用DialogResult,当然你要用其它方法也行,比如窗体属性),并根据结果来打开新的窗口.如果你是有限条件下关闭一个打开一个,我觉得这样做可以;如果是有点像"下一步"这样的操作,用"Wirzard"控件可能更好一些.
      

  26.   

    既然在mainForm实例b了那还费什么劲直接
    a.ShowDialog();
    b.ShowDialog();不就得了,呵呵
      

  27.   

     kzc_ljl 的方法确实不错,不过和一下算法实现的结果是一样的
    主窗体: 
    private void button1_Click(object sender, EventArgs e) 
            { 
                Form2 fm = new Form2(); 
                fm.ShowDialog(); 
            } 
    其他窗体: 
    private void button1_Click(object sender, EventArgs e) 
            { 
                Form3 fm = new Form3(); 
                opacity=0; //这个是隐藏本窗体,也可以试一试。 
                  fm.ShowDialog(); 
                this.Close(); //注意这个Close()是在关Form3时这个窗体也关掉,不是在开Form3时这个窗体关掉。 
            }只是LZ说不想用opacity=0;这个方法。
    不过我发现的他们共同的一个缺点,就是在打开新窗口(老窗口立即关闭)时都要闪一下,而且很明显的。(唯一缺点)
      

  28.   

    闪一下,是因为关闭 A 的时候要激活 mainForm 才能再打开B
    我也不喜欢opacity=0;因为我觉得不用的东西就应该释放掉,不要占资源……
      

  29.   

    嗯,这样的用户体验也不好.同一功能最好能在一个窗体里完成,不行就再开子窗口,但别这样关一个再开一个,很不舒服感觉,呵.直接用Wizard多好,呵.
      

  30.   


    一般人都是想的 在a中打开b、关闭或者隐藏a 在b中打开c 关闭或者隐藏b...............
    只有iTidy  的思路新颖!!顶~~~~~~~~~~~~~~~~``方法完全正确啊
      

  31.   

    MainForm: 中有一个Button按钮Form1 f1 = new Form1(); //Form1 中有一个Button按钮 DialogResult属性设置为OK 
    Form2 f2 = new Form2(); //Form2 中有一个Button按钮  DialogResult属性设置为OK 
    Form3 f3 = new Form3(); private void button1_Click(object sender, EventArgs e)//这是主窗口的按钮事件 

      if (f1.ShowDialog() == DialogResult.OK) 
         {
          if(f2.ShowDialog() == DialogResult.OK)
            {
                f3.ShowDialog();
             }
         }
    } private void button1_Click(object sender, EventArgs e)//这是Form1
    {
        this.Close();
    }private void button1_Click(object sender, EventArgs e)//这是Form2
    {
        this.Close();
    }
      

  32.   

    我认为只要MainForm存在,其前方的窗口突然关闭切换,闪是必然的.不过你可以在关闭窗口的代码中添加一些操作来缓解.但我的建议是,尽量不要出现这样要求的窗体切换,就算客户有要求,只要能换成Wizard的,还是用Wizard好,呵.