ASP.NET中GridView和Repeater重复数据如何合并
网络编程 2021-07-04 22:41www.168986.cn编程入门
这篇文章主要介绍了ASP.NET中GridView和Repeater重复数据合并的方法,感兴趣的小伙伴们可以参考一下
这几天做一个项目有用到表格显示数据的地方,客户要求重复的数据列需要合并,就了一下GridView 和 Repeater 关于重复数据合并的方法。
效果图如下
GridView
前台代码
<div> <asp:GridView ID="gvIne" 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("ame") %>'></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.ame ,d.dname from aa as a right join bb as b on a.aid=b.aid right join 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, ); DataSet ds = new DataSet(); sda.Fill(ds); gvIne.DataSource = ds; gvIne.DataBind(); //MergeRows(gvIne.HeaderRow, gvIne.Rows.Count); int colnum = gvIne.Columns.Count; // 获取GridView中获取列数 MergeRows(gvIne, 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="rptIne" 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("ame") %></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.ame ,d.dname from aa as a right join bb as b on a.aid=b.aid right join 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, ); DataSet ds = new DataSet(); sda.Fill(ds); rptIne.DataSource = ds; rptIne.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 = rptIne.Items.Count - 1; i > 0; i--) // rptIne.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 = rptIne.Items[i - 1].FindControl(tdIdName1) as HtmlTableCell; // 获取下一行当前列的 td 所在的单元格 HtmlTableCell cell = rptIne.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列的合并单元格方法 } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程