//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/ 的思路进行修正.