在VB6.0中,如果需要动态控制窗体控件,通常是在窗体上放一个控件,并将其 Index 设为 0,程序运行中,使用控件的Load和Unload事件就可以动态加载、卸载控件(第一个即Index属性为0的那个控件不能卸载),以达到灵活控制。但在 C#中,控件没有 Index,这个属性,也没有Load和Unload这两个事件动态加载和卸载控件,而是用另外一种方法。
C#中,需要动态加载、卸载控件时,不一定要先加入一个控件。而是在相应的代码中声明控件,然后对空间属性进行设置,最后使用 Form 中 Control 对象的 Add方法加载控件。下面笔者以自己开发的一个案例来说明这种方法。
需求:在一个WEB页面中,用户登录进入后,根据用户分配给该用户所属组别的权限显示相应的按钮,并且,当用户在页面中点击按钮时自动跳到相应的页面。按钮所实现的功能说明和跳转到的页面可以在系统中设置。
分析:由于该WEB页面面向所有用户,而用户的权限各不相同,因此,页面中的按钮不能固定,应能根据用户权限进行显示,而且按钮上的文本和链接应能体现出权限。可以在页面中布置权限数量的按钮,用户登录时显示权限数量的按钮并配置按钮文本和链接。但这样做太呆板,不够灵活,而用动态加载方法只需几行代码即可。
设计:
1、读取登录用户可操作的权限,以及权限的文本说明和执行该权限的页面链接,并将权限、说明、链接放在一个数组中
2、循环权限数组,执行下列操作
A、为每个权限分配一个按钮,并将权限名、说明、链接分别设置为按钮的 ID、Text、PostBackUrl 三个属性。
B、设置每个按钮的 Visible 属性为 True。
C、将按钮加载到WEB页面中。
D、为每个按钮后加上 <BR> 标记,以换行将按钮显示为一列。
程序实现:
本文对读取按钮权限到数组省略,只介绍为权限动态加载按钮。
//tStrMenuItem为用户权限列表数组,共三列
for (int i = 0; i <= tIntPowerCount; i++) //循环权限列表
{
Button menuBtn = new Button(); //声明按钮变量
menuBtn.Width = 282; //设置按钮宽度
menuBtn.ID = tStrMenuItem[i, 0].ToString(); //新增按钮名称
menuBtn.Text = " " + tStrMenuItem[i, 1].ToString();
menuBtn.PostBackUrl = tStrMenuItem[i, 2].ToString();
menuBtn.Visible = true;
form1.Controls.Add(menuBtn); //将按钮添加到WEB页面
form1.Controls.Add(new LiteralControl("<br>")); //换行
}
这样,一个动态加载按钮就完成了,只要在系统中设置好用户组的权限、对应的操作页面,则用户组下的用户登录后就可以见到自己能操作的项目,从而达到灵活配置系统的效果。