My solution is not the first; however, I think, it is rather universal and very short - less than 20 lines of the code.
The algorithm is simple: to bypass all the rows, starting from the second at the bottom, to the top. If a cell value is the same as a value in the previous (lower) row, then increase RowSpan and make the lower cell invisible, and so forth.
The code that merges the cells is very short:
public class GridDecorator
{
public static void MergeRows(GridView gridView)
{
for (int rowIndex = gridView.Rows.Count - 2; rowIndex >= 0; rowIndex--)
{
GridViewRow row = gridView.Rows[rowIndex];
GridViewRow previousRow = gridView.Rows[rowIndex + 1];
for (int i = 0; i < row.Cells.Count; i++)
{
if (row.Cells[i].Text == previousRow.Cells[i].Text)
{
row.Cells[i].RowSpan = previousRow.Cells[i].RowSpan < 2 ? 2 :
previousRow.Cells[i].RowSpan + 1;
previousRow.Cells[i].Visible = false;
}
}
}
}
}
The last action is to add an OnPreRender event handler for the GridView:
protected void gridView_PreRender(object sender, EventArgs e)
{
GridDecorator.MergeRows(gridView);
}
Hello.
ReplyDeleteI have one question. What do " < 2 ? 2 : " it mean?
Thank you.
It's an old question but in case of someone go here....
DeleteIt's a ternary condition... {condtion} ? {Result if true}:{Result if false};
For example here : "previousRow.Cells[i].RowSpan < 2 ? 2 : previousRow.Cells[i].RowSpan + 1"
means :
if(previousRow.Cells[i].RowSpan < 2 )
row.Cells[i].RowSpan = 2;
else
row.Cells[i].RowSpan = previousRow.Cells[i].RowSpan + 1;
This comment has been removed by a blog administrator.
ReplyDeletecan you please make Paging for this gridview. and merged column records should not split into next page
ReplyDeleteHi MARSS. I need to merge cells that contain the same data horizontally on a gridview using asp .net. Can you help me? I trying using columnspan property but i have some issues.
ReplyDeletei have used templatefield in my gridview . It is showing me only first row. could you help me?
ReplyDeleteIn case of templatefield row.Cells[i].Text does not work. You should use something like this:
Delete((Label)row.Cells[cellIndex].FindControl("Label1")).Text
I attached an example to the article.
Nice thanks.
DeleteHI
ReplyDeleteI have developed merge cells in repeater.. so can you help me please?
how can i do it in windows form for vb.net
ReplyDeleteCan u please help me in applying pagination and sorting method for this merged gridview
ReplyDeleteSolution Completes my 95% of the requirement.
ReplyDeleteI have some blank cells in my third Column;
According To this Logic Those Empty Cells Shrink into Small cells(height).
I Dont Want Them to Shring What shouid i Do?
ReplyDeleteHi,
its working okay but i dont want to merge my last column how can i exclude it?