Click here to Skip to main content
6,595,444 members and growing! (17,781 online)
Email Password   helpLost your password?
Web Development » ASP.NET Controls » General     Intermediate License: The Code Project Open License (CPOL)

Merge DataGrid Header

By irwansyah

Shows how to merge DataGrid header at run-time.
C#, Windows, .NET 1.0, .NET 1.1, ASP.NET, VS.NET2003, Dev
Posted:26 Oct 2004
Views:195,631
Bookmarked:76 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
42 votes for this article.
Popularity: 6.82 Rating: 4.20 out of 5
3 votes, 7.1%
1
1 vote, 2.4%
2
2 votes, 4.8%
3
9 votes, 21.4%
4
27 votes, 64.3%
5

Sample Image

Sample Image

Introduction

This article describes the technique to merge the header of a DataGrid by redirecting the Render method of the DataGrid items.

Background

I found many times the need to merge the header of a DataGrid. So, when I was having spare time, I tried to find a way to do it, and here it is. I know that if you need to merge headers, you can use the Repeater control instead. But if you are fond of DataGrid (just like me), or may be you already used DataGrid, then this article is for you.

Using the code

When rendered, a DataGrid will be converted into a HTML Table element and the header will be the first HTML TR element. So, to have a merged header, we need to have control in the rendering of the header. This can be achieved by redirecting the Render method of the DataGrid header using the SetRenderMethodDelegate of the DataGrid header on ItemCreated event, like this:

private void Datagrid1_ItemCreated(object sender, 
          System.Web.UI.WebControls.DataGridItemEventArgs e) 
{ 
    //*** Examine if the item created is the header item 

    ListItemType lit = e.Item.ItemType; 
    if(ListItemType.Header == lit) 
    { 
        //*** Redirect the default header rendering method to our own method 

        e.Item.SetRenderMethodDelegate(new RenderMethod(NewRenderMethod)); 
    } 
}

And here is our own Render method:

/// <summary> 

/// This is our custom render method for the grid header item 

/// </summary> 

/// <param name="writer"></param> 

/// <param name="ctl"></param> 

private void NewRenderMethod(HtmlTextWriter writer, Control ctl) 
{ 
    //***  We don't need to write the <TR> tag

    //     because it's already written by the writer 

    //     so now we write the Name column 

    writer.Write("<TD colspan=\"3\" align=\"center\">Name</TD>\n"); 

    //***  The Age column must have the rowspan attribute

    //     and must be rendered inside the 

    //     first row so it will centered vertically 

    TableCell cell = (TableCell)ctl.Controls[ctl.Controls.Count-1]; 
    cell.Attributes.Add("rowspan","2"); 
    cell.RenderControl(writer); 

    //***     Now we close the first row, so we can insert the second one 

    writer.Write("</TR>\n"); 

    //***  Add the style attributes that was defined in design time 

    //     to our second row so they both will have the same appearance 

    DataGrid1.HeaderStyle.AddAttributesToRender(writer); 

    //***     Insert the second row 

    writer.RenderBeginTag("TR"); 

    //***  Render all the cells that was defined

    //     in design time, except the last one 

    //     because we already rendered it above 

    for(int i=0; i<= ctl.Controls.Count-2; i++) 
    { 
        ctl.Controls[i].RenderControl(writer); 
    } 

    //***  We don't need to write the </TR> close tag

    //     because the writer will do that for us 

    //     and so we're done :) 

}

I have created a decorator class to decorate a DataGrid (ASPNetDatagridDecorator class) to have a merge header, and all you need to do is define the header cell like this (you can use the auto format feature, but doesn't work for all):

private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here

    if(!this.IsPostBack)
    {
        TableCell cell = null;
        DataGrid1.DataSource = GetData();
        DataGrid1.DataBind(); 

        m_add.DatagridToDecorate = Datagrid2;
        ArrayList header = new ArrayList();

        // cell = new TableCell();

        // cell.Text = "Code";

        // cell.RowSpan = 2;

        // cell.HorizontalAlign = HorizontalAlign.Center;

        // header.Add(cell);


        cell = new TableCell();
        cell.Text = "Name";
        cell.RowSpan = 2;
        cell.HorizontalAlign = HorizontalAlign.Center;
        header.Add(cell);

        cell = new TableCell();
        cell.Text = "Name";
        cell.ColumnSpan = 3;
        cell.HorizontalAlign = HorizontalAlign.Center;
        header.Add(cell);

        cell = new TableCell();
        cell.Text = "Age";
        cell.RowSpan = 2;
        cell.HorizontalAlign = HorizontalAlign.Center;
        header.Add(cell);

        cell = new TableCell();
        cell.Text = "School";
        cell.ColumnSpan = 3;
        cell.HorizontalAlign = HorizontalAlign.Center;
        header.Add(cell);

        cell = new TableCell();
        cell.Text = "Religion";
        cell.RowSpan = 2;
        cell.HorizontalAlign = HorizontalAlign.Center;
        header.Add(cell);

        m_add.AddMergeHeader(header);

        Datagrid2.DataSource = GetData();
        Datagrid2.DataBind();

    }

}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

irwansyah


Member
Irwansyah is a web developer currently using ASP.Net. Irwansyah main interests lie in developing business application framework.

Irwansyah intends to work overseas one day and explore the world till the end of the world.
Occupation: Web Developer
Location: Indonesia Indonesia

Other popular ASP.NET Controls articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 61 (Total in Forum: 61) (Refresh)FirstPrevNext
QuestionProblem with row selecting PinmemberMember 253756112:22 9 Jul '09  
GeneralPage PostBack PinmemberGoast2526:01 12 Mar '09  
GeneralPage PostBack PinmemberMarichamyK19:57 9 Jul '09  
GeneralExcellent work...Keep it up PinmemberMohammed Hameed22:30 27 Jan '09  
QuestionAny solution for the sorting the dataGrid Pinmemberbpranathi11:03 14 Jul '08  
GeneralVB Version Pinmembermeme me6:00 20 May '08  
GeneralThis moves the grid below the page footer. Pinmembertech16:15 10 Mar '08  
Generalproblem when I am creating dynamic grids PinmemberForwardmurali0:08 21 Sep '07  
GeneralSimplified and improved version the solution described above. PinmemberMykola Tarasyuk4:33 13 Jun '07  
QuestionProblem with page [modified] Pinmembermaya_zakry20:59 30 May '07  
GeneralProblem with dynamic columns Pinmembersatejprabhu23:30 25 Feb '07  
QuestionWhat about Sorting and Paging ? Pinmembercodeprojectmitu0:51 10 Nov '06  
GeneralSorting Doesent work where RowSpan=2 PinmemberAnand Morbia5:49 14 Oct '06  
GeneralHelp to Merge it in VB.NET version... Pinmemberslee_g23:43 4 Sep '06  
QuestionSolution for Windows Form DataGridView PinmemberC#newcomer18:04 18 Aug '06  
GeneralThanks (and some critics) Pinmembernsimeonov10:00 12 Jul '06  
GeneralRe: Thanks (and some critics) Pinmemberirwansyah16:25 12 Jul '06  
GeneralRe: Thanks (and some critics) Pinmembernsimeonov16:43 12 Jul '06  
GeneralProblem with ItemCommand event PinmemberArturo Montoya Rivera13:50 23 Mar '06  
GeneralRe: Problem with ItemCommand event PinmemberArturo Montoya Rivera6:08 24 Mar '06  
GeneralRe: Problem with ItemCommand event PinmemberJakeanson0:51 28 Apr '06  
GeneralTHANK YOU! Pinmembersroh15:39 3 Mar '06  
GeneralProblem with Invisible Column Pinmembernavinkaus22:55 11 Jan '06  
GeneralDropdownList in Merged Header PinmemberDick Clark1:39 9 Dec '05  
GeneralDropDownList in header PinmemberDick Clark1:38 9 Dec '05  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 26 Oct 2004
Editor: Smitha Vijayan
Copyright 2004 by irwansyah
Everything else Copyright © CodeProject, 1999-2009
Web15 | Advertise on the Code Project