GridView Repeater 合并列-程序员宅基地

我们通常会遇到GridView Repeater 相邻列,值相同时合并的情况如图

今天把实现方法写一下

思路:因为GridView我们的值我们可以从后台自己获取。所以我们在得到要合并的列时,循环比较行列上下行之间的值,如果相等,改变一行Rowspan值,隐藏行一行

GridView实现:

  /// <summary>

        /// 合并行

        /// </summary>

        /// <param name="gvw"> 需要合并的GridView</param>

        /// <param name="sCol">sCol要合并开始列(从0开始)</param>

        /// <param name="eCol">eCol要合并的结束列</param>

        /// <param name="refCol">refCol以哪一列作为标准</param>

        public static void MergeRows(GridView gvw, int sCol, int eCol, int[] refCol)

        {

            for (int rowIndex = gvw.Rows.Count - 2; rowIndex >= 0; rowIndex--)

            {

               //获取相邻行的值row进行比较

                GridViewRow row = gvw.Rows[rowIndex];

                GridViewRow previousRow = gvw.Rows[rowIndex + 1];

                for (int i = sCol; i < eCol + 1; i++)

                {

                    {

                      //判断是否需要合并

                        bool isSame = true;

                        for (int j = 0; j < refCol.Length; j++)

                        {

                            if (row.Cells[refCol[j]].Text != previousRow.Cells[refCol[j]].Text)

                            {

                                isSame = false;

                                break;

                            }

                        }

                        if (!isSame)

                        {

                            continue;

                        }

                      //修改相邻两行的RowSpan的值

                        row.Cells[i].RowSpan = previousRow.Cells[i].RowSpan < 1 ? 2 : previousRow.Cells[i].RowSpan + 1;

                        previousRow.Cells[i].Visible = false;

                    }

                }

            }

        }

 Repeater 思路,因为repeater 的值后台无法取到,所以每个值所在的td 中设置ID="xxx" runat="server",来获取前台的值

   页面代码:      

           

View Code
                <asp:Repeater ID="rptBillItem" runat="server">
                    <HeaderTemplate>
                        <tr class="datarow">
                            <td>
                                果品等级<br />
                                GRADE
                            </td>
                            <td>
                                单箱重量<br />
                                WEUGHT/CTN
                            </td>
                            <td>
                                规格<br />
                                SIZE
                            </td>
                            <td>
                                箱数<br />
                                QUANTITY
                            </td>
                            <td>
                                用箱种类<br />
                                BRAND
                            </td>
                            <td>
                                备 注<br />
                                REMARK
                            </td>
                        </tr>
                    </HeaderTemplate>
                    <ItemTemplate>
                        <tr class="datarow" >
                            <td runat="server" id="grade">
                                <%#Eval("grade") %>
                            </td>
                            <td runat="server" id="weuqht">
                                <%#Eval("weuqht") %>
                            </td>
                            <td runat="server" id="size">
                               <%#Eval("size") %>
                            </td>
                            <td runat="server" id="quantity">
                                <%#Eval("quantity") %>
                            </td>
                            <td runat="server" id="brand">
                               <%#Eval("brand") %>
                            </td>
                            <td runat="server" id="remark" >
                                <%#Eval("remark") %>
                            </td>
                        </tr>
                    </ItemTemplate>
                </asp:Repeater>

后台方法:

 

View Code
 /// <summary>
        /// 合并行
        /// </summary>
        /// <param name="gvw"> 需要合并的Repeater</param>
        /// <param name="refCol">refCol以哪一列作为标准</param>
        /// <param name="con">要合并的列名ID</param>
        public static void MergeRows(Repeater gvw, string[] refCol, string[] con)
        {
            //循环所以的行
            for (int rowIndex = gvw.Items.Count - 2; rowIndex >= 0; rowIndex--)
            {
                for (int i = 0; i < con.Length; i++)
                {
                    //获得该行上一行的数据
                    HtmlTableCell oCell_previous = gvw.Items[rowIndex].FindControl(con[i]) as HtmlTableCell;
                    HtmlTableCell oCell = gvw.Items[rowIndex + 1].FindControl(con[i]) as HtmlTableCell;
                    oCell.RowSpan = (oCell.RowSpan == -1) ? 1 : oCell.RowSpan;
                    oCell_previous.RowSpan = (oCell_previous.RowSpan == -1) ? 1 : oCell_previous.RowSpan;
                    {
                        bool isSame = true;
                        //循环要合并的列
                        for (int j = 0; j < refCol.Length; j++)
                        {
                            HtmlTableCell refColtilel_previous = gvw.Items[rowIndex].FindControl(refCol[j]) as HtmlTableCell;
                            HtmlTableCell refColtile = gvw.Items[rowIndex + 1].FindControl(refCol[j]) as HtmlTableCell;
                            if (refColtile.InnerText != refColtilel_previous.InnerText)
                            {
                                if (con[i] != "remark")
                                {
                                    isSame = false;
                                    break;
                                }
                            }
                        }
                        if (!isSame)
                        {
                            continue;
                        }
                        //如果两列值相等则合并
                        if (oCell.InnerText == oCell_previous.InnerText)
                        {
                            oCell.Visible = false;
                            oCell_previous.RowSpan += oCell.RowSpan;
                        }
                    }
                }
            }
        }

转载于:https://www.cnblogs.com/jiangqiang/archive/2012/07/30/2612342.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30455661/article/details/97142539

智能推荐

java socket 聊天程序_Java Socket与开发一个简单网络聊天程序-程序员宅基地

文章浏览阅读467次。一、Socket通信的基本原理首先socket 通信是基于TCP/IP 网络层上的一种传送方式。socket是基于应用服务与TCP/IP通信之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行分装,对用户来说,只要通过一组简单的API就可以实现网络的连接。借用网络上一组socket通信图给大家进行详细讲解:首先,服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行..._server talk

模型开发实践(python)_python 大模型开发-程序员宅基地

文章浏览阅读585次。模型开发python_python 大模型开发

Oracle数据库PL SQL开发、Oracle-SQL开发习题答案_查询在2001年11月加入部门,且加入部门后任职半年(按182天算)到1年(365天)的员工编-程序员宅基地

文章浏览阅读1.7k次。第2章 编写简单的查询语句练习11.使用两种方式查询所有员工(EMP)信息。 SELECT * FROM emp; SELECT empno,ename,job,mgr,hiredate,sal,comm,deptno FROM emp;2.查询(EMP)员工编号、员工姓名、员工职位、员工月薪、工作部门编号。 SELECT empno,ename,job,sal,deptno FROM emp;练习21.员工转正后,月薪上调20%,请查询_查询在2001年11月加入部门,且加入部门后任职半年(按182天算)到1年(365天)的员工编

escape/unescape编码的Delphi实现_delphi &lt; unescape-程序员宅基地

文章浏览阅读3.3k次。版权声明: 本文由Oak/lyris完成,首发于CSDN,作者保留中文版权。未经许可,不得使用于任何商业用途。欢迎转载,但请保持文章及版权声明完整。如需联络请发邮件:[email protected] fu_delphi < unescape

Robot Framework - 一些练习-程序员宅基地

文章浏览阅读310次。01 - 安装Robot Framework TA环境根据系统请选择对应的版本包来安装,下面是以Win7-64bit系统为例,来说明如何搭建一个可以运行练习三test case的RF TA环境。1)首先,要安装好版本对应的python环境,C:\Users\guowli>pythonPython 2.7.8 (default, Jun 30 2014, 16:0..._[msc v.1937 64 bit (amd64)] on win32 type "help", "copyright", "credits" or

nlp-tutorial代码注释3-1,RNN简介-程序员宅基地

文章浏览阅读294次。针对之前n-gram等具有fixed-window size的模型的缺点,例如无法处理任意长度的输入、不具有记忆性等,提出了一个新的模型:循环神经网络(RNN)。下对其做简要介绍:RNN:RNN的特点是有多少输入就有多少对应的激活值。可以看成输入是在时间上有先后的,每一次输入是一个时间步,每一个时间步产生激活值,也可能产生预测值(根据需要)。RNN的不同点是,它不是仅用本时间步的输入值来预测..._nlp-tutorial

随便推点

Android Studio使用ButterKnife 8.0.1无效的问题_android studio弃用8.0.1-程序员宅基地

文章浏览阅读5.5k次。Android Studio使用ButterKnife 8.0.1的问题最近做一个新项目,之前使用的ButterKnife 7.0.1,得知目前最新的ButterKnife支持ListView,还支持绑定资源,就像在新项目里使用最新的版本8.0.1,可是使用的时候遇到一个问题,那就是使用BindView注解根本绑定不到TextView或ImageView,也就是绑定到的对象都是null,导致程序异常_android studio弃用8.0.1

dos转unix_winscp自动将dos转换为unix-程序员宅基地

文章浏览阅读946次。故障环境:Dockerfile编写环境是Win10+Nodepad++,Docker服务器为Centos7不知道有没有朋友会像我这么懒为了方便测试就用winscp远程打开docker服务器,直接创建dockerfile并进行调试的呢。如果有的话我想一定遇到过这个问题:运行后容器没有驻留,而是异常中止了,使用dokcer logs查看日志却报standard_init_linux.go:1..._winscp自动将dos转换为unix

mask rcnn报错tensorflow.python.framework.errors_impl.FailedPreconditionError: 2 root error(s) found.-程序员宅基地

文章浏览阅读1.3k次。@[TOC](mask rcnn报错tensorflow.python.framework.errors_impl.FailedPreconditionError: 2 root error(s) found.)第一次跑目标检测代码,出现了这种错误,下面大概补全下报错具体细节:tensorflow.python.framework.errors_impl.FailedPreconditionError: 2 root error(s) found.(0) Failed precondition: Er_tensorflow.python.framework.errors_impl.failedpreconditionerror: 2 root erro

ubuntu16.04 最详细安装最新版source insight 4-----linux源码开发必备工具_ubuntu 16.04 安装sourceinsight-程序员宅基地

文章浏览阅读2.8k次。安装wine sudo apt-get install wine;安装过程中弹框使用tab键选择ok,然后回车,下个界面选择Yes; 下载安装包 官网地址https://www.sourceinsight.com/,最底部点击下载; 本人使用的是版本是Source Insight 4-最新版本4.0.0106-2020年1月7日; 安装 ..._ubuntu 16.04 安装sourceinsight

Geany编写python错误解决SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xa3_./encoder8_3_test.v:9: syntax error i give up. 测试-程序员宅基地

文章浏览阅读2k次。python编写循环的结束语句后编译报错:SyntaxError: (unicode error) ‘utf-8’ codec can’t decode byte 0xa3解决方法:“文档’中的文件编码设置,将unicode设置(点击)为utf-8,如截图..._./encoder8_3_test.v:9: syntax error i give up. 测试

远程桌面端口修改.bat_修改远程桌面端口bat-程序员宅基地

文章浏览阅读3.1k次。@echo offrem 查找端口号for /f "skip=4 tokens=3 delims= " %%i in ('reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber') do (set value16=%%i)_修改远程桌面端口bat

推荐文章

热门文章

相关标签