准备多个窗口 Form1,2,3
Form1为主窗口
给Form1放两个按钮,点击一个按钮打开Form2 另一个点击打开Form3
在按钮1的点击事件里面 实例化一个Form2 f2 = new Form2(); 然后 f2.show(); 就可以打开f2窗口。
为了用户体验考虑 , 新打开窗体最好是屏幕居中,在属性里面StartPosition设置CenterScreen。还有根据父级居中。
如果把Form1作为登录窗口,
那么登陆成功后弹出Form2窗口, 那样按找常理来说登陆成功就会关闭登录窗口,只留下内容窗口,可是作为主窗口的Form1如果关闭就会关闭所有窗口,所以只要把它隐藏就可以,这里使用this.Hide();来实现隐藏Form1. this代表窗体。
那么问题来了。把主窗体隐藏了怎么退出程序呢,就算把所有子窗体关闭,Form1还是开启,而且是隐藏的。
这里就需要事件来触发。
给Form1登陆成功后显示的Form2窗体设置一个Formclosing窗体关闭时触发的事件,发生在窗体关闭之前点击关闭之后。
在Form2关闭时 关闭Form1 但是这里想要在子窗口中控制父窗口需要 进行构造函数传值。
在Form2实例化的时候把Form1的值传进去,同时在Form中,实例化Form2的时候也要把要传的值放进去。此时想要在Form2关闭Form1,所以传入一个Form(所有窗体类型的基类)值。 this可以代表这个窗体。
在某些情况下,需要用到某个已经获取到的值,为了提高程序运行效率,不能再次查询这个值,这时候就需要传递值.
窗体间值的传递需要用到打开窗体,构造函数执行的过程就是打开窗体的过程(自己理解的)。
Form2 f2 = new Form2(要传递的值);
f2.Show();
这个时候值已经传递到Form2去了,这时候需要考虑如何在Form2中取出这个值
Form z = null;//根据值的类型实例化 public Form2(Form a) //方法这里也要写要传入的值,注意类型 { InitializeComponent(); z = a; //这个时候值就传递进来了,因为值定义在方法外面,所有在这个命名空间里面可以随意调用 }
现在就可以引用Form1的窗口属性或者公共属性的方法。
打开唯一窗体
打开唯一窗体就是在上面多窗体之间操作传值的基础上进行限制
大体思路就是
创建一个窗体集合
每一个打开的窗体对象都放入此集合中
每次再要打开窗体时都要去集合中判断此窗体是否已经被打开了
关闭子窗体时,要在父窗体的集合中删掉对应的子窗体对象,才可以重新打开新的子窗体
直接附上全部代码
private void button1_Click(object sender, EventArgs e) { Users u = new UsersData().SelectUser(textBox1.Text.Trim(), textBox2.Text); if (u != null) { Form2 f2 = new Form2(u, this); f2.Show(); this.Hide(); } else MessageBox.Show("用户名或密码错误!"); }
Form1 F1 = null; public Form2(Users us, Form1 f1) { InitializeComponent(); label1.Text = "欢迎你," + us.NickName + "!"; F1 = f1; } private void Form2_FormClosing(object sender, FormClosingEventArgs e) { F1.Close(); } List<Form> FormList = new List<Form>(); private void button1_Click(object sender, EventArgs e) { bool has = false; Form3 f3 = new Form3(this); foreach (Form f in FormList) { if (f is Form3) { has = true; f3 = f as Form3; } } if (has) { f3.WindowState = FormWindowState.Normal; f3.Focus(); } else { FormList.Add(f3); f3.Show(); } } private void button2_Click(object sender, EventArgs e) { bool has = false; Form4 f4 = new Form4(); foreach (Form f in FormList) { if (f is Form4) { has = true; f4 = f as Form4; } } if (has) { f4.WindowState = FormWindowState.Normal; } else { FormList.Add(f4); f4.Show(); } } public void DeleteForm(Form f) { FormList.Remove(f); }
Form2 F2 = null; public Form3(Form2 f2) { InitializeComponent(); F2 = f2; } private void Form3_FormClosing(object sender, FormClosingEventArgs e) { F2.DeleteForm(this);//调用Form2里的方法,清除集合里的窗口。 }