C#与SQL Server 2000实现无限级菜单

//tree.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Threading;

 

public partial class MenuTree : System.Web.UI.Page
{
    SqlDataAdapter da = null;
    SqlConnection con = new SqlConnection("server=test;database=DQYPSite_oa;uid=sa;pwd=mfeilgm");
    int i = 0;
    int count = 0;
    int proID = 0;
    int column = 0;
    string nextClassParentID;
    string nextnode;
    ArrayList columD = new ArrayList();
    DataSet TreeTable = new DataSet();
   
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            string cmdStr = "select * from YP_FileClass order by ClassID";
            da = new SqlDataAdapter(cmdStr, con);
            da.Fill(TreeTable,"ClassForlder");
            this.count = TreeTable.Tables["ClassForlder"].Rows.Count;
            if (this.count > 0)
            {
                CreatNode(i);
            }
            else
            {
                Response.Write("<a href='' target='frmMain'>请先创建文件夹</a>");
            }
           
        }
    }


    /// <summary>
    /// 判断当前节点是否还有兄弟节点(注意:在数据表中请先进行排序,规则是从短到长)
    /// </summary>
    /// <param name="current">当前节点的编号</param>
    /// <param name="i">当前节点所在下一行的行号</param>
    /// <returns></returns>
    public bool CheckNodeBrother(string current, int i, string currentClassParentID)
    {

        bool flag = false;
        for (int j = i; j < count; j++)
        {
            nextClassParentID = TreeTable.Tables["ClassForlder"].Rows[j]["ClassParentID"].ToString().Trim();
            nextnode = TreeTable.Tables["ClassForlder"].Rows[j]["ClassID"].ToString().Trim();
            if ((current.Length == nextnode.Length) && (currentClassParentID == nextClassParentID))
            {
                flag = true;
                break;
            }
        }
        return flag;
    }
    /// <summary>
    /// 判断该节点是否有孩子
    /// </summary>
    /// <param name="current">当前节点的编号</param>
    /// <param name="i">当前节点的下一行的行号</param>
    /// <returns></returns>
    public bool CheckChild(string current, int i)
    {
        bool flag_checkChild = false;
        for (int k = i; k < count; k++)
        {
            string nextNodeID;
            nextNodeID = TreeTable.Tables["ClassForlder"].Rows[k]["ClassParentID"].ToString().Trim();
            if (current == nextNodeID && current.Length == nextNodeID.Length)
            {
                flag_checkChild = true;
                break;
            }
        }
        return flag_checkChild;
    }

    /// <summary>
    /// 设置当前节点的输出及显示位置
    /// </summary>
    /// <param name="BrotherFlag">有无兄弟节点</param>
    /// <param name="childFlag">有无孩子</param>
    public void DisplayNode(bool BrotherFlag, bool childFlag, int i)
    {
        if (BrotherFlag)//有兄弟节点
        {
            if (childFlag)//有孩子
            {
                Response.Write("<img id=plus" + i.ToString() + " src='../Images/MenuTree/plus.gif' width='18px' height='18px'  align='absmiddle' />");
                Response.Write("<img id=open" + i.ToString() + " src='../Images/MenuTree/open.gif'  width='16px' height='16px' align='absmiddle' />");
                Response.Write("<a οnmοusemοve='ChangeColora(this)'  οnmοuseleave='ChangeColorb(this)' title='" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "'>" + "<span class='stylespan'>" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "</SPAN></a>");
                Response.Write("</div>");
                Response.Write("<div id='div_" + i.ToString() + "' style='display: none'>");
            }
            else //没有孩子
            {
                Response.Write("<img id=plus" + i.ToString() + " src='../Images/MenuTree/minus.gif' width='18px' height='18px'  align='absmiddle' />");
                Response.Write("<img id=open" + i.ToString() + " src='../Images/MenuTree/folder.gif'  width='16px' height='16px' align='absmiddle' />");
                Response.Write("<a οnmοusemοve='ChangeColora(this)'  οnmοuseleave='ChangeColorb(this)' title='" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "'>" + "<span class='stylespan'>" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "</SPAN></a>");
               
            }

        }
        else//无兄弟节点
        {
            if (childFlag)//有孩子
            {
                Response.Write("<img id=nob" + i.ToString() + " src='../Images/MenuTree/plus_bottom.gif' width='18px' height='18px'  align='absmiddle' />");
                Response.Write("<img id=open" + i.ToString() + " src='../Images/MenuTree/open.gif'  width='16px' height='16px' align='absmiddle' />");
                Response.Write("<a οnmοusemοve='ChangeColora(this)'  οnmοuseleave='ChangeColorb(this)' title='" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "'>" + "<span class='stylespan'>" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "</SPAN></a>");
                Response.Write("</div>");
                Response.Write("<div id='div_" + i.ToString() + "' style='display: none'>");
            }
            else//没有孩子
            {
                if (i == 0)
                {
                    Response.Write("<img id=open" + i.ToString() + " src='../Images/MenuTree/folder.gif'  width='16px' height='16px' align='absmiddle' />");
                    Response.Write("<a οnmοusemοve='ChangeColora(this)'  οnmοuseleave='ChangeColorb(this)' title='" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "'>" + "<span class='stylespan'>" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "</SPAN></a>");
                   
                }
                else
                {
                    Response.Write("<img id=plus" + i.ToString() + " src='../Images/MenuTree/joinbottom.gif' width='18px' height='18px'  align='absmiddle' />");
                    Response.Write("<img id=open" + i.ToString() + " src='../Images/MenuTree/folder.gif'  width='16px' height='16px' align='absmiddle' />");
                    Response.Write("<a οnmοusemοve='ChangeColora(this)'  οnmοuseleave='ChangeColorb(this)' title='" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "'>" + "<span class='stylespan'>" + TreeTable.Tables["ClassForlder"].Rows[i]["ClassName"].ToString().Trim() + "</SPAN></a>");
                   

                }
            }
        }

    }

    public void CreatNode(int i)
    {


        string currentID = TreeTable.Tables["ClassForlder"].Rows[i]["classID"].ToString().Trim();//当前节点的编号
        string currentParentID = TreeTable.Tables["ClassForlder"].Rows[i]["ClassParentID"].ToString().Trim();//当前的项的父节点编号
       
       
        column = currentID.Length / 2;//取出当前节点所在的列

        if (i == 0)
        {
            proID = 0;//如果当前是第一行,则其父节点为0
        }
        else
        {
            //当前节点的父节点所在的列
            proID = TreeTable.Tables["ClassForlder"].Rows[i - 1]["classID"].ToString().Trim().Length / 2;
        }

        if (column <proID)//如果当前节点所在的列比前一个节点所在的列小,说明当前列比上一列级别高
        {
            //当当前列比上一列小于两列以上时,必须从数组中删除多余的项,
            for (int lenNumber = 0; lenNumber < (proID - column + 1); lenNumber++)
            {
                columD.RemoveAt(columD.Count - 1);
            }
            
            for (int lenID = 0; lenID < (proID - column); lenID++)
             {
                    Response.Write("</div>");

             }
           
         }
       
       
        if (count == 1)
        {
            DisplayNode(false, false, i);
        }
       
       
        else
        {

            bool tt = CheckNodeBrother(currentID, i + 1, currentParentID);//判断有无兄弟
            if (tt)
            {//有兄弟
                columD.Add(true);
                bool rr = CheckChild(currentID, i + 1);
                if (rr)
                {//有孩子
                    Response.Write("<div onClick=ClickMenu('div_" + i.ToString() + "','plus','" + i.ToString() + "') >");
                    for (int NodeEnable = 0; NodeEnable < column - 1; NodeEnable++)
                    {
                        if (columD.Count !=0 && (bool)columD[NodeEnable])
                        {
                            Response.Write("<img src='../Images/MenuTree/line.gif' width='18px' height='18px' align='absmiddle' />");
                        }
                        else
                        {
                            Response.Write("<img src='../Images/MenuTree/empty.gif' width='18px' height='18px' align='absmiddle' />");
                        }

                    }
                    DisplayNode(true, true, i);
                    i++;
                    if (i < count)
                    {
                        CreatNode(i);
                    }
                }
                else
                {//无孩子
                    for (int NodeEnable = 0; NodeEnable < column - 1; NodeEnable++)
                    {
                        if (columD.Count != 0 && (bool)columD[NodeEnable])
                        {
                            Response.Write("<img src='../Images/MenuTree/line.gif' width='18px' height='18px' align='absmiddle' />");
                        }
                        else
                        {
                            Response.Write("<img src='../Images/MenuTree/empty.gif' width='18px' height='18px' align='absmiddle' />");
                        }

                    }
                    DisplayNode(true, false, i);
                    i++;
                    if (i < count)
                    {
                        columD.Add(false);
                        CreatNode(i);
                    }
                }
            }
            else//无兄弟
            {
                columD.Add(false);
                bool rr = CheckChild(currentID, i + 1);
                if (rr)
                {//有孩子
                    Response.Write("<div onClick=ClickMenu('div_" + i.ToString() + "','nob','" + i.ToString() + "') >");
                    for (int NodeEnable = 0; NodeEnable < column - 1; NodeEnable++)
                    {
                        if (columD.Count != 0 && (bool)columD[NodeEnable])
                        {
                            Response.Write("<img src='../Images/MenuTree/line.gif' width='18px' height='18px' align='absmiddle' />");
                        }
                        else
                        {
                            Response.Write("<img src='../Images/MenuTree/empty.gif' width='18px' height='18px' align='absmiddle' />");
                        }

                    }
                    DisplayNode(false, true, i);
                    i++;
                    if (i < count)
                    {
                        CreatNode(i);
                    }
                }
                else
                {//无孩子

                    for (int NodeEnable = 0; NodeEnable < column - 1; NodeEnable++)
                    {

                        if (columD.Count != 0 && (bool)columD[NodeEnable])
                        {
                            Response.Write("<img src='../Images/MenuTree/line.gif' width='18px' height='18px' align='absmiddle' />");
                        }
                        else
                        {
                            Response.Write("<img src='../Images/MenuTree/empty.gif' width='18px' height='18px' align='absmiddle' />");
                        }

                    }
                    DisplayNode(false, false, i);
                    i++;
                    if (i < count)
                    {
                        CreatNode(i);
                    }
                }
            }
        }
    }
}

 

//tree.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MenuTree.aspx.cs" Inherits="MenuTree" %>
<html xmlns="
http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>文件系统导航菜单</title>
    <link href="../Style/Main.css" rel="stylesheet" type="text/css" />
<style type="text/css">
<!--
.stylespan
 {
   font-size: 12px
 }

.stylediv
{
  margin-top:0px;
  height:18px;
  border-width:0px 0px 0px 0px;

}

.Node-selected
 {
  
  border:1px solid #000000;
  background-color:#EAEAEA;
  font-size:12px;
   
 }
 
.Node-unselect
 {
  border:0px solid #FFFFFF;
  background-color:transparent;
     font-size:12px;
  
 }

a {  color: #000000; text-decoration: none;cursor: hand}
a:hover {  color: #000000; text-decoration: none;cursor:hand}

.img
{
  border:0px 0px 0px 0px;
  width:18px;
  height:18px;
}

.imgDef
{
  border:0px 0px 0px 0px;
  width:16px;
  height:16px;
}

-->
</style>
</head>
<script language="javascript">
function ClickMenu(diving,plusing,num)
{
  if(document.getElementById(diving).style.display=="none")
  {
     document.getElementById(diving).style.display='block';
     if(plusing=="nob")
     {
        document.getElementById(plusing+num).src="../Images/MenuTree/minus_bottom.gif";
     }
     else if(plusing=="plus")
     {
       document.getElementById(plusing+num).src="../Images/MenuTree/minus.gif";
     }
     else if(plusing=="nolines")
     {
       document.getElementById(plusing+num).src="../Images/MenuTree/minus_nolines.gif";
     }
     else if(plusing=="bottom")
     {
       document.getElementById(plusing+num).src="../Images/MenuTree/minus_bottom.gif";
     }
      document.getElementById("open"+num).src="../Images/MenuTree/close.gif";
  }
  else
  {
     document.getElementById(diving).style.display='none';
     if(plusing=="nob")
     {
     document.getElementById(plusing+num).src="../Images/MenuTree/plus_bottom.gif";
     }
     else if(plusing=="plus")
     {
       document.getElementById(plusing+num).src="../Images/MenuTree/plus.gif";
     }
     else if(plusing=="nolines")
     {
       document.getElementById(plusing+num).src="../Images/MenuTree/plus_nolines.gif";
     }
     else if(plusing=="bottom")
     {
       document.getElementById(plusing+num).src="../Images/MenuTree/plus_bottom.gif";
     }

     document.getElementById("open"+num).src="../Images/MenuTree/open.gif";
  }
}

function ChangeColora(obj)
{
 
   
   obj.className='Node-selected';

}
function ChangeColorb(obj)
{
 
   obj.className='Node-unselect';

}


</script>

<body>
</body>
</html>

//说明,本文参考http://51aspx.com/CV/SqlTree/ 的思路进行修正.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值