表中数据如下:
编号 客户名称 部门
1 A A1
2 A A2
3 A A3
4 B B1
5 C C1
6 C C2
7 D D1
想要的效果是 通过客户名称分组 合并同一客户名称 下面的相同列!谢谢!
实现效果如:
编号 客户名称 部门
1 A1
2 A A2
3 A3
4 B B1
5 C C1
6 C2
7 D D1
-客户名称实现合并后最好能够居中!
------最佳解决方案--------------------
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
string[] cols = {"编号", "客户名称", "部门"};
object[][] testdata = {
new object[] {1, "A", "A1"},
new object[] {2, "A", "A2"},
new object[] {3, "A", "A3"},
new object[] {4, "B", "B1"},
new object[] {5, "C", "C1"},
new object[] {6, "C", "C2"},
new object[] {7, "D", "D1"}
};
dt.Columns.AddRange(cols.Select(c => new DataColumn(c)).ToArray());
foreach (var row in testdata)
dt.Rows.Add(row);
GridView gv = new GridView();
Page.Form.Controls.Add(gv);
gv.DataSource = dt;
gv.DataBind();
MergeColumnCells(gv, 1);
}
public void MergeColumnCells(GridView gv, int colIndex, Func<TableCell, TableCell, bool> mergable = null)
{
mergable = mergable ?? (Func<TableCell, TableCell, bool>)((c1, c2) => c1.Text == c2.Text);
var cells = gv.Rows.Cast<GridViewRow>().Select(r => r.Cells[colIndex]).Reverse().ToList();
int span = 1, i=0;
cells.ForEach(c =>
{
if (i < cells.Count-1 && mergable(c, cells[++i]))
{
c.Visible = false;
span++;
}
else
{
c.RowSpan = span;
c.Style.Value = "vertical-align: middle; text-align: center";
span = 1;
}
});
}
------其他解决方案--------------------