溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET中GridView和Repeater重復(fù)數(shù)據(jù)怎么合并

發(fā)布時(shí)間:2021-02-19 15:06:25 來源:億速云 閱讀:198 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下ASP.NET中GridView和Repeater重復(fù)數(shù)據(jù)怎么合并,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

這幾天做一個(gè)項(xiàng)目有用到表格顯示數(shù)據(jù)的地方,客戶要求重復(fù)的數(shù)據(jù)列需要合并,就總結(jié)了一下GridView 和 Repeater 關(guān)于重復(fù)數(shù)據(jù)合并的方法。

ASP.NET中GridView和Repeater重復(fù)數(shù)據(jù)怎么合并

效果圖如下 :

ASP.NET中GridView和Repeater重復(fù)數(shù)據(jù)怎么合并

GridView :
前臺(tái)代碼 :

<div>
  <asp:GridView ID="gvIncome" runat="server" AutoGenerateColumns="False">
   <Columns>
    <asp:TemplateField HeaderText="一級(jí)"> 
     <ItemTemplate>
      <asp:Label ID="Label0" runat="server" Text='<%#Eval("aname") %>'></asp:Label>
     </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="二級(jí)">
     <ItemTemplate>
      <asp:Label ID="Label1" runat="server" Text='<%#Eval("bname") %>'></asp:Label>
     </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="三級(jí)">
     <ItemTemplate>
      <asp:Label ID="Label2" runat="server" Text='<%#Eval("cname") %>'></asp:Label>
     </ItemTemplate>
    </asp:TemplateField>
     <asp:TemplateField HeaderText="四級(jí)">
     <ItemTemplate>
      <asp:Label ID="Label3" runat="server" Text='<%#Eval("dname") %>'></asp:Label>
     </ItemTemplate>
    </asp:TemplateField>
   </Columns>
  </asp:GridView>
 </div>
<span > </span>

GridView 后臺(tái)代碼

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中獲取列數(shù)
   MergeRows(gvIncome, 4, "Label"); // GridView 要整合的列數(shù) 需要改變的Lable控件
  }
  public static void MergeRows(GridView gvw, int colnum, string controlNameo)
  {
   for (int col = 0; col < colnum; col++)  // 遍歷每一列
   {
    string controlName = controlNameo + col.ToString(); // 獲取當(dāng)前列需要改變的Lable控件ID
    for (int rowIndex = gvw.Rows.Count - 2; rowIndex >= 0; rowIndex--)  //GridView中獲取行數(shù) 并遍歷每一行
    {
     GridViewRow row = gvw.Rows[rowIndex];  // 獲取當(dāng)前行
     GridViewRow previousRow = gvw.Rows[rowIndex + 1]; // 獲取當(dāng)前行 的上一行
     Label row_lbl = row.Cells[col].FindControl(controlName) as Label; //// 獲取當(dāng)前列當(dāng)前行 的 Lable 控件ID 的文本
     Label previousRow_lbl = previousRow.Cells[col].FindControl(controlName) as Label; //// 獲取當(dāng)前列當(dāng)前行 的上一行 的 Lable控件ID 的文本
     if (row_lbl != null && previousRow_lbl != null) // 如果當(dāng)前行 和 上一行 要改動(dòng)的 Lable 的ID 的文本不為空
     {
      if (row_lbl.Text == previousRow_lbl.Text)  // 如果當(dāng)前行 和 上一行 要改動(dòng)的 Lable 的ID 的文本不為空 且相同
      {
       // 當(dāng)前行的當(dāng)前單元格(單元格跨越的行數(shù)。 默認(rèn)值為 0 ) 與下一行的當(dāng)前單元格的跨越行數(shù)相等且小于一 則 返回2 否則讓上一行行的當(dāng)前單元格的跨越行數(shù)+1
       row.Cells[col].RowSpan = previousRow.Cells[col].RowSpan < 1 ? 2 : previousRow.Cells[col].RowSpan + 1;
       //并讓上一行的當(dāng)前單元格不顯示
       previousRow.Cells[col].Visible = false;
      }
     }
    }
   }
   
  }

Repeater前臺(tái)代碼 :

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

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

<div>
  <table>
   <tr>
    <th>一級(jí)</th> <th>二級(jí)</th> <th>三級(jí)</th> <th>四級(jí)</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后臺(tái)代碼:

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); // 把當(dāng)前列的 td 的 ID文本作為方法的參數(shù)
   }
   
  }

  /// <summary>
  /// 
  /// </summary>
  /// <param name="tdIdName1">當(dāng)前列當(dāng)前行的 td 的ID文本</param>
  private void MergeCell(string tdIdName1)
  {
   for (int i = rptIncome.Items.Count - 1; i > 0; i--) // rptIncome.Items.Count - 1 數(shù)據(jù)總行數(shù)(數(shù)據(jù)從0開始)  遍歷當(dāng)前列的每一行
   {
    MergeCellSet(tdIdName1, i);  
   }  
  }
  /// <summary>
  /// 
  /// </summary>
  /// <param name="tdIdName1">當(dāng)前列當(dāng)前行的 td 的ID文本</param>
  /// <param name="i">當(dāng)前行</param>
  private void MergeCellSet(string tdIdName1, int i)
  {
   HtmlTableCell cellPrev = rptIncome.Items[i - 1].FindControl(tdIdName1) as HtmlTableCell; // 獲取下一行當(dāng)前列的 td 所在的單元格
   HtmlTableCell cell = rptIncome.Items[i].FindControl(tdIdName1) as HtmlTableCell; // 獲取當(dāng)前行當(dāng)前列的 td 所在的單元格
   cell.RowSpan = (cell.RowSpan == -1) ? 1 : cell.RowSpan; // 獲取當(dāng)前行當(dāng)前列單元格跨越的行數(shù) 
   cellPrev.RowSpan = (cellPrev.RowSpan == -1) ? 1 : cellPrev.RowSpan; // 獲取下一行當(dāng)前列單元格跨越的行數(shù) 
   if (cell.InnerText == cellPrev.InnerText)
   {
    // 讓下一行的當(dāng)前單元格的跨越行數(shù) + 當(dāng)前行的跨越行數(shù)
    cellPrev.RowSpan += cell.RowSpan;
    cell.Visible = false;  // 隱藏當(dāng)前行

    //關(guān)鍵代碼,再判斷執(zhí)行第2列的合并單元格方法
   }
  }

以上是“ASP.NET中GridView和Repeater重復(fù)數(shù)據(jù)怎么合并”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI