教书愚人 毁人不倦
开发dotnet,走过人生的历程
posts - 159,comments - 959,trackbacks - 21
ASP.net2.0 为用户提供了treeviewmenu导航控件,使用十分方便,极大提高了用户开发项目的速度和效率。

尤其是treeviewmenu绑定web.sitemap之类的XML文件,形成层次数据非常便捷。

但我在项目开发过程中,很多地方是需要绑定关系数据库,毕竟关系数据库是最常用、操作最方便的存储形式。

对于treebview与关系数据库绑定可以动态绑定,也就是在page_load事件中首先添加第一级节点,然后在treeviewSelectedNodeChanged事件中进行判断添加下一级节点。因为使用AJAX技术后,把treeview控件放在UpdatePanel控件之内,用户的页面体验效果相当不错。

然而对于menu控件,这样就有麻烦了,因为我发现menuUpdatePanel控件中有问题:就是移动鼠标后原来的菜单项会遗留在屏幕上,直到单击新的菜单项(不知道是bug,还是我哪里出现问题)。也许有人觉得menu不要动态绑定,直接绑定XML做成静态的多好!但在做项目时需要不同的用户登陆后出现的菜单效果不同,而在web.sitemaproles角色控制又不是十分便利,所以使用关系数据库直接对menu菜单项的enabled进行赋值,控制更加灵活。

因为有bug,只能把menu控件放在UpdatePanel控件之外,对menu的绑定就要在page_load事件中一次性绑定,如果使用menu控件的MenuItemClick事件绑定,那么用户受不了这样的体验!

实现的效果如下:



具体实现代码如下:

 

default.aspx

 

 

default.aspx.vb

 

 数据库结构如下:


上面实现的关键是:
1、addnode递归过程,实现下级节点的添加;
2、DataView的RowFilter属性,mydv.RowFilter = "parentid=" & pid,筛选出某节点的下级节点,进行添加。

以上代码,没有优化,也不一定是最好的,希望抛砖引玉!

posted on 2007-06-09 16:00 教书愚人 毁人不倦 阅读(4516) 评论(9)  编辑 收藏 网摘 所属分类: dotnet技术与你分享

FeedBack:
2007-06-09 20:36 | rock niu
不错,偶最近做的项目中也是这样实现的.不过是treeview
  回复  引用    
2007-06-09 20:40 | z[未注册用户]
没看官方AJAX文档吧,updatepannel就是不能和menu一起 用的,还有几个类似的控件,还有几个能用但有限制。
web.sitemap中roles角色控制很容易,在web.config中加个参数,不要直接在web.sitemap中写role="???"

  回复  引用    
2007-06-09 22:00 | 助燃      
请问,为什么循环体内每挂载一个新的节点,就要对mydv.RowFilter 做一次操作?
  回复  引用  查看    
2007-06-09 23:14 | m[未注册用户]
@助燃
要把dataview恢复到调用过程之前的状态!
另,@Z
我知道角色控制在webconfig中可以,但是真的具体用户控制menu的enabled灵活性还是怎么灵活!

  回复  引用    
2007-06-09 23:26 | 助燃      
明白了,递归的时候把dataview的过滤条件打乱了。再问一下,power里面A,B,C每个分别是角色还是权限?
  回复  引用  查看    
2007-06-09 23:50 | m[未注册用户]
@助燃
power是自己定义的权限!
我个人感觉比asp.net的角色要灵活方便!
也许我对.asp.net2.0角色的掌握不到位吧!

  回复  引用    
2007-12-20 11:33 | 小猪2007[未注册用户]
在页面中加下一段,问题解决!

<script type="text/javascript">
<!-- 以下程式碼是為了防止 .Net Menu 與 UpdatePanel 共同使用時的『'0.cells' 为空或不是对象 的脚本错误』-->
var oldMenu_HideItems = Menu_HideItems;
if(oldMenu_HideItems)
{
Menu_HideItems = function(items){
if (!items || ((typeof(items.tagName) == "undefined") && (items instanceof Event))) { items = __rootMenuItem; }
if(items && items.rows && items.rows.length == 0){ items.insertRow(0); }
return oldMenu_HideItems(items);
}
}
<!-- 以上程式碼是為了防止 .Net Menu 與 UpdatePanel 共同使用時的『'0.cells' 为空或不是对象 的脚本错误』-->
</script>

  回复  引用    
2007-12-26 15:13 | nonfish[未注册用户]
请问7楼:加了这段代码之后,报“Menu_HideItems未定义”,应该怎么处理?
  回复  引用    
2008-04-07 10:54 | 11123444444444444444444444444444[未注册用户]
将那段代码加在你定义的menu控件后面就行了,最保险的方法是加在页面底部
  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 777581




相关文章:

相关链接: