zoukankan      html  css  js  c++  java
  • C#中关闭第一个Form窗口,打开另一个新窗口方法

    【本文来源地址】:http://www.2cto.com/kf/201408/327282.html

      很多同学问怎么关闭一个FORM打开另一个新Form。这个问题最多的是在做登录验证时,使用第一个登录窗 登录成功后要关闭自己,然后打开新窗显示。没想到这个问题在.Net还成了问题,不过依然有很多方法解决。
    典型的
    Form1 f = new Form1();//创建窗体对象
    f.Show();//显示新窗体
    this.Close();//关闭当前窗体
    最后的关闭时把整个程序都关闭了

    1、隐藏法,原理就是把旧窗口隐藏掉,再打开新窗口

    //新建一个NewForm窗口(NewForm是自己定义的Form)
    NewForm fm=new NewForm()

    this.Hide();//隐藏现在这个窗口
    fm.Show();//新窗口显现

    这种方法旧的窗口依旧会占内存,因此如果用来做登陆窗口不太好,但是如果旧窗口是以后还需要恢复的主窗口,这个方法便很不错,因为以后可以关掉新窗口,再用 旧窗口.Show() 就可以恢复旧窗口了。
    所以这个方法适合在主窗口和子窗口间传递信息。

    Show()和ShowDialog()区别:

        show()仅仅是显示出来窗口界面而已```也就是和你执行的结果在同一窗口显示```所显示的窗口可以在后台运行;

        而showDialog()是一个对话框窗口界面```执行结果以新窗口界面出现```不允许进行后台运行。(就是你想编辑什么的时候,非得先关闭showDialog()窗口界面才可以进行其他操作。)

    2、再来便是为登录窗口设计的方法了。
    在Program.cs里这样定义:

    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    //新建Login窗口(Login是自己定义的Form)
    Login Log = new Login();

    //使用模式对话框方法显示Log
    Log.ShowDialog();

    //DialogResult就是用来判断是否返回父窗体的
    if (Log.DialogResult == DialogResult.OK)
    {
    //在线程中打开主窗体
    Application.Run(new Main());
    }
    }
    在登陆窗口中验证结束后要赋值Log.DialogResult = DialogResult.OK 。
    登录窗口完成任务后会被直接关掉,主窗口就打开了

    网上大多都是前面2种方法,另外还看到一个方法用线程的方法方法,未验证
    3、开新线程
    public static void ThreadProc()
    {
    Application.Run(new Form());
    }

    private void button1_Click(object sender, EventArgs e)
    {
    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
    t.Start();
    }

    C#编程时,经常会遇到处理两个或多个窗口的问题。以登录窗口为例,当登录窗口登录验证成功后,要进入主窗口,此时需要关闭登录窗口,这时候用this.close()是不可以的。因为Program.cs中

    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    }

    Main 函数是程序的入口点,当你在Form1中调用this.close ()的时候,Application.Run(new Form1())中Form1就会结束,也就是说整个程序结束了,此时主窗口也会相应的关闭,这不是我们想看到的。下面有两种方法来只关闭登录窗口,而主窗口仍然运行。

    4. 先隐藏登录窗口, 然后在主窗口关闭后将登录窗口关闭

    这种方法只是把登录窗口隐藏了,主程序还在运行。实现方法为:

    登录窗口代码:

    if (user.CheckIn())
    {
    MainForm myform = new MainForm(this); //调用带参的构造函数
    myform.Show();
    this.Hide();
    }
    else
    {
    MessageBox.Show("用户名或密码错误");
    }

    登录成功后,通过构造函数传入登录窗口的参数到主窗口,这样在主窗口里可以直接对登录窗口操作

    Form1 loginform = null;
    // 在主窗口添加带参的构造函数
    public MainForm(Form1 myform)
    {
    this.loginform = myform;
    InitializeComponent();
    }

    主窗口关闭后,关闭登录窗口

    private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
    {
    loginform.Close();
    }

    5. 将主窗口程序设为主运行程序,

    修改Program.cs

    Application.Run(new MainForm());

    这样系统启动时,运行的是主窗口程序。然后在主窗口加载时去调用登录窗口就可以了。

    private void MainForm_Load(object sender, EventArgs e)
    {
    Form1 form = new Form1();
    form.ShowDialog();
    this.Close();
    }

    登录窗口代码为:

    if (user.CheckIn())
    {
    this.Close();
    }
    else
    {
    MessageBox.Show("用户名或密码错误");
    }

  • 相关阅读:
    poj 3280 Cheapest Palindrome (dp)
    hdu 4359 Easy Tree DP? ( dp )
    hdu 2844 Coins (多重背包+ 二进制优化)
    三分法 讲解
    poj 1191 棋盘分割 (dp)
    hdu 4340 Capturing a country(树形 dp) (2012 MultiUniversity Training Contest 5 )
    子类和父类的构造函数
    CreateProcess执行一个控制台程序,隐藏DOS窗口
    单个字符比较
    MFC 程序入口和执行流程
  • 原文地址:https://www.cnblogs.com/pengyouqiang88/p/5034173.html
Copyright © 2011-2022 走看看