• WinForm 多窗体


    多窗体:
    一、首先要想到的问题是:
    1、哪个是主窗体
    问题:主窗体隐藏了,关闭其它窗体后,没有将主窗体显示/关闭,那么程序就关不上了

    方法:用构造函数传值,将窗体传到另一个窗体中去

    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 多窗体
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //Form1为登录窗体,Form2为主窗体,
                //如何通过Form1的按钮打开Form2,然后让Form1隐藏Form2显示
                Form2 f2 = new Form2(this);
               
                f2.Show();
    
                this.Hide();//this当前窗体,指的是Form1,然后Hide隐藏
    
            }
        }
    }

     Form2:

    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 多窗体
    {
        public partial class Form2 : Form
        {
            Form1 F1 = null;
            public Form2(Form1 f1)
            {
                InitializeComponent();
                F1 = f1;
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
                
            }
    
            private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                F1.Close();
            }
        }
    }

    2、窗体只能打开一个

    创建一个全局的泛型集合,为了放置全部打开的窗体
    1、在窗体打开之前,判断集合中是否有name一致的窗体,如果有就说明已经打开了,就不要再打开了

    问题:当窗体打开了,关闭后,就无法再次打开了
    办法:当窗体关闭时,清除Form1中集合中的此窗体对象记录

    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 多窗体
    {
        public partial class Form1 : Form
        {
            //创建一个全局的泛型集合
            List<Form> Flist = new List<Form>();
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                bool has = false;
                //Form1为登录窗体,Form2为主窗体,
                //如何通过Form1的按钮打开Form2,然后让Form1隐藏Form2显示
                Form2 f2 = new Form2(this);
                foreach (Form F in Flist)//先遍历集合,看里面是否有窗体和Form2窗体一样的内容
                {
                    if (F.Name == f2.Name)//若果有匹配内容
                    {
                        has = true;
                    }
                }
                if (has)//如果has是true
                {
    
                }
                else//如果has不是true
                {
                    Flist.Add(f2);
                    f2.Show();
                }
               
            }
    //问题:点击按钮打开一个窗体,关闭这个窗体后再点击就无法打开窗体了
            //办法:在Form2关闭时,把Form1当中的集合清空掉,在Form2中调用Form1中的方法
            public void DeleteForm(Form F)
            {
                Flist.Remove(F);//这里写的是要移除的
            }
        }
    }

    Form2:

    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 多窗体
    {
        public partial class Form2 : Form
        {
            Form1 F1 = null;
            public Form2(Form1 f1)
            {
                InitializeComponent();
                F1 = f1;
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
                
            }
    
            private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                //防止报错,判断一下
                if (F1 != null)
                {
                    F1.DeleteForm(this);
                }
            }
        }
    }

    问题:当窗体已经打开,再次点击打开按钮,不会将已打开的窗体重新显示并焦点进入
    办法:找到已打开对象,将WindowState属性设置为:
            找到已打开窗体的对象,使用Focus方法;

    Form1:

     private void button1_Click(object sender, EventArgs e)
            {
                bool has = false;
                //Form1为登录窗体,Form2为主窗体,
                //如何通过Form1的按钮打开Form2,然后让Form1隐藏Form2显示
                Form2 f2 = new Form2(this);
                foreach (Form F in Flist)//先遍历集合,看里面是否有窗体和Form2窗体一样的内容
                {
                    if (F.Name == f2.Name)//若果有匹配内容
                    {
                        has = true;
                        F.WindowState = FormWindowState.Normal;//先将WindowState属性设置为:Normal
                        F.Focus();//焦点进入
                    }
                }
                if (has)//如果has是true
                {
                    f2.Close();//把新创建的窗体释放掉
    
                }
                else//如果has不是true
                {
                    Flist.Add(f2);
                    f2.Show();
                }
               
            }

    3、窗体之间的传值和控制

    传值:构造函数传值

    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 窗体之间的传值和控制
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //判断用户名输入是否正确
                if (textBox1.Text == "zhangsan" && textBox2.Text == "1234")
                {
                    Form2 f2 = new Form2(this,textBox1.Text);
                    f2.Show();
                    this.Hide();
                }
            }
        }
    }

    Form2:

    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 窗体之间的传值和控制
    {
        public partial class Form2 : Form
        {
            Form1 F1 = null;//全局变量
            //构造函数重载一下,调用这个构造函数时,传过来一个Form1对象,和string Uname
            public Form2(Form1 f1,string Uname)
            {
                InitializeComponent();
    
                F1 = f1;
                label1.Text = "欢迎回来!" + Uname;
    
            }
        }
    }

    控制:第一步,找到窗体对象,

            第二步,将窗体对象的控件值更改
    注意:要将窗体中的对象访问权限修改

    Form1.Designer:

            private System.Windows.Forms.TextBox textBox1;
            private System.Windows.Forms.TextBox textBox2;
            private System.Windows.Forms.Label label1;
            private System.Windows.Forms.Label label2;
            public System.Windows.Forms.Button button1;

    Form2:

     private void button1_Click(object sender, EventArgs e)
            {
                //把textBox1的值取出来  textBox1.Text;
                if (F1 != null)
                {
                    //把Form1.Designer里面button1的private改成public,这样F1就能点出来button1了
                    F1.button1.Text = textBox1.Text;
                }
            }

    4、提示框类型的窗体

    ShowDialog();

    作用:当前窗体可进行操作,其他窗体也不能操作

            关闭当前窗体,才能操作其他窗体

    Form1:

     private void button2_Click(object sender, EventArgs e)
            {
                Form2 f2=new Form2 (this,"111");
                f2.ShowDialog();
            }
  • 相关阅读:
    python中几种数据类型常用的方法
    WSGI
    从开学到初赛的一些个人总结
    CSP-S2020 浙江 游记
    CF1416D Graph and Queries
    单次期望 O(1) 的RMQ
    P3177 [HAOI2015]树上染色
    CF835F Roads in the Kingdom/P1399 [NOI2013]快餐店
    P4381 [IOI2008]Island
    P5655 基础数论函数练习题
  • 原文地址:https://www.cnblogs.com/juyangchao12/p/5897793.html
Copyright © 2020-2023  润新知