您的位置:首页 > 职场人生

黑马程序员—关于winform中如何快速布局管理大量控件

2013-02-28 13:21 232 查看
 ------- Windows Phone 7手机开发.Net培训、期待与您交流! -------
 
             例子:有个员工信息录入窗体,要求输入的员工信息多达36项。加上label的话,控件数量至少有72个。将问题简单化,我们假设控件仅有2种,label和textbox。一个label后需紧跟对应的textbox为一组,如:
 


这些控件分为8行5列排列,但第三行和第7行只有4组,第八行3组,其余行皆有5组。如何快速整齐的排列控件?且必须能方便管理,能快速由控件名分辨并找到控件所在。最终的效果类似这样:



。注意:窗体可以拉伸,控件的location必须能随之变动(控件大小不变),有利界面美观。因此用拖拉控件形成的死界面是没意义的。
 
经过一个晚上的琢磨,我终于得出了个可以实现的,代码较少的方法。现在和大家分享下!

1.为了便于管理,又能够有利于快速排列。我在控件的命名上下了一番功夫。Label我缩写为lb,Textbox缩写为tb。然后借鉴了二维数组,命名效果如下图:



以此类推。如此一来,控件名前面部分告诉我们控件类型,最后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,住址长度不一定,但相对较长,先预留一些空间,该列的列宽就会比较宽,具体可以由参数控制。下面就附上布局代码。



这里是部分代码,其他的大家以此类推。该代码中我将每个Label的布局都写出来,代码看起来还是蛮多的,主要是让大家都能更好的理解我的布局思路。若用遍历控件+sunstring()方法,代码会极大的减少。所谓代码没有最少,只有更少,关键在于思考没思考。

3.接下来是textbox的布局。



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);
以上就是我的大致思路,如上所说,代码量还可大量减少,不过以上代码好在清楚明了,虽然代码多点,但都很好写,只需改些参数。

表达不好,没能把问题说清楚,大家见谅,希望以上内容能对大家有所帮助。

最后附上我的效果图~

运行前:



运行后,原始大小:



运行后:拉伸:



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

 
 
-------
Windows Phone 7手机开发、.Net培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐