黑马程序员技术交流社区

标题: 关于WINFORM中如何快速排列及管理大量控件的问题 [打印本页]

作者: 颜晓峰    时间: 2013-2-27 20:49
标题: 关于WINFORM中如何快速排列及管理大量控件的问题
本帖最后由 颜晓峰 于 2013-3-11 14:40 编辑

例子:有个员工信息录入窗体,要求输入的员工信息多达36项。加上label的话,控件数量至少有72个。将问题简单化,我们假设控件仅有2种,label和textbox。一个label后需紧跟对应的textbox为一组,如: 。这些控件分为8行5列排列,但第三行和第7行只有4组,第八行3组,其余行皆有5组。如何快速整齐的排列控件?且必须能方便管理,能快速由控件名分辨并找到控件所在。最终的效果类似这样: 。注意:窗体可以拉伸,控件的location必须能随之变动(控件大小不变),有利界面美观。因此用拖拉控件形成的死界面是没意义的。

QQ截图20130227204656.png (7.02 KB, 下载次数: 109)

QQ截图20130227204656.png

作者: xiaoxiang_04    时间: 2013-2-27 20:57
你先摆一行,然后复制,跟上面一行对齐,这样行不。。。。
控件多数据绑定一般建个类用属性来传值,详情请看杨老师的三层架构。

作者: 岳珅    时间: 2013-2-27 21:02
本帖最后由 岳珅 于 2013-2-27 21:06 编辑

- -这个。。。。我只能说用WPF的话会超轻松。。。
直接用grid制作表格- -
比如我下面计算器的截图,用grid制作的,里面的控件也有三十多个,九行五列,margin自己调。。。窗体大小可变

winform我没学- -没法帮你,WPF的话,真的很好用哦-0-

作者: 颜晓峰    时间: 2013-2-27 21:03
xiaoxiang_04 发表于 2013-2-27 20:57
你先摆一行,然后复制,跟上面一行对齐,这样行不。。。。
控件多数据绑定一般建个类用属性来传值,详情请 ...

要用代码实现,因为窗体的大小不是固定的,可以拉伸,因此控件的location应该是可以变动的,用拖拉的方法得到的是死的界面
作者: xiaoxiang_04    时间: 2013-2-27 22:08
也不死,你把控件的anchor属性调整一下就行了,但是确实不如手写
作者: 安玉波    时间: 2013-2-28 09:47
你可以添加一个自定义控件,这个控件的布局就按label和textbox 布局,这样你只要往界面上添加36个你自定义的这个控件就可以了。这样也不影响你的布局


作者: 颜晓峰    时间: 2013-2-28 09:55
xiaoxiang_04 发表于 2013-2-27 22:08
也不死,你把控件的anchor属性调整一下就行了,但是确实不如手写

用anchor属性来控制的话相当于一个个的写,效率非常低,窗体拉伸的情况下问题会很多,而且也没解决便于管理的问题
作者: 颜晓峰    时间: 2013-2-28 09:56
安玉波 发表于 2013-2-28 09:47
你可以添加一个自定义控件,这个控件的布局就按label和textbox布局,这样你只要往界面上添加36个你自定义的 ...

36个自定义控件添加后,又回到了排列大量控件的问题,快速管理亦是。
作者: xiaoxiang_04    时间: 2013-2-28 10:00
颜晓峰 发表于 2013-2-28 09:55
用anchor属性来控制的话相当于一个个的写,效率非常低,窗体拉伸的情况下问题会很多,而且也没解决便于管 ...

不用一个个改啊,都布局都好以后,全选上就行了,最多分四个大块选择,anchor是共同的属性
作者: 颜晓峰    时间: 2013-2-28 10:24
xiaoxiang_04 发表于 2013-2-28 10:00
不用一个个改啊,都布局都好以后,全选上就行了,最多分四个大块选择,anchor是共同的属性 ...

当控件非常多的时候,要先布局好是一件很麻烦的事情(比如要布局一个1920*1080的界面,可是你的布局空间只有800*600。。。等等)关键是用拖拉控件布局后所形成的界面其实是半死的,Anchor属性只能控制具体长度,比如距离左边界多少像素,下边界多少像素,如此一来,当窗体拉伸时,整个界面就会让人不忍直视了,具体情况可以自己试试,可视化布局的问题很多,代码实现才是王道,我正在试验中,有了点眉目,希望能早日解决。。。。
作者: 颜晓峰    时间: 2013-2-28 11:43
本帖最后由 颜晓峰 于 2013-2-28 11:49 编辑

经过一个晚上的琢磨,我终于得出了个可以实现的,代码较少的方法。现在和大家分享下!
1.为了便于管理,又能够有利于快速排列。我在控件的命名上下了一番功夫。Label我缩写为lb,Textbox缩写为tb。然后借鉴了二维数组,命名效果如下图: 以此类推。如此一来,控件名前面部分告诉我们控件类型,最后2位告诉我们控件位置,管理起来轻松多了。
2.开始布局。由于每个Label后都紧跟着个Textbox,因此,只要先将Label布局好了,后面就轻松了。为了适应可拉伸的窗体,而又不改变控件的大小,我选择了用百分比解决。即,控件Location属性的x占窗体width多少百分比,y占height多少百分比。当然,为了避免窗体拉伸过大,而控件大小没改变,导致整个界面太过稀疏,不美观,大家可以定个值,当窗体大于该值时,控件的布局换个方式。就如网页在宽频显示器上最大化时,左右2边空了2块。这个是后话,这里就不研究了。下面是我定义的布局Label方法,该方法写在窗体Paint事件里,以便实时调整。(注:我事先将控件放入了几个groupbox内,为了美观,因此下面也对groupbox进行布局。)

参数n和m用于方便调整所占百分比,及考虑到textbox输入信息的长度将影响布局,比如某列中有用于输入住址的textbox,住址长度不一定,但相对较长,先预留一些空间,该列的列宽就会比较宽,具体可以由参数控制。下面就附上布局代码。
这里是部分代码,其他的大家以此类推。该代码中我将每个Label的布局都写出来,代码看起来还是蛮多的,主要是让大家都能更好的理解我的布局思路。若用遍历控件+sunstring()方法,代码会极大的减少。所谓代码没有最少,只有更少,关键在于思考没思考。
3.接下来是textbox的布局。



以上就是我的大致思路,如上所说,代码量还可大量减少,不过以上代码好在清楚明了,虽然代码多点,但都很好写,只需改些参数。
表达不好,没能把问题说清楚,大家见谅,希望以上内容能对大家有所帮助。
最后附上我的效果图~
运行前:

运行后,原始大小:

运行后:拉伸:

暂时的效果,还不够完美,继续研究去~





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2