首页 > 代码库 > WinForm 多窗体

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();        }

 

WinForm 多窗体