日期:2014-05-20  浏览次数:20783 次

关于GridView 合并列的问题?
表中数据如下:
编号  客户名称   部门
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;
}
});
}

------其他解决方案--------------------