none
c#打开(或调用)新的窗体怎么做? RRS feed

  • 问题

  • 我是初学者。我想在form1窗体上点击linklabel或者button控件来调用form2,同时form1消失,仅显示form2。
    form1和form2在同一命名空间内,都已经设置好。请问如何操作啊?
    2010年3月3日 3:52

答案

  • 不用客气啊!
    是这样的,我用注释给你解释一下:
     private void button1_Click(object sender, EventArgs e)
            {
                Form2 form2 = new Form2();  //初始化一个你的Form2这个窗体类的一个新实例,要使用窗体类的实例,不要使用窗体类本身
               
                form2.Show();  //显示窗体
                this.Hide();       //this代表主窗体,这里是隐藏主窗体
            }
    希望对你有帮助!
    周雪峰
    2010年3月3日 11:58
    版主

全部回复

  • 你好!

    窗体消失: Form.Hide 或 form.Visible = false; 
    窗体显示: Form.Show() 或 Form.ShowDialog()

    只要知道了这些,这个工作就容易完成了。

    下面我写了个简单示例,实现内容为。点击按钮隐藏 Form1 同时显示 Form2 ,关闭 Form2 同时 Form1 恢复显示。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication8
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    
        class Form1 : Form
        {
            public Form1()
            {
                Button btnShow = new Button();
    
                btnShow.Text = "显示 Form2 同时自己消失\r\n关闭 form2 自己显示";
                btnShow.Size = new System.Drawing.Size(300, 50);
                btnShow.Click += new EventHandler(btnShow_Click);
    
                this.Controls.Add(btnShow);
    
                this.Text = "Form1";
            }
    
            void btnShow_Click(object sender, EventArgs e)
            {
                using (Form2 f2 = new Form2())
                {
                    this.Visible = false;
                    f2.ShowDialog();
                    this.Visible = true;
                }
            }
        }
    
        class Form2 : Form
        {
            public Form2()
            {
                this.Text = "Form2";
            }
        }
    }
    


    知识改变命运,奋斗成就人生!
    2010年3月3日 4:14
    版主
  • 显示form2后,把form1隐藏掉,直接关闭是不行的,fm1 = new from1(); fm1.Hide();
    咯咯
    2010年3月3日 4:14
  • 你好!
         你可以参考XXY版主的实例,如果还有其他问题,我们可以继续交流啊!
    周雪峰
    2010年3月3日 7:04
    版主
  • 谢谢几位的帮助,我试试,真心感谢。
    2010年3月3日 7:50
  • 我的form1和form2都已经做好了,用楼上的代码只能打开新的form窗体,不能从我的form1打开form2,我该怎么做啊?请高手再指教一下。

    我在form1中放置一个button控件,并写:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void panel1_Paint(object sender, PaintEventArgs e)
            {
               
            }

            private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
            {

            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form2.Show();
                Form1.Hide();
            }
        }
    }会报错:
    错误 1 非静态的字段、方法或属性“System.Windows.Forms.Control.Show()”要求对象引用 D:\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 31 13 WindowsFormsApplication1

    必须写:

     private void button1_Click(object sender, EventArgs e)
            {
                Form Form2 = new Form();
                Form Form1 = new Form();
                Form2.Show();
                Form1.Hide();
            }
    才行,但是打开的不是我做好的form2,是系统自己打开了一个窗体。
    请问怎么办?

    2010年3月3日 11:29
  • 你好!
         你这样修改一下试试:
     private void button1_Click(object sender, EventArgs e)
            {
                Form2 form2 = new Form2();
               
                form2.Show();
                this.Hide();
            }
    如果还有问题,我们可以继续交流啊!
    周雪峰
    2010年3月3日 11:44
    版主
  • 搞定了,谢谢呀!
    请给我讲讲是怎么回事呀?
    form2 是Form2实例,Form2是我的一个窗体的名称。

    还有一个问题,我这样成功后,在form1设置了一个button2用来退出:
    private void button2_Click(object sender, EventArgs e)
            {
                this.Close();
               
            }
    这样调试时,只能退出(关闭)form1,但是visual stdio集成开发环境还是在调试状态,我必须手动停止才行。
    请问有什么方法吗?
    2010年3月3日 11:48
  • 不用客气啊!
    是这样的,我用注释给你解释一下:
     private void button1_Click(object sender, EventArgs e)
            {
                Form2 form2 = new Form2();  //初始化一个你的Form2这个窗体类的一个新实例,要使用窗体类的实例,不要使用窗体类本身
               
                form2.Show();  //显示窗体
                this.Hide();       //this代表主窗体,这里是隐藏主窗体
            }
    希望对你有帮助!
    周雪峰
    2010年3月3日 11:58
    版主
  • 等于就是说,Form1和Form2两个窗体是类不是实例。使用时必须实例话?请再给我讲讲退出(关闭)整个窗体(或者叫程序)的方法。

    我在Form2上也设置了一个button来关闭Form2,并显示Form1.
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }

            private void pictureBox1_Click(object sender, EventArgs e)
            {

            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form1 form1 = new Form1();

                form1.Show();
                this.Close();
            }

         
        }
    }

    Form1里代码为:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void panel1_Paint(object sender, PaintEventArgs e)
            {
               
            }

            private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
            {

            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 form2 = new Form2();
                           form2.Show();
                this.Hide();
            }

            private void button2_Click(object sender, EventArgs e)
            {
                this.Close();
                
            }
        }
    }

    这样是不能完全退出调试,关闭这个程序。不点击打开Form2,时点击退出,就可以退出。点击打开Form2后,Form1隐藏,在Form2点击关闭Form2,打开Form1,即返回窗体Form1。这时点击退出,窗体Form1是不见了,但是不能退出调试。

    我想做一个窗体应用程序,现在要找个方法退出窗体这个程序。

    2010年3月3日 12:01
  • 关闭Form2后,你用什么方式重新打开Form1?
    周雪峰
    2010年3月3日 12:40
    版主
  • private void button1_Click(object sender, EventArgs e)
            {
                Form1 form1 = new Form1();

                form1.Show();
                this.Close();
            }

    现学现用,呵呵。

    原来的Form1并没有关闭,只是隐藏,所以我就试着用你教的方法来打开。
    2010年3月3日 12:41
  • 你好!
         你可以用这个方法退出应用程序:
         Application.Exit();
         用this.Close()方法的话,需要把代码写在主窗体中才有效!
    周雪峰
    2010年3月3日 13:26
    版主
  • 那就是说,我的主窗体是Form1,那么在Form2可以用this.Close()
    在Form1窗体用Application.Exit()吗?谢谢哈。
    新手学习,再学习......
    2010年3月3日 13:32
  • 哈哈,解决了,无限感谢中哦......
    新手学习,再学习......
    2010年3月3日 13:35
  • 不客气啊!
    周雪峰
    2010年3月3日 13:42
    版主