欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET中GridView和Repeater重复数据如何合并

程序员文章站 2023-11-05 22:05:16
这几天做一个项目有用到表格显示数据的地方,客户要求重复的数据列需要合并,就总结了一下gridview 和 repeater 关于重复数据合并的方法。 效果图如下 :...

这几天做一个项目有用到表格显示数据的地方,客户要求重复的数据列需要合并,就总结了一下gridview 和 repeater 关于重复数据合并的方法。

ASP.NET中GridView和Repeater重复数据如何合并

效果图如下 :

ASP.NET中GridView和Repeater重复数据如何合并

gridview :
前台代码 :

<div>
  <asp:gridview id="gvincome" runat="server" autogeneratecolumns="false">
   <columns>
    <asp:templatefield headertext="一级"> 
     <itemtemplate>
      <asp:label id="label0" runat="server" text='<%#eval("aname") %>'></asp:label>
     </itemtemplate>
    </asp:templatefield>
    <asp:templatefield headertext="二级">
     <itemtemplate>
      <asp:label id="label1" runat="server" text='<%#eval("bname") %>'></asp:label>
     </itemtemplate>
    </asp:templatefield>
    <asp:templatefield headertext="三级">
     <itemtemplate>
      <asp:label id="label2" runat="server" text='<%#eval("cname") %>'></asp:label>
     </itemtemplate>
    </asp:templatefield>
     <asp:templatefield headertext="四级">
     <itemtemplate>
      <asp:label id="label3" runat="server" text='<%#eval("dname") %>'></asp:label>
     </itemtemplate>
    </asp:templatefield>
   </columns>
  </asp:gridview>
 </div>

复制代码 代码如下:
<span style="line-height: 1.5; font-family: verdana, arial, helvetica, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255);"> </span>

gridview 后台代码
public void databind()
  {
   string sql = "select a.aname,b.bname,c.cname ,d.dname from aa as a right join bb as b on a.aid=b.aid right join cc as c on b.bid=c.bid left join dd as d on d.cid=c.cid order by a.aid";
   sqldataadapter sda = new sqldataadapter(sql, cn);
   dataset ds = new dataset();
   sda.fill(ds);
   gvincome.datasource = ds;
   gvincome.databind();
   //mergerows(gvincome.headerrow, gvincome.rows.count);
   int colnum = gvincome.columns.count; // 获取gridview中获取列数
   mergerows(gvincome, 4, "label"); // gridview 要整合的列数 需要改变的lable控件
  }
  public static void mergerows(gridview gvw, int colnum, string controlnameo)
  {
   for (int col = 0; col < colnum; col++)  // 遍历每一列
   {
    string controlname = controlnameo + col.tostring(); // 获取当前列需要改变的lable控件id
    for (int rowindex = gvw.rows.count - 2; rowindex >= 0; rowindex--)  //gridview中获取行数 并遍历每一行
    {
     gridviewrow row = gvw.rows[rowindex];  // 获取当前行
     gridviewrow previousrow = gvw.rows[rowindex + 1]; // 获取当前行 的上一行
     label row_lbl = row.cells[col].findcontrol(controlname) as label; //// 获取当前列当前行 的 lable 控件id 的文本
     label previousrow_lbl = previousrow.cells[col].findcontrol(controlname) as label; //// 获取当前列当前行 的上一行 的 lable控件id 的文本
     if (row_lbl != null && previousrow_lbl != null) // 如果当前行 和 上一行 要改动的 lable 的id 的文本不为空
     {
      if (row_lbl.text == previousrow_lbl.text)  // 如果当前行 和 上一行 要改动的 lable 的id 的文本不为空 且相同
      {
       // 当前行的当前单元格(单元格跨越的行数。 默认值为 0 ) 与下一行的当前单元格的跨越行数相等且小于一 则 返回2 否则让上一行行的当前单元格的跨越行数+1
       row.cells[col].rowspan = previousrow.cells[col].rowspan < 1 ? 2 : previousrow.cells[col].rowspan + 1;
       //并让上一行的当前单元格不显示
       previousrow.cells[col].visible = false;
      }
     }
    }
   }
   
  }

repeater前台代码 :

// table样式
<style>
  table {
   border-collapse:collapse;
  }
   table tr td,th {
    border:1px solid black;
   }
</style>

//*****************

<div>
  <table>
   <tr>
    <th>一级</th> <th>二级</th> <th>三级</th> <th>四级</th>
   </tr>
   <asp:repeater id="rptincome" runat="server">
    <itemtemplate>
     <tr>
      <td runat="server" id="td0"><%#eval("aname") %></td>
      <td runat="server" id="td1"><%#eval("bname") %></td>
      <td runat="server" id="td2"><%#eval("cname") %></td>
      <td runat="server" id="td3"><%#eval("dname") %></td>
     </tr>
    </itemtemplate>
   </asp:repeater>
  </table>
</div>

repeater后台代码:

public void databind()
  {
   string sql = "select a.aname,b.bname,c.cname ,d.dname from aa as a right join bb as b on a.aid=b.aid right join cc as c on b.bid=c.bid left join dd as d on d.cid=c.cid order by a.aid";
   sqldataadapter sda = new sqldataadapter(sql, cn);
   dataset ds = new dataset();
   sda.fill(ds);
   rptincome.datasource = ds;
   rptincome.databind();

   for (int i = 0; i < 4; i++) // 遍历每一列
   {
    string rpttd = "td";
    string tdidname1 = rpttd + i.tostring();
    mergecell(tdidname1); // 把当前列的 td 的 id文本作为方法的参数
   }
   
  }

  /// <summary>
  /// 
  /// </summary>
  /// <param name="tdidname1">当前列当前行的 td 的id文本</param>
  private void mergecell(string tdidname1)
  {
   for (int i = rptincome.items.count - 1; i > 0; i--) // rptincome.items.count - 1 数据总行数(数据从0开始)  遍历当前列的每一行
   {
    mergecellset(tdidname1, i);  
   }  
  }
  /// <summary>
  /// 
  /// </summary>
  /// <param name="tdidname1">当前列当前行的 td 的id文本</param>
  /// <param name="i">当前行</param>
  private void mergecellset(string tdidname1, int i)
  {
   htmltablecell cellprev = rptincome.items[i - 1].findcontrol(tdidname1) as htmltablecell; // 获取下一行当前列的 td 所在的单元格
   htmltablecell cell = rptincome.items[i].findcontrol(tdidname1) as htmltablecell; // 获取当前行当前列的 td 所在的单元格
   cell.rowspan = (cell.rowspan == -1) ? 1 : cell.rowspan; // 获取当前行当前列单元格跨越的行数 
   cellprev.rowspan = (cellprev.rowspan == -1) ? 1 : cellprev.rowspan; // 获取下一行当前列单元格跨越的行数 
   if (cell.innertext == cellprev.innertext)
   {
    // 让下一行的当前单元格的跨越行数 + 当前行的跨越行数
    cellprev.rowspan += cell.rowspan;
    cell.visible = false;  // 隐藏当前行

    //关键代码,再判断执行第2列的合并单元格方法
   }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。