C# TreeView菜单,MenuStrip菜单递归动态生成例子

上传人:te****st 文档编号:3198355 上传时间:2017-07-31 格式:DOC 页数:90 大小:213KB
返回 下载 相关 举报
C# TreeView菜单,MenuStrip菜单递归动态生成例子_第1页
第1页 / 共90页
C# TreeView菜单,MenuStrip菜单递归动态生成例子_第2页
第2页 / 共90页
C# TreeView菜单,MenuStrip菜单递归动态生成例子_第3页
第3页 / 共90页
C# TreeView菜单,MenuStrip菜单递归动态生成例子_第4页
第4页 / 共90页
C# TreeView菜单,MenuStrip菜单递归动态生成例子_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《C# TreeView菜单,MenuStrip菜单递归动态生成例子》由会员分享,可在线阅读,更多相关《C# TreeView菜单,MenuStrip菜单递归动态生成例子(90页珍藏版)》请在金锄头文库上搜索。

1、C# TreeView菜 单,MenuStrip 菜单递归动态 生成例子这是在权限系统中设计中常用到的两种菜单处理方式privateDataTableModuleTable;privatevoidFrmMain_Load(objectsender,EventArgse)tryInitMenu();catchMenuTree.Nodes.Clear();/初始化菜单/protectedvoidInitMenu()DataSetds=newDataSet();ds=bll.GetModuleTypeList();RGP.BLL.RGP_Modulesbll=newRGP.BLL.RGP_Modul

2、es();ModuleTable=ds.Tables0;/取得所有数据得到DataTable/加载TreeView菜单LoadNode(MenuTree.Nodes,0);/加载MenuStrip菜单ToolStripMenuItemtopMenu=newToolStripMenuItem();LoadSubMenu(reftopMenu,0);/递归创建TreeView菜单 (模块列表)/子菜单/子菜单上级IDprotectedvoidLoadNode(TreeNodeCollectionnode,stringMtID)DataViewdvList=newDataView(ModuleTab

3、le);dvList.RowFilter=ModuleTypeSuperiorID=+MtID;/过滤父节点TreeNodenodeTemp;foreach(DataRowViewdvindvList)nodeTemp=newTreeNode();nodeTemp.Tag=dvModuleTypeID.ToString()+,0;nodeTemp.Text=dvModuleTypeName.ToString();/节点名称node.Add(nodeTemp);/加入 节点/nodeTemp.SelectAction=TreeNodeSelectAction.Expand;/nodeTemp.E

4、xpanded=false;this.LoadNode(nodeTemp.Nodes,nodeTemp.Tag.ToString().Split(,)0);/递归/增加子模块分类RGP.BLL.RGP_Modulesbll=newRGP.BLL.RGP_Modules();DataSetModule=bll.GetModuleList(ModuleTypeID=+dvModuleTypeID.ToString();inti=0;foreach(DataRowchild_drinModule.Tables0.Rows)if(UserBox.GetUserTable().IsLimit=true|

5、(child_drModuleDisabled.ToString().ToLower()=true&UserHandle.ValidationModule(int.Parse(child_drModuleID.ToString(),RGP_Tag.Browse)&child_drIsMenu.ToString().ToLower()=true)TreeNodeChildNode=newTreeNode(child_drModuleName.ToString();ChildNode.Tag=child_drModuleID.ToString()+,1;ChildNode.Expand();nod

6、eTemp.Nodes.Add(ChildNode);i+;/删除不必要的模块分类节点。if(i=0)MenuTree.Nodes.Remove(nodeTemp);/递归创建MenuStrip菜单(模块列表)/父菜单项/父菜单的IDprivatevoidLoadSubMenu(refToolStripMenuItemtopMenu,intMtID)DataViewdvList=newDataView(ModuleTable);/过滤出当前父菜单下在所有子菜单数据(仅为下一层的)dvList.RowFilter=ModuleTypeSuperiorID=+MtID.ToString();Too

7、lStripMenuItemsubMenu;foreach(DataRowViewdvindvList)/创建子菜单项subMenu=newToolStripMenuItem();subMenu.Text=dvModuleTypeName.ToString();/判断是否为顶级菜单if(MtID=0)this.SysMainMenu.Items.Add(subMenu);elsetopMenu.DropDownItems.Add(subMenu);/递归调用LoadSubMenu(refsubMenu,Convert.ToInt32(dvModuleTypeID);/增加子模块分类RGP.BL

8、L.RGP_Modulesbll=newRGP.BLL.RGP_Modules();DataSetModule=bll.GetModuleList(ModuleTypeID=+dvModuleTypeID.ToString();inti=0;foreach(DataRowchild_drinModule.Tables0.Rows)if(UserBox.GetUserTable().IsLimit=true|(child_drModuleDisabled.ToString().ToLower()=true&UserHandle.ValidationModule(int.Parse(child_d

9、rModuleID.ToString(),RGP_Tag.Browse)&child_drIsMenu.ToString().ToLower()=true)ToolStripMenuItemChildMenu=newToolStripMenuItem(child_drModuleName.ToString();subMenu.DropDownItems.Add(ChildMenu);i+;/删除不必要的模块分类节点。if(i=0)this.SysMainMenu.Items.Remove(subMenu);先说一下主要原理:此处使用OnTreeNodePopulate事件并採用刷新的方式 获取

10、数据。第一次加载时获取根结点及其下两级结点,显示根结点和第一级结点,用第二级结点判断第一级结点是否含有结结点,并缓存第二级结点。下次逐 级扩展时填加已缓存的第二级结点,并取得第二级结点的所有子结点。说明:为什么要取第二级数据?因为取得第一级数据后,您不知道是否有一下级。所以再取得第一级数据后的下一级数据,并用nodeDictionary变量缓存所有第二级数据便于下次加载。下次点击扩展时,先从变量中找此级的数据,找到后读取此级的下一级数据。原理比较枯燥,用例子说明:1、在页面中放入TreeView。并设置OnTreeNodePopulate 事件和EnableClientScript属性。代码此

11、处说明一下EnableClientScript属性。如果EnableClientScript=True,当点击扩展结点时就调用客户端的角本,并不会回发,所取出的 值与当前点的值不一致,造成成 错误。所以此处要将EnableClientScript属性设为true 。2、后台代码( 代码中涉及取数据的方法没有给出,您可以根据情况自己编写取数据方法)代码/用于缓存数据privatestaticDictionarynodeDictionary=newDictionary();protectedvoidPage_Load(objectsender,EventArgse)if(!Page.IsPostB

12、ack)nodeDictionary.Clear();BindDepartmentTree(this.PwPid,system);/取得根目录的第一级数据publicvoidBindDepartmentTree(stringpwPid,stringdepartmentNo)nodeDictionary.Clear();UserPoweruserPower=newUserPower();/取得根目录PW_DepartmentpwSystem=userPower.GetParentDepartment(pwPid,departmentNo);tvDepartment.Nodes.Clear();i

13、f(pwSystem=null)return;TreeNodetnRootNode=newTreeNode();tnRootNode.Text=pwSystem.departmentName;tnRootNode.Value=pwSystem.departmentNo;/取得根目录的第一级数据IListilPwDepts=userPower.GetChildDepartment(PwPid,departmentNo);if(ilPwDepts=null|ilPwDepts.CountilChilldDepts=userPower.GetChildDepartment(PwPid,pdItem.

14、departmentNo);tnRootNode.ChildNodes.Add(tnNewNode);if(ilChilldDepts=null|ilChilldDepts.Count0)/从缓存中取得当前结点的第一级结点foreach(PW_DepartmentpdIteminnodeDictionarynodeID)TreeNodetnNewNode=newTreeNode(pdItem.departmentName,pdItem.departmentNo);/取得当前结点第一级结点下的子结点IListilPwDepts=userPower.GetChildDepartment(PwPid

15、,tnNewNode.Value);/如果没有子结点,不可以扩展if(ilPwDepts=null|ilPwDepts.Count中显示记录集的内容,开发人员则不得不为标记(tag)生成HTML 标记 (markup),然后循 环遍历记录集中的每一条记录,每次循环生成一个标记,以及许多标记和要显示的记录集字段的值。最后,在循环之后,开发人员需要生成结束标记。传统ASP所要求的这种方法有一个很大的缺点:它把HTML内容和ASPWeb 页面的源代码紧密集成在一起。因为没有分离代码和HTML内容,所以更改HTML的内容及其困难,尤其是对不懂编程技术的图形艺术家或Web设计者来说更是如此。而且,因 为检索数据库结果和生成它的内容都需要代码,所以代码和HTML内容的这种集成相对来说需要大量的代码。幸好,http:/提供了三个控件,使得在http:/Web页 面中显示数据 绝对比传统ASP 所需的迭代方式简单得多。 这三个控件是DataGrid、DataList和Repeater ,以后我将称之 为数据 Web控件。也许,如果您已 经开发过http:/www

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 化学工业

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号