Control PreRender is a very useful event in
ASP.Net. This is the event which will be called just before the control rendered
to the client browser and modification done to the control in this stage of life
cycle will reflect in the browser.
For example, lets take a gridview in to consideration. We know that a gridview
always follows a columnar or tabular structure. Now one may ask -what is
columnar or tabular structure..Ok, for now I am just sharing a line. Columnar
structure means data in the gridview to be arranged only in a column basis view
or table basis view. In fact when are binding a gridview, it is just rendering
the rows present in the datasource in the manner we have defined its header
cells. You can't find a data of a column in another column normally.
Yes, we are here to change this basic idea. We don't have any real control to
the structure of gridview till the Databinding event. Although we have certain
process to change the structure of the gridview on RowDataBound, but I still
feel it is more easy and convenient way to do the changes on gridview PreRender
event. The cause for suggesting this is- on this event we have a ready made
structure and we need to check for necessary logic and do the changes.
For gridview cells merge, I am using following method to be called inside
gridviewPreRender event.
Here, the int array contains all the column indices that are to be merged on
same data if found.
public
void MergeCell(int[]
colIndices)
{
foreach (int
colIndex in colIndices)
{
for (int
rowIndex = gvSchoolList.Rows.Count – 2; rowIndex >= 0; rowIndex–)
{
GridViewRow row = gvSchoolList.Rows[rowIndex];
GridViewRow previousRow = gvSchoolList.Rows[rowIndex + 1];
if (row.Cells[colIndex].Text ==
previousRow.Cells[colIndex].Text)
{
row.Cells[colIndex].RowSpan =
previousRow.Cells[colIndex].RowSpan < 2 ? 2 :
previousRow.Cells[colIndex].RowSpan + 1;
previousRow.Cells[colIndex].Visible =
false;
}
}
}
}
And finally you will get a result like this: