问题描述
在首页上会显示一个分类菜单菜单一菜单二菜单三菜单四菜单中的内容是从数据库中动态读取的之后当鼠标放在菜单内容上时会弹出一个新的菜单内容.新的内容也是从数据库中动态读去的现在有两个问题.第一个是这两级菜单要怎么取怎么关联.第二个问题是怎么样可以使菜单更加省资源.比如缓存什么的.使得不必每次鼠标一放上去都查一次数据库?
解决方案
解决方案二:
按需求来.动态读数据库TreeView和meum控件都可以做到.在page_load事件中加载好以后就不需要再查数据库了.
解决方案三:
我建议使用TreeView实现不要用菜单
解决方案四:
取一次数据然后同js做菜单吧我看你这个效果也只有用js做了别的怕是难道符合你的要求
解决方案五:
TreeView读取数据就可以!
解决方案六:
使用ajax,将所有数据取出放在两个newArray()中,然后分成两级菜单
解决方案七:
该回复于2008-06-05 09:06:52被版主删除
解决方案八:
做了一个例子,可以适用你上面的功能usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Collections;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;publicpartialclassMenu:System.Web.UI.Page{privateDataTableAllMenus=newDataTable();//所有菜单privateintindexNum=0;protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){//虚拟数据源DataTableMenus=newDataTable();Menus.Columns.Add("MnuId",typeof(int));//菜单IDMenus.Columns.Add("MnuNo",typeof(string));//菜单noMenus.Columns.Add("MnuName",typeof(string));//菜单名字Menus.Columns.Add("MnuParentNo",typeof(string));//菜单父no,当为null时,为一级菜单Menus.Rows.Add(1,"Menu_01","菜单一",null);Menus.Rows.Add(2,"Menu_02","菜单二",null);Menus.Rows.Add(3,"Menu_03","菜单三",null);Menus.Rows.Add(4,"Menu_04","菜单四",null);Menus.Rows.Add(5,"Menu_05","子菜单一","Menu_01");//可以随便设置归属于那个一级菜单Menus.Rows.Add(6,"Menu_06","子菜单二","Menu_02");Menus.Rows.Add(7,"Menu_07","子菜单三","Menu_03");Menus.Rows.Add(8,"Menu_08","子菜单四","Menu_04");Menus.Rows.Add(9,"Menu_09","子菜单四","Menu_04");AllMenus=Menus.Copy();LoadMenusTree();}}//装载菜单树privatevoidLoadMenusTree(){DataRow[]drs=AllMenus.Select("MnuParentNoisnull");//null时,为一级菜单,这里针对上面的虚拟数据结构foreach(DataRowdrindrs){CreateRootMenus(dr);}}privatevoidCreateRootMenus(DataRowrootMenuEntity){//这里是动态生成tdHtmlTableRowtr=newHtmlTableRow();HtmlTableCelltd=newHtmlTableCell();td.Height="25";td.Align="left";td.InnerHtml=string.Format("<tablewidth='190'height='24'border='0'align='center'style='padding-left:5px;'cellpadding='0'cellspacing='0'><tr><tdid='me1'><ahref="javascript:"onmouseover="ShowMenu({0})"onmouseout="HiddenMenu({0})"><fontcolor="#000000"><spanid='{2}'>{1}</span></font></a></td></tr></table>",rootMenuEntity["MnuId"],rootMenuEntity["MnuName"].ToString(),rootMenuEntity["MnuNo"].ToString());tr.Cells.Add(td);DataRow[]drs=AllMenus.Select(string.Format("MnuParentNo='{0}'",rootMenuEntity["MnuNo"].ToString()));if(drs.Length!=0){//装载子菜单MenuTree.Rows.Add(tr);CreateSubMenus(rootMenuEntity,drs,MenuTree);}}privatevoidCreateSubMenus(DataRowparentMenuEntity,DataRow[]currentMenuEntity,HtmlTabletable){HtmlTableRowtr=newHtmlTableRow();HtmlTableCelltd=newHtmlTableCell();tr.ID="c_"+parentMenuEntity["MnuId"].ToString();tr.Attributes.Add("style","display:none");//子菜单是隐藏的,鼠标经过父菜单就显示,否则隐藏tr.Cells.Add(td);table.Rows.Add(tr);HtmlTabletblSubmenu=newHtmlTable();tblSubmenu.Width="200";//这里是设置动态生成table的样式,可以不要tblSubmenu.Height="30";tblSubmenu.Border=1;tblSubmenu.Align="center";tblSubmenu.CellPadding=0;tblSubmenu.CellSpacing=0;foreach(DataRowsubmenuincurrentMenuEntity){HtmlTableRowtrSubmenu=newHtmlTableRow();trSubmenu.Style["padding-top"]="5px;";HtmlTableCelltdSubmenu=newHtmlTableCell();indexNum+=1;tdSubmenu.InnerHtml=string.Format("<spanid='{0}'>{1}</span>",submenu["MnuNo"].ToString(),submenu["MnuName"].ToString());td.Controls.Add(tblSubmenu);tblSubmenu.Rows.Add(trSubmenu);trSubmenu.Cells.Add(tdSubmenu);}}}
前台主体代码<tableid="MenuTree"runat="server"><tr><tdstyle="width:150px">菜单测试</td></tr></table>
前台js代码functionShowMenu(id)//显示子菜单{varobj=document.getElementById('c_'+id);//alert(obj);if(obj.style.display=="none"){obj.style.display="";}}functionHiddenMenu(id)//隐藏子菜单{varobj=document.getElementById('c_'+id);if(obj.style.display==""){obj.style.display="none";}}
效果图(略)