黑马程序员—关于winform中如何快速布局管理大量控件
2013-02-28 13:21
232 查看
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
例子:有个员工信息录入窗体,要求输入的员工信息多达36项。加上label的话,控件数量至少有72个。将问题简单化,我们假设控件仅有2种,label和textbox。一个label后需紧跟对应的textbox为一组,如:
![](http://bbs.itheima.com/data/attachment/forum/201302/27/203416ibastbbjbusm1ibl.png)
这些控件分为8行5列排列,但第三行和第7行只有4组,第八行3组,其余行皆有5组。如何快速整齐的排列控件?且必须能方便管理,能快速由控件名分辨并找到控件所在。最终的效果类似这样:
![](http://img.my.csdn.net/uploads/201302/28/1362037002_2274.jpg)
。注意:窗体可以拉伸,控件的location必须能随之变动(控件大小不变),有利界面美观。因此用拖拉控件形成的死界面是没意义的。
经过一个晚上的琢磨,我终于得出了个可以实现的,代码较少的方法。现在和大家分享下!
1.为了便于管理,又能够有利于快速排列。我在控件的命名上下了一番功夫。Label我缩写为lb,Textbox缩写为tb。然后借鉴了二维数组,命名效果如下图:
![](http://img.my.csdn.net/uploads/201302/28/1362036628_8058.jpg)
以此类推。如此一来,控件名前面部分告诉我们控件类型,最后2位告诉我们控件位置,管理起来轻松多了。
2.开始布局。由于每个Label后都紧跟着个Textbox,因此,只要先将Label布局好了,后面就轻松了。为了适应可拉伸的窗体,而又不改变控件的大小,我选择了用百分比解决。即,控件Location属性的x占窗体width多少百分比,y占height多少百分比。当然,为了避免窗体拉伸过大,而控件大小没改变,导致整个界面太过稀疏,不美观,大家可以定个值,当窗体大于该值时,控件的布局换个方式。就如网页在宽频显示器上最大化时,左右2边空了2块。这个是后话,这里就不研究了。下面是我定义的布局Label方法,该方法写在窗体Paint事件里,以便实时调整。(注:我事先将控件放入了几个groupbox内,为了美观,因此下面也对groupbox进行布局。)
//方法1:布局GroupBox,并设置其大小
private void GBset(object sender, int n, int m)
{
if (sender is GroupBox)
{
(sender as GroupBox).Size = new Size(this.Width - 100, this.Height / n);
(sender as GroupBox).Location = new Point((this.Width - (sender as GroupBox).Width) / 2, this.toolStrip1.Height + 10 + this.Height / n * m);
}
}
//方法2:布局label和picturebox
private void LBset(object sender, int n, int m)
{
if (sender is Label)
{
(sender as Label).Location = new Point(groupBox1.Width / 25 - 20 + 50 * n, groupBox1.Height / 8 * m);
}
if (sender is PictureBox)
{
(sender as PictureBox).Location = new Point(groupBox1.Width - pictureBox1.Width - groupBox1.Width / 60, (groupBox1.Height -pictureBox1.Height) / 2);
}
}
参数n和m用于方便调整所占百分比,及考虑到textbox输入信息的长度将影响布局,比如某列中有用于输入住址的textbox,住址长度不一定,但相对较长,先预留一些空间,该列的列宽就会比较宽,具体可以由参数控制。下面就附上布局代码。
![](http://img.my.csdn.net/uploads/201302/28/1362036616_5601.jpg)
这里是部分代码,其他的大家以此类推。该代码中我将每个Label的布局都写出来,代码看起来还是蛮多的,主要是让大家都能更好的理解我的布局思路。若用遍历控件+sunstring()方法,代码会极大的减少。所谓代码没有最少,只有更少,关键在于思考没思考。
3.接下来是textbox的布局。
![](http://img.my.csdn.net/uploads/201302/28/1362036667_5459.jpg)
methords.Inputset(tb00, lb00); methords.Inputset(tb10, lb10); methords.Inputset(cb20, lb20); methords.Inputset(tb30, lb30); methords.Inputset(tb40, lb40);
methords.Inputset(tb01, lb01); methords.Inputset(tb11, lb11); methords.Inputset(tb21, lb21); methords.Inputset(tb31, lb31); methords.Inputset(cb41, lb41);
methords.Inputset(tb02, lb02); methords.Inputset(tb12, lb12); methords.Inputset(ckb22, lb22); methords.Inputset(tb32, lb32);
以上就是我的大致思路,如上所说,代码量还可大量减少,不过以上代码好在清楚明了,虽然代码多点,但都很好写,只需改些参数。
表达不好,没能把问题说清楚,大家见谅,希望以上内容能对大家有所帮助。
最后附上我的效果图~
运行前:
![](http://img.my.csdn.net/uploads/201302/28/1362036849_8524.jpg)
运行后,原始大小:
![](http://img.my.csdn.net/uploads/201302/28/1362036868_9464.jpg)
运行后:拉伸:
![](http://img.my.csdn.net/uploads/201302/28/1362036893_2619.jpg)
暂时的效果,还不够完美,继续研究去~
-------
Windows Phone 7手机开发、.Net培训、期待与您交流! -------
例子:有个员工信息录入窗体,要求输入的员工信息多达36项。加上label的话,控件数量至少有72个。将问题简单化,我们假设控件仅有2种,label和textbox。一个label后需紧跟对应的textbox为一组,如:
![](http://bbs.itheima.com/data/attachment/forum/201302/27/203416ibastbbjbusm1ibl.png)
这些控件分为8行5列排列,但第三行和第7行只有4组,第八行3组,其余行皆有5组。如何快速整齐的排列控件?且必须能方便管理,能快速由控件名分辨并找到控件所在。最终的效果类似这样:
![](http://img.my.csdn.net/uploads/201302/28/1362037002_2274.jpg)
。注意:窗体可以拉伸,控件的location必须能随之变动(控件大小不变),有利界面美观。因此用拖拉控件形成的死界面是没意义的。
经过一个晚上的琢磨,我终于得出了个可以实现的,代码较少的方法。现在和大家分享下!
1.为了便于管理,又能够有利于快速排列。我在控件的命名上下了一番功夫。Label我缩写为lb,Textbox缩写为tb。然后借鉴了二维数组,命名效果如下图:
![](http://img.my.csdn.net/uploads/201302/28/1362036628_8058.jpg)
以此类推。如此一来,控件名前面部分告诉我们控件类型,最后2位告诉我们控件位置,管理起来轻松多了。
2.开始布局。由于每个Label后都紧跟着个Textbox,因此,只要先将Label布局好了,后面就轻松了。为了适应可拉伸的窗体,而又不改变控件的大小,我选择了用百分比解决。即,控件Location属性的x占窗体width多少百分比,y占height多少百分比。当然,为了避免窗体拉伸过大,而控件大小没改变,导致整个界面太过稀疏,不美观,大家可以定个值,当窗体大于该值时,控件的布局换个方式。就如网页在宽频显示器上最大化时,左右2边空了2块。这个是后话,这里就不研究了。下面是我定义的布局Label方法,该方法写在窗体Paint事件里,以便实时调整。(注:我事先将控件放入了几个groupbox内,为了美观,因此下面也对groupbox进行布局。)
//方法1:布局GroupBox,并设置其大小
private void GBset(object sender, int n, int m)
{
if (sender is GroupBox)
{
(sender as GroupBox).Size = new Size(this.Width - 100, this.Height / n);
(sender as GroupBox).Location = new Point((this.Width - (sender as GroupBox).Width) / 2, this.toolStrip1.Height + 10 + this.Height / n * m);
}
}
//方法2:布局label和picturebox
private void LBset(object sender, int n, int m)
{
if (sender is Label)
{
(sender as Label).Location = new Point(groupBox1.Width / 25 - 20 + 50 * n, groupBox1.Height / 8 * m);
}
if (sender is PictureBox)
{
(sender as PictureBox).Location = new Point(groupBox1.Width - pictureBox1.Width - groupBox1.Width / 60, (groupBox1.Height -pictureBox1.Height) / 2);
}
}
参数n和m用于方便调整所占百分比,及考虑到textbox输入信息的长度将影响布局,比如某列中有用于输入住址的textbox,住址长度不一定,但相对较长,先预留一些空间,该列的列宽就会比较宽,具体可以由参数控制。下面就附上布局代码。
![](http://img.my.csdn.net/uploads/201302/28/1362036616_5601.jpg)
这里是部分代码,其他的大家以此类推。该代码中我将每个Label的布局都写出来,代码看起来还是蛮多的,主要是让大家都能更好的理解我的布局思路。若用遍历控件+sunstring()方法,代码会极大的减少。所谓代码没有最少,只有更少,关键在于思考没思考。
3.接下来是textbox的布局。
![](http://img.my.csdn.net/uploads/201302/28/1362036667_5459.jpg)
methords.Inputset(tb00, lb00); methords.Inputset(tb10, lb10); methords.Inputset(cb20, lb20); methords.Inputset(tb30, lb30); methords.Inputset(tb40, lb40);
methords.Inputset(tb01, lb01); methords.Inputset(tb11, lb11); methords.Inputset(tb21, lb21); methords.Inputset(tb31, lb31); methords.Inputset(cb41, lb41);
methords.Inputset(tb02, lb02); methords.Inputset(tb12, lb12); methords.Inputset(ckb22, lb22); methords.Inputset(tb32, lb32);
以上就是我的大致思路,如上所说,代码量还可大量减少,不过以上代码好在清楚明了,虽然代码多点,但都很好写,只需改些参数。
表达不好,没能把问题说清楚,大家见谅,希望以上内容能对大家有所帮助。
最后附上我的效果图~
运行前:
![](http://img.my.csdn.net/uploads/201302/28/1362036849_8524.jpg)
运行后,原始大小:
![](http://img.my.csdn.net/uploads/201302/28/1362036868_9464.jpg)
运行后:拉伸:
![](http://img.my.csdn.net/uploads/201302/28/1362036893_2619.jpg)
暂时的效果,还不够完美,继续研究去~
-------
Windows Phone 7手机开发、.Net培训、期待与您交流! -------
相关文章推荐
- 黑马程序员—关于如何快速给众多控件附加内容
- 关于解决DockManager如何停靠在其他布局控件问题
- 关于winform 中 使用Dock 之后 如何调整控件位置的讨论
- 关于如何设定winForm中某个控件的显示位置
- winform学习之-----关于按键操作的一些小知识(如何获取焦点所在的当前控件)20160623
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何快速调整大量控件的位置
- 黑马程序员—关于winform中如何令textbox随输入的文本内容的长度而实时改变宽度
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何快速调整大量控件的位置
- C# winform 布局,最大化之后再还原,内部其他控件大小怎么随着变化。
- VS2015使用小技巧 winform编辑窗体(拖拽控件)的的时候,工具箱挡住了窗体,如何解决
- SNF开发平台WinForm之三-开发-单表选择控件创建-SNF快速开发平台3.3-Spring.Net.Framework
- 使用AutoLayout布局适配时,如何提前获得AutoLayout完成适配后的子控件的真实frame
- Expression Blend实例中文教程(3) - 布局控件快速入门Grid
- 黑马程序员--关于控件平移缩放旋转的总结
- WinForm_关于用户控件和自定义控件
- [原创]ExtAspNet新春贺岁版 - 文件上传控件、复选框列表控件、完善布局管理、表格的行扩展列、完整的100多个中文示例、30多处BUG修正与功能增强、《ExtAspNet秘密花园》系列文章
- winform程序设计中,label,TextBox,ComboBox等几个控件几乎是用得最多的,在设计中经常会遇到一些小问题,如:comboBox控件绑定了数据源之后,如何设置默认值?
- winform程序中如何跨线程修改控件的值
- .NET WinForm下StatusStrip控件如何设置分隔线及部分子控件右对齐