首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于GridView 合并列的有关问题

2012-12-19 
关于GridView 合并列的问题?表中数据如下:编号客户名称部门1AA12AA23AA34BB15CC16CC27DD1想要的效果是 通

关于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;
}
});
}

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


你表达得不清楚!
[其他解释]
楼主,你看看你的合并效果图,能看懂吗?你表述清楚一点吧,你那个效果图,真看不懂
[其他解释]
这个要加上子列的内容,可以实现,但比较麻烦,最后看看你源码是怎样的
[其他解释]
vs2005:


protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
string[] cols = { "编号", "客户名称", "部门" };
object[][] testdata = new object[][]{
        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"}
    };
foreach (string c in cols)
dt.Columns.Add(new DataColumn(c));
foreach (object[] row in testdata)
dt.Rows.Add(row);

GridView gv = new GridView();
Page.Form.Controls.Add(gv);
gv.DataSource = dt;
gv.DataBind();

MergeColumnCells(gv, 1, null);
}

public delegate bool Mergable(TableCell c1, TableCell c2);

public void MergeColumnCells(GridView gv, int colIndex, Mergable mergable)
{
Mergable _mergable = delegate(TableCell c1, TableCell c2) { return c1.Text == c2.Text; };
mergable = mergable ?? _mergable;

int span = 1;
for (int i = gv.Rows.Count-1; i >= 0; i--)
{
TableCell c = gv.Rows[i].Cells[colIndex];
if (i > 0 && mergable(c, gv.Rows[i - 1].Cells[colIndex]))
{
c.Visible = false;
span++;
}
else
{
c.RowSpan = span;
c.Style.Value = "vertical-align: middle; text-align: center";
span = 1;
}
}
}

热点排行