GridView中实现树形结构分组的功能

    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 " οnclick= " 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>

 

 

主要是脚本中的实现。

 

后台代码中主要是行呈现处理的实现,代码如下:

 

ExpandedBlockStart.gif View Code
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='' ";
            }

 

源代码下载: GridViewTreeView.rar 

 

转载于:https://www.cnblogs.com/chhuic/archive/2012/05/11/2495577.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值