给Asp.Net Forums的后台管理菜单做一个树形外衣
今天上班的时候需要用到TreeView,突发奇想能不能给Asp.Net Forum的后台管理做一个树形的管理菜单呢?呵呵~~~,建议大家边听Metallica边写代码,比较有灵感哦..
第一步:建表如下
|
MenuNodeID |
ParentNodeID |
NodeText |
LinkFile |
HotDegree |
Expanded |
|
Int4autoseed |
int |
nVarChar |
nVarChar |
Int |
bit |
其他字段不用说了,其中HotDegree是一个记录该菜单的点击次数的字段,TM Messager不是新增加了一个热度吗?我们也加一个。Expanded字段设定该节点是否默认展开。然后增加几个存储过程。另外需要在表中增加一条默认的数据,不增加应该也可以的,在查询分析器中运行以下SQL代码,在项目的存储过程中作为存储过程加入后在Vs中运行也是一样的:
/*================================================2
--Install_Data_ManageMenu3
=================================================*/4
SET IDENTITY_INSERT ManageMenu ON5
print '创建Menu默认数据'6
IF EXISTS (SELECT * FROM ManageMenu WHERE NodeParentID = 0)7
DELETE ManageMenu WHERE NodeParentID = 08

9
INSERT INTO10
ManageMenu11
(12
MenuNodeID,NodeParentID,NodeText,LinkPath,HotDegree,ExPanded13
)14
VALUES15
(16
0,-1,'top','#',0,017
)18
SET IDENTITY_INSERT ManageMenu OFF19

20
--如果是在Vs中运行的化把GO去掉21
GO
第二步:在Components/Components下增加Menu.cs如下:
public class Menu2
{3
private int nodeID;4

5

6
public int NodeID7
{8
get{return nodeID;}9
set{nodeID = value;}10
}11
}
在Components下增加Menus.cs如下:
public class Menus
{
public static ArrayList GetParentNode()
{
AnalyseDataProvider dp = AnalyseDataProvider.Instance();
return dp.GetParentNodes();
}
public static ArrayList GetChildNodes(int childnodeid)
{
AnalyseDataProvider dp = AnalyseDataProvider.Instance();
return dp.GetChildNodes(childnodeid);
}
public static void UpdateHotDegree(Menu menu)
{
menu.HotDegree = menu.HotDegree + 1;
AnalyseDataProvider dp = AnalyseDataProvider.Instance();
UpdateMenu(menu);
}
}
第三步:在ForumsDataProvider.cs中增加抽象方法
public static Components.Menu PopulateMenu(IDataReader reader)2
{3
Components.Menu menu = new Menu();4
menu.NodeID = (int)reader["MenuNodeID"];5
menu.ParentID = (int)reader["NodeParentID"];6
menu.Text = (string)reader["NodeText"];7
menu.LinkPath = (string)reader["LinkPath"];8
menu.HotDegree = (int)reader["HotDegree"];9
menu.ExPanded = (bool)reader["ExPanded"];10
return menu;11
}12
public abstract ArrayList GetParentNodes();13
public abstract ArrayList GetChildNodes(int childnodeid);14
public abstract int CreateUpdateDeleteMenu(Menu menu,DataProviderAction action);
第四步:在SqlDataProvider项目中的SqlDataProvider.cs中重写以上方法,这里再不赘述了。
第五步:在Web项目中增加ViewManageMenu.ascx控件,并引用IE WebControls控件
第六步:在Controls项目中增加ManageMenu.cs,大致分以下几部分:
1.装载皮肤样式,写Asp.Net Forums换肤的文章很多,大家可以参考,如果没有注意到那么可以到这里去看看
http://ode.cnblogs.com/archive/2005/11/06/270262.html
2.创建单个节点,写的比较乱,将就看吧,呵呵
/// <summary>2
/// 创建节点3
/// </summary>4
/// <param name="text">该节点的Text</param>5
/// <param name="linkpath">该节点的链接路径(相对)</param>6
/// <param name="expanded">是否默认展开</param>7
/// <returns>节点</returns>8
private TreeViewNode CreateNode(string text,string linkpath,bool expanded)9
{10
//定义一个新的节点11
TreeViewNode node = new TreeViewNode();12
//设置该节点的属性13
node.Text = text;14
node.NavigateUrl = (linkpath == "#")?"#":Globals.ApplicationPath + "/" +linkpath;15
node.Expanded = expanded;16
//返回该节点17
return node;18
}3.递归树
/// <summary>
/// 递归树
/// </summary>
/// <param name="menu">Menu</param>
/// <param name="node">当前节点</param>
private void PopulateSubTree(Components.Menu menu, TreeViewNode node)
{
foreach(Components.Menu childmenu in Menus.GetChildNodes(menu.NodeID))
{
TreeViewNode childnode = CreateNode(childmenu.Text,childmenu.LinkPath,childmenu.ExPanded);
node.Nodes.Add(childnode);
PopulateSubTree(childmenu, childnode);
}
}4.绑定方法
ArrayList menus;
TreeViewNode treeviewnode;
menus = Menus.GetParentNode();
foreach(AnalyseOde.Components.Menu menu in menus)
{
treeviewnode = CreateNode(menu.Text,menu.LinkPath,menu.ExPanded);
treeview.Nodes.Add(treeviewnode);
PopulateSubTree(menu, treeviewnode);
if(menu.ParentID == -1)
{
break;
}
}5.OK了。
第七步:把ViewManageMenu.ascx放入AdminMasterPage.ascx,完工。
这样做没有什么好处,只是一个小尝试罢了。
因为这些东西不是写在Asp.Net Forum中的,所以代码就无法提供了,还望谅解。
作者:vincent zhang
出处:http://ode.cnblogs.com http://odevincent.blog.51cto.com
Email:wensheng.zhang#postgres.cn

本作品由vincent zh创作,采用知识共享署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议进行许可。


浙公网安备 33010602011771号