.Net用字符串拼接实现表格数据相同时合并单元格

前言

    最近在做项目通过GridView或Repeater绑定数据,如果两行或若干行某列值相同,需要进行合并单元格,但是实现过程中想到了字符串拼接,于是就没用绑定数据控件,而是用了html结合字符串实现了绑定数据源并满足以上要求合并单元格。

前台代码如下

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head runat="server">
 3     <title></title>
 4 </head>
 5 <body>
 6     <form id="form1" runat="server">
 7     <div>
 8         <%--<asp:Repeater ID="Repeater1" runat="server">
 9             <HeaderTemplate>
10                 <table border="1">
11                     <tr>
12                         <td>
13                             序号
14                         </td>
15                         <td>
16                             内容1
17                         </td>
18                         <td>
19                             内容2
20                         </td>
21                     </tr>
22             </HeaderTemplate>
23             <ItemTemplate>
24             </ItemTemplate>
25             <FooterTemplate>
26                 </table></FooterTemplate>
27         </asp:Repeater>--%>
28         <table border="1">
29             <tr>
30                 <td>
31                     序号
32                 </td>
33                 <td>
34                     内容1
35                 </td>
36                 <td>
37                     内容2
38                 </td>
39             </tr>
40             <%=strTRs %>
41         </table>
42     </div>
43     </form>
44 </body>
45 </html>

后台代码

 1         public string strTRs = "";
 2         protected void Page_Load(object sender, EventArgs e)
 3         {
 4             //拼接表格
 5             //这里将要合并的数据 列 id1 进行排序,相同 列id1 数据行集中便于循环处理
 6             DataTable dt = DbHelperSQL.GetDataTable("select * from Table_2 order by id1");
 7             for (int i = 0; i < dt.Rows.Count; )
 8             {
 9                 int j = 1;  //记录每次 while循环累加合并的行数
10                 //循环判断下一行记录的 id1列值是否相等,相等继续循环,不相等跳出
11                 while (true)
12                 {
13                     if (i >= dt.Rows.Count) break;
14                     if (dt.Rows.Count > i + 1)      //如果存在下一行记录,进入if
15                     {
16                         //如果下一行记录和当前行记录 id1列值相等,继续循环
17                         if (dt.Rows[i]["id1"].ToString().Equals(dt.Rows[i + 1]["id1"].ToString()))
18                         {
19                             i++;
20                             j++;
21                             continue;
22                         }
23                         else
24                         {
25                             //j大于1时存在要合并的行,合并处理
26                             if (j > 1)
27                             {
28                                 for (int k = 0; k < j; k++)
29                                 {
30                                     if (k == 0)
31                                     {
32                                         strTRs += string.Format("<tr><td rowspan='{0}'>{1}</td><td>{2}</td><td>{3}</td></tr>", j, dt.Rows[i - j + k + 1]["id1"].ToString(), dt.Rows[i - j + k + 1]["test"].ToString(), dt.Rows[i - j + k + 1]["id"].ToString());
33                                     }
34                                     else
35                                     {
36                                         strTRs += string.Format("<tr><td>{2}</td><td>{3}</td></tr>", j, dt.Rows[i - j + k + 1]["id1"].ToString(), dt.Rows[i - j + k + 1]["test"].ToString(), dt.Rows[i - j + k + 1]["id"].ToString());
37                                     }
38                                 }
39                                 j = 1;
40                                 i++;
41                             }
42                             else
43                             {
44                                 strTRs += string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>", dt.Rows[i]["id1"].ToString(), dt.Rows[i]["test"].ToString(), dt.Rows[i]["id"].ToString());
45                                 i++;
46                                 break;
47                             }
48                         }
49                     }
50                     else                        //不存在下一行记录,文本添加
51                     {
52                         strTRs += string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>", dt.Rows[i]["id1"].ToString(), dt.Rows[i]["test"].ToString(), dt.Rows[i]["id"].ToString());
53                         i++;
54                         break;
55                     }
56 
57                 }
58             }
59 
60         }