在开发软件的时候,常常会遇到这样的功能要求,根据不同的用户权限加载不同的功能界面。这样就需要我们在设计软件的时候动态添加添加功能。当然也可以把所有的功能都列出来,在根据权限来显示和隐藏功能,虽然这样也可以满足需求,但是需要很多额外的编码,性能上也可能大打折扣。
在WinForm编程中,MDI是一种很常用的结构。由于Windows界面的影响,很多时候我们设计软件的时候都喜欢上菜单下界面的模式。下面就结合代码来实现动态添加MenuStrip。
动态添加MenuStrip主要要解决三个方面的问题:
1、数据库设计
2、MenuStrip菜单的加载
3、菜单和窗口的结合
首先来解决数据库的设计问题。
一个窗口显示给用户看到的一般就是一个名称。另外菜单可能有级数,级数的解决一般有两种:根据编号来区分,设置父菜单。我喜欢根据编号来区分。比如:000 代表父菜单 000001代表一级菜单......如此类推。
数据库里面存储模块表的结构一般是 sBoardID sBoardName sFile sForm sMethod
sBoardID 菜单编号
sBoardName 菜单名称
sFile 菜单Form所在的文件(exe或者dll)
sForm 菜单对应的Form
sMethod 菜单对应的要执行的方法(有的菜单只有功能,没有界面,比如“退出系统”,“重新登录”)
其次来看看MenuStrip菜单的加载
因为菜单可能有多级,所以需要循环加递归来完成加载。会在下面的代码里面说明。
最后来看看菜单和窗口的结合
在数据库中,我们存储的都是字符串,而在程序中,我们却需要显示对应的窗口,这样就要求我们根据字符串来实例化对象。在.net里面我们可以用反射来实现。
上面说了,有些菜单只执行方法而没有界面,同样的数据库中存储的也只是字符串类型的方法名称,这样就要求我们根据字符串方法名执行对应的方法,自然而然的我们就会想到委托。
以上的问题都解决了,下面我们来看看代码:
menuMain是一个MenuStrip控件
private delegate void dlRunMethod();//定义一个委托,用于执行方法