private void button1_Click(object sender, EventArgs e)
{
Size BOX_SIZE = new Size(90, 60);
Point START_TOP_LEFT = new Point(100, 100);
int COUNT = 5;
var floorList = new List<string>() { "1", "2", "3", "4", "5~6" };
var floorDic = new Dictionary<string, List<string>>();
floorDic.Add("5~6", new List<string>() { "501a", "502a", "503", "504", "505", "506", "507" });
floorDic.Add("4", new List<string>() { "401", "402", "403", "404", "405"});
floorDic.Add("3", new List<string>() { "301", "302", "303", "304", "305", "306", "307", "308", "309", "310", "311", "312", "313", "304", "315", "316" });
floorDic.Add("2", new List<string>() { "201", "202", "203", "204", "205"});
floorDic.Add("1", new List<string>() { "门房", "商1", "商2", "商3", "商4", "商5", "商6", "商7", "商8", "商9", "商10", "商11", "商12", "商13", "商14", "商15", "商16", "商17" });
this.panel1.Controls.Clear();
int x = 0;//格子x,y 的左上坐标
int y = 0;
int width = 0;//层格子的长、宽
int height = 0;
int lines_per_floor = 0;//每层实际占几行(占几个格子)
int real_floor = 0;//实际占几层
int idx_floor = 0;//层顺序
int delta_height = 0;//层格子累加的减少高度
int idx_room_x = 0;//指示当前X方向是第几个房间,用于扣减偏移量,每层清0、折行清0
int idx_room_y = 0;//累积的房间格子的高度偏移量,不清0
for (int i = floorList.Count - 1; i >= 0; i--)
{
x = START_TOP_LEFT.X;
real_floor += lines_per_floor;
y = START_TOP_LEFT.Y + real_floor * BOX_SIZE.Height - delta_height;
y -= idx_floor;//每累加一层,所在y值-1,才能和上一个重合
width = BOX_SIZE.Width;
lines_per_floor = (int)Math.Ceiling((double)floorDic[floorList[i]].Count / COUNT);
delta_height += lines_per_floor - 1;
height = BOX_SIZE.Height * lines_per_floor - (lines_per_floor - 1);
//添加层格子
add_label_ctrl(x, y, new Size(width, height), floorList[i]);
idx_room_x = 0;
for (int j = 0; j < floorDic[floorList[i]].Count; j++)
{
//折行
if (j % COUNT == 0)
{
idx_room_x = 0;
idx_room_y++;
}
x = START_TOP_LEFT.X + BOX_SIZE.Width + BOX_SIZE.Width * (j % COUNT);//X坐标=开始偏移 + 层格式宽 + 当前几个房间格子宽,因为折行,所以取余
x -= (idx_room_x + 1);//扣减重叠的格子线像素
y = START_TOP_LEFT.Y + BOX_SIZE.Height * real_floor + BOX_SIZE.Height * (j / COUNT);//Y坐标=开始偏移 + 实际占用层数* 格子高 + 当前第几行 * 房间格子高。因为折行,所以取商
y -= idx_room_y - 1;//摔跟头重叠的格子线像素
//添加房间格子
add_label_ctrl(x, y, BOX_SIZE, floorDic[floorList[i]][j]);
idx_room_x++;
}
idx_floor++;
}
}
void add_label_ctrl(int x, int y, Size size, string caption)
{
this.SuspendLayout();
var lbl = new Label();
lbl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
lbl.Location = new System.Drawing.Point(x, y);
lbl.Name = Guid.NewGuid().ToString();
lbl.Size = size;
lbl.Text = caption;
lbl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.panel1.Controls.Add(lbl);
this.ResumeLayout();
}