GridView中實現樹形結構的實現方法簡單,使用javascript實現。先看一下截圖:
節點展開情況
節點合並情況:
下面說下實現方法:
aspx頁面:
<body>
<form id= " form1 " runat= " server ">
<div id= " main ">
<fieldset>
<legend>GridView中樹形結構實現</legend>
<asp:GridView ID= " gvList " runat= " server " AutoGenerateColumns= " false " CssClass= " grid "
DataKeyNames= " ID,PID,Level,HasChild " TreeColumnIndex= " 0 " OnRowDataBound= " gvList_RowDataBound ">
<Columns>
<asp:BoundField HeaderText= " 名稱 " DataField= " Name " HeaderStyle-BackColor= " #23f90d " HeaderStyle-Width= " 150 "></asp:BoundField>
<asp:BoundField HeaderText= " 編號 " DataField= " ID " HeaderStyle-BackColor= " #23f90d ">
<ItemStyle HorizontalAlign= " Center " Width= " 80 "></ItemStyle>
</asp:BoundField>
<asp:BoundField HeaderText= " 編碼 " DataField= " Code " HeaderStyle-BackColor= " #23f90d ">
<ItemStyle HorizontalAlign= " Center " Width= " 80 "></ItemStyle>
</asp:BoundField>
</Columns>
<EmptyDataTemplate>
<div class= " tip ">
暫無記錄!<input type= " button " onclick= " add() " class= " btnGrid " value= " 新增功能點 " /></div>
</EmptyDataTemplate>
</asp:GridView>
</fieldset><asp:HiddenField runat= " server " ID= " hfAimID "></asp:HiddenField>
</div>
</form>
<script type= " text/javascript ">
// 樹節點相關控制
<!--
function hideChildren(node) {
var level = parseInt(node.getAttribute( " level "));
var nextNode = node.nextSibling;
while (nextNode != null && parseInt(nextNode.getAttribute( " level ")) > level) {
nextNode.style.display = " none "; nextNode = nextNode.nextSibling;
}
}
function showChildren(node) {
var level = parseInt(node.getAttribute( " level "));
var id = node.getAttribute( " id ");
var nextNode = node.nextSibling;
while (nextNode != null && parseInt(nextNode.getAttribute( " level ")) > level) {
if (nextNode.getAttribute( " pid ") == id) {
if (node.getAttribute( " expand ") == " 1 ") {
nextNode.style.display = "";
showChildren(nextNode);
}
else {
nextNode.style.display = " none ";
}
}
nextNode = nextNode.nextSibling;
}
}
function setExpand(sender) {
var curNode = sender.parentNode.parentNode;
if (curNode.getAttribute( " expand ") == " 1 ") {
curNode.setAttribute( " expand ", " 0 ");
sender.src = " maximize.gif ";
hideChildren(curNode);
}
else {
curNode.setAttribute( " expand ", " 1 ");
sender.src = " minimize.gif ";
showChildren(curNode);
}
}
// -->
</script>
<form id= " form1 " runat= " server ">
<div id= " main ">
<fieldset>
<legend>GridView中樹形結構實現</legend>
<asp:GridView ID= " gvList " runat= " server " AutoGenerateColumns= " false " CssClass= " grid "
DataKeyNames= " ID,PID,Level,HasChild " TreeColumnIndex= " 0 " OnRowDataBound= " gvList_RowDataBound ">
<Columns>
<asp:BoundField HeaderText= " 名稱 " DataField= " Name " HeaderStyle-BackColor= " #23f90d " HeaderStyle-Width= " 150 "></asp:BoundField>
<asp:BoundField HeaderText= " 編號 " DataField= " ID " HeaderStyle-BackColor= " #23f90d ">
<ItemStyle HorizontalAlign= " Center " Width= " 80 "></ItemStyle>
</asp:BoundField>
<asp:BoundField HeaderText= " 編碼 " DataField= " Code " HeaderStyle-BackColor= " #23f90d ">
<ItemStyle HorizontalAlign= " Center " Width= " 80 "></ItemStyle>
</asp:BoundField>
</Columns>
<EmptyDataTemplate>
<div class= " tip ">
暫無記錄!<input type= " button " onclick= " add() " class= " btnGrid " value= " 新增功能點 " /></div>
</EmptyDataTemplate>
</asp:GridView>
</fieldset><asp:HiddenField runat= " server " ID= " hfAimID "></asp:HiddenField>
</div>
</form>
<script type= " text/javascript ">
// 樹節點相關控制
<!--
function hideChildren(node) {
var level = parseInt(node.getAttribute( " level "));
var nextNode = node.nextSibling;
while (nextNode != null && parseInt(nextNode.getAttribute( " level ")) > level) {
nextNode.style.display = " none "; nextNode = nextNode.nextSibling;
}
}
function showChildren(node) {
var level = parseInt(node.getAttribute( " level "));
var id = node.getAttribute( " id ");
var nextNode = node.nextSibling;
while (nextNode != null && parseInt(nextNode.getAttribute( " level ")) > level) {
if (nextNode.getAttribute( " pid ") == id) {
if (node.getAttribute( " expand ") == " 1 ") {
nextNode.style.display = "";
showChildren(nextNode);
}
else {
nextNode.style.display = " none ";
}
}
nextNode = nextNode.nextSibling;
}
}
function setExpand(sender) {
var curNode = sender.parentNode.parentNode;
if (curNode.getAttribute( " expand ") == " 1 ") {
curNode.setAttribute( " expand ", " 0 ");
sender.src = " maximize.gif ";
hideChildren(curNode);
}
else {
curNode.setAttribute( " expand ", " 1 ");
sender.src = " minimize.gif ";
showChildren(curNode);
}
}
// -->
</script>
主要是腳本中的實現。
后台代碼中主要是行呈現處理的實現,代碼如下:

if (e.Row.RowType == DataControlRowType.DataRow)
{
# region 生成樹形結構
string id = gvList.DataKeys[e.Row.RowIndex][ " ID "].ToString();
string pid = gvList.DataKeys[e.Row.RowIndex][ " PID "].ToString();
string level = gvList.DataKeys[e.Row.RowIndex][ " Level "].ToString();
// 增加節點的屬性
e.Row.Attributes.Add( " id ", id);
e.Row.Attributes.Add( " pid ", pid);
e.Row.Attributes.Add( " level ", level);
e.Row.Attributes.Add( " expand ", " 1 ");
int indent = ( int.Parse(level) - 1) * 20;
// 判斷是否有子節點
if (gvList.DataKeys[e.Row.RowIndex][ " HasChild "].ToString() == " 1 ")
{
// 設置父節點前面的圖片和點擊事件
HtmlImage img = new HtmlImage();
img.Src= TreeImagePath + " minimize.gif ";
img.Attributes.Add( " onclick ", " setExpand(this) ");
img.Style.Add( " cursor ", " pointer ");
e.Row.Cells[ 0].Controls.Add(img);
e.Row.Cells[ 0].Style[ " font-weight "] = " bold ";
}
else
{
indent += 16;
}
e.Row.Cells[ 0].Style[ " padding-left "] = indent + " px ";
e.Row.Cells[ 0].Controls.Add( new LiteralControl(e.Row.Cells[ 0].Text));
# endregion
e.Row.Attributes[ " onmouseover "] = " style.backgroundColor='#F2FDDB' ";
e.Row.Attributes[ " onmouseout "] = " style.backgroundColor='' ";
}
{
# region 生成樹形結構
string id = gvList.DataKeys[e.Row.RowIndex][ " ID "].ToString();
string pid = gvList.DataKeys[e.Row.RowIndex][ " PID "].ToString();
string level = gvList.DataKeys[e.Row.RowIndex][ " Level "].ToString();
// 增加節點的屬性
e.Row.Attributes.Add( " id ", id);
e.Row.Attributes.Add( " pid ", pid);
e.Row.Attributes.Add( " level ", level);
e.Row.Attributes.Add( " expand ", " 1 ");
int indent = ( int.Parse(level) - 1) * 20;
// 判斷是否有子節點
if (gvList.DataKeys[e.Row.RowIndex][ " HasChild "].ToString() == " 1 ")
{
// 設置父節點前面的圖片和點擊事件
HtmlImage img = new HtmlImage();
img.Src= TreeImagePath + " minimize.gif ";
img.Attributes.Add( " onclick ", " setExpand(this) ");
img.Style.Add( " cursor ", " pointer ");
e.Row.Cells[ 0].Controls.Add(img);
e.Row.Cells[ 0].Style[ " font-weight "] = " bold ";
}
else
{
indent += 16;
}
e.Row.Cells[ 0].Style[ " padding-left "] = indent + " px ";
e.Row.Cells[ 0].Controls.Add( new LiteralControl(e.Row.Cells[ 0].Text));
# endregion
e.Row.Attributes[ " onmouseover "] = " style.backgroundColor='#F2FDDB' ";
e.Row.Attributes[ " onmouseout "] = " style.backgroundColor='' ";
}
源代碼下載: GridViewTreeView.rar