(一)布局
1.属性:
Dock 根据需要,占满区域
dock属性的顺序是按照拖入窗体的顺序来排的
Anchor 可以确定与窗体上下左右的位置,来控制空间
lcaction 定位
2.容器(布局的时候一般都是先布局容器,在容器里面进行),容器里面可以放容器
Panel 就相当于一个透明的div,是最基础的,其余的容器都是继承Panel,
FlowLayoutPanel 流式布局的Panel
GroupBox 也是一个Panel,多出了一个外部边框
TabControl 选项卡
SqlitContainer 分割容器
Orientation 属性,水平垂直分割
TableLayoutPanel 一个表格,每一个单元格只能放一个控件(里面可以放容器,然后再放多个控件)
(二)构造函数传值
1. 打开新窗体
先实例化对象,对象.show();
2.窗体之间传值(构造函数传值)
例:
form1是登入窗体,form2是登入跳转窗体,实现:从1登入打开2,1隐藏,关闭2窗体,1窗体也随着关闭
form2中的代码:
Form1 F1 = null;//定义form1 public Form2(Form1 f1)//利用构造函数传入form1对象 { InitializeComponent(); F1 = f1; } //form2关闭的时候,关闭form1 private void Form2_FormClosing(object sender, FormClosingEventArgs e) { F1.Close(); }
3.打开唯一窗体
例:2个窗体,实现,在1打开2,且每次只能打开唯一,最小化之后在此点击按钮,焦点自动进入,且还原初始状态
窗体1中的代码:
using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } List<Form> list = new List<Form>();//定义一个集合,存在打开的窗体 private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(this);//将form1窗体传入form2 bool has = false;//定义一个变量, foreach(Form ff in list) { if (ff is Form2) //判断 { has = true; f2 = ff as Form2;//将ff转换成form2 } } if (has)//集合中有f2 { f2.WindowState = FormWindowState.Normal;//每次打开的时候窗体默认位置 f2.Focus();//每次打开焦点进入 } else { //集合中放入f2,并且打开 list.Add(f2); f2.Show(); } } //如果集合中有了窗体之后,在移除向对应的,如果不移除,关闭之后,集合中以后,就打不开新窗体了 public void delete(Form f) { list.Remove(f); } } }
窗体2中的代码:
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 WindowsFormsApplication2 { public partial class Form2 : Form { Form1 F1 = null;//定义变量接收f1 public Form2(Form1 f1) { InitializeComponent(); F1 = f1; } //关闭的时候移除对应的窗体,下次继续打开,否则关闭之后打不开 private void Form2_FormClosing(object sender, FormClosingEventArgs e) { F1.delete(this); } } }