1:通过Repeater绑定数据源
this.Repeater.DataSource = dm;
this.Repeater.DataBind();
2:循环遍历所有列
for (int i = 0; i < td.length; i++)               //i小于列长度
{
     string rptd = "ts";                 //rptd为td单元ID命名
     string tdIdName = rptd + i.ToString();
  Merge(tdIdName);                  // 把当前列的 td 的 ID文本作为方法的参数
}
private void Merge(string tdIdName1)
{
     for (int i = reptmCome.Items.Count - 1; i > 0; i--) // rptIncome.Items.Count - 1
     {
    MergeGet(tdIdName1, i);
     }
}
private void MergeGet(string tdIdName1, int i)
{
     HtmlTableCell cellPrev = reptmCome.Items[i - 1].FindControl(tdIdName1) as HtmlTableCell;
     HtmlTableCell cell = reptmCome.Items[i].FindControl(tdIdName1) as HtmlTableCell;
     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列的合并单元格方法
      }
}
原文:http://www.cnblogs.com/illegal/p/6373956.html