Merge gridview cells in ASP.NET

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:

gridview.gif