和csdn论坛的菜单差不多吧??无限制级的更好:-D求数据库的设计方案及实现菜单的SQL语句。主要是想不到SQL语句该怎么实现,所以数据不知该如何设计好谢谢!注:目前我已经找到了js的控件树,但是需要对应的SQL语句来得到动态输出的HTML,所以上面部分才是重点,谢谢

解决方案 »

  1.   

    无限制级
    就是treeview的设计就可以了啊。我这有几个菜单 但是没有改成递归的也是输出HTML的。你可以参考传送门
      

  2.   

    这个可以考虑在一张表中,加上一个 ParentID(上级菜单ID) 应该就好实现了,思路应该是这样..
      

  3.   


    子夜大神,我已经看过你的bolg了,第三个是可以,但是没有数据库啊。。我在cnblogs给你发邮件了。。
      

  4.   

    最简单的表设计就是:
     
     id   name   pid(上级id)
     取出数据后,在生成dtree需要的js脚本,dtree就会自动生成树形目录
      

  5.   


    这个想法不错,不过,我不知道怎么做??用sql语句该怎么写!
      

  6.   


    直接把你数据想要的数据select出来就行了,不需要什么特殊的sql语句
      

  7.   


    # region 绑定菜单
        private void BindMenu()
        {
            string sql;
            sql = "select cSupMenuCode,cMenuCode,cMenuName,cPathURL,iSorting,cispage from u_Menu where cMenuCode in (select cMenuCode from u_Purview where cUserCode='" + ((EPG_User)Session["user"]).UserCode + "' and cView=1) and ((cSupMenuCode like '" + (Request["id"] == null ? Session["link"] : Request["id"]) + "%' or cMenuCode='" + (Request["id"] == null ? Session["link"] : Request["id"]) + "') or (cMenuCode='1'))  order by iSorting,cMenuCode";
            //sql = "select cSupMenuCode,cMenuCode,cMenuName,cPathURL,iSorting,cispage from u_Menu where cMenuCode in (select cMenuCode from u_Purview where cUserCode='Admin' and cView=1) and ((cSupMenuCode like '" + (Request["id"] == null ? Session["link"] : Request["id"]) + "%' or cMenuCode='" + (Request["id"] == null ? Session["link"] : Request["id"]) + "') or (cMenuCode='1'))  order by iSorting,cMenuCode";
            
            DataTable ctbl=EPG.ExecQuerySql(sql);
            
            string aa = "";
            
            for (int i = 0; i < ctbl.Rows.Count; i++)
            {
                if ((ctbl.Rows[i]["cSupMenuCode"].ToString() == null ? "-1" : ctbl.Rows[i]["cSupMenuCode"].ToString()) == "1" || (ctbl.Rows[i]["cSupMenuCode"].ToString() == null ? "-1" : ctbl.Rows[i]["cSupMenuCode"].ToString()) == "-1")
                {
                    aa += " d.add(" + ctbl.Rows[i]["cMenuCode"].ToString() + "," + (ctbl.Rows[i]["cSupMenuCode"] == null ? "-1" : ctbl.Rows[i]["cSupMenuCode"].ToString()) + ",'" + ctbl.Rows[i]["cMenuName"] + "','','" + ctbl.Rows[i]["cMenuName"] + "','mainFrame');";
                }
                else
                {
                    aa += " d.add(" + ctbl.Rows[i]["cMenuCode"] + "," + (ctbl.Rows[i]["cSupMenuCode"] == null ? "-1" : ctbl.Rows[i]["cSupMenuCode"].ToString()) + ",'" + ctbl.Rows[i]["cMenuName"].ToString() + "','" + ctbl.Rows[i]["cPathURL"] + "?MenuCode=" + ctbl.Rows[i]["cMenuCode"].ToString() + "','" + ctbl.Rows[i]["cMenuName"].ToString() + "','mainFrame');";                
                }
                    
            }        string outstring = "<SCRIPT type='text/javascript'>" +
                         "try{" +
                            "d = new dTree('d');" +
                         "d.config.closeSameLevel = true;" +
                         "d.config.useStatusText = true; " + aa + "document.write(d);d.closeAll();" +
                            "}catch(e){;}";
            outstring += "</SCRIPT>";
            this.LiteralMenu.Text = outstring;
        }
        # endregion不知道楼主用的JS 是不是和我一样的
      

  8.   

    完整DEMO
    http://topic.csdn.net/u/20091117/11/0520F3CA-10F0-4924-8743-1523A8984530.html
      

  9.   


    关键是sql里面的递归不会吧故居需要动态sql语句不会。。
      

  10.   

    #region 绑定左侧菜单项
        /// <summary>
        /// 绑定功能模块的菜单
        /// </summary>
        /// <param name="tree"></param>
        /// <param name="ModuleCode"></param>
        /// <param name="cUserCode"></param>
        /// <returns></returns>
        public static string BindMenu(TreeView tree, string ModuleCode, string cUserCode)
        {
            string sql = "";
            switch (ModuleCode)
            {
                case "background":
                    sql = "select cParentNodeCode,cNodeCode,cNodeName,cPathUrl from t_Back_Menu where cNodeCode in ( " +
                        "select cModCode from t_Back_RolePurview where bLook=1 and cRoleCode=( " +
                        "select cRoleCode from t_Back_RoleUser where cUserCode ='" + cUserCode + "')) order by iSorting";
                    break;
                default:
                    sql = "select cParentNodeCode,cNodeCode,cNodeName,cPathUrl from t_Sys_Menu where cNodeCode in ( " +
                     "select cModCode from t_Purview_Systempurviewsetting where bLook=1 and cRoleCode=( " +
                     "select a.crolecode from t_Purview_Userpurview a inner join t_Sys_moduleRoleList b on a.cRoleCode=b.cRoleCode where a.cUserCode='" + cUserCode + "' and b.cModuleCode='" + ModuleCode + "')) order by iSorting";
                    break;
            }
            string chenggong = "1";
            try
            {
                DataSet ds = Cls_Data.ExecuteQuerySqlDs(sql);
                InitTree(ds.Tables[0], tree.Nodes, "1");
            }
            catch (Exception ex)
            {
                chenggong = ex.Message;
            }
            return chenggong;
        }    private static void InitTree(DataTable dt, TreeNodeCollection Nds, string parentId)
        {
            DataView dv = new DataView(dt);
            TreeNode tmpNd;
            dv.RowFilter = "cParentNodeCode=" + "'" + parentId + "'";
            foreach (DataRowView drv in dv)
            {
                tmpNd = new TreeNode();
                tmpNd.Text = drv["cNodeName"].ToString();
                if (parentId != "1")
                {
                    if (drv["cPathUrl"].ToString() != "")
                    {
                        tmpNd.Text = "<a onclick=\"parent.document.all('rightFrame').src='" + drv["cPathUrl"].ToString() + "';\" style=\"cursor:pointer\">" + drv["cNodeName"].ToString() + "</a>";
                    }
                    tmpNd.SelectAction = TreeNodeSelectAction.Expand;
                }
                else
                {
                    tmpNd.SelectAction = TreeNodeSelectAction.Expand;
                }
                Nds.Add(tmpNd);
                InitTree(dt, tmpNd.ChildNodes, drv["cNodeCode"].ToString());
            }
        }
        #endregion
      

  11.   

    SQL递归,要用到存储过程,你可以去搜:SQL 递归。
    曾经坐过一个类似QQ评论的嵌套,就是用的SQL递归。
      

  12.   

    这个主要是数据库设计,我是用的js动态加载树实现的无限级菜单。n_id  p_id  name  分别为描述性字段。n_id为自增列。p_id为父级的n_id
    1     0     财务管理
    2     0     业务管理
    3     1     工单结算
    4     3     工单批量结算读取的时候先读取p_id为0的顶级菜单,自己联想下吧。多的就不写了,这样就是无限级的了。是不是很简单?
      

  13.   

    http://blog.csdn.net/ws_hgo/article/details/4842026
    http://blog.csdn.net/amandag/article/details/5021126