Click here to Skip to main content
Click here to Skip to main content

Fixed header in ASP.NET DataGrid

By , 20 Apr 2005
 

Introduction

A very common design request is to create a DataGrid list, that can contain many rows (e.g. account contacts list), that has a fixed maximum height and a scrollbar when there are more rows than can fit into the allotted space. This is easily done by putting the DataGrid within a DIV tag:

<DIV style="OVERFLOW: auto; HEIGHT: 
120px">
<asp:DataGrid ...
</DIV>

Then the next design request made by customers is to have a scrolling body with fixed column headers so that, users don't have to remember which column contains what. Such a fixed header that stays put and never scroll out of view can be made using a style like this:

<style type="text/css">
<!--
.DataGridFixedHeader {background-color: white; position:relative; top:expression(this.offsetParent.scrollTop);}
-->
</style>

The background color is needed to hide the data rows as they scroll under the header row. Make sure that the style is on a single line, the expression might not work when the style definition uses multiple lines.

Apply the new header style to the DataGrid using the HeaderStyle element:

<asp:DataGrid id="dgContacts" runat="server" ... >
...
<HeaderStyle CssClass="ms-formlabel DataGridFixedHeader"></HeaderStyle>
...

Note how can you apply multiple classes within the CssClass attribute to combine several styles to achieve reuse in your web pages or to combine them with styles that are not your own (such as SharePoint styles).

There are several other suggestions out there on how to achieve a fixed header row, such as having a separate table above the DataGrid, but this suffers from alignment and column width problems, for e.g., when a table cell contains non-breaking content. It also creates more work when changing the columns of the DataGrid. The style solution in this article, however, is as simple as it gets.

Supported Browsers

This solution is based on CSS expressions, and works with MSIE 5.x and 6.x. It is pure client-side and should not interfere with server-side code (except for adding the style), but it might behave strange if you have other positioning stuff in your page.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

KjellSJ
Web Developer
Norway Norway
Member
My blog: kjellsj.blogspot.com
My contribution to other stuff at CodeProject:
PleaseWaitButton

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionCan I also alter the color of Visited Link in the datagrid header?membersmcirish22 Apr '08 - 8:09 
AnswerRe: Can I also alter the color of Visited Link in the datagrid header?membernsimeonov5 Dec '08 - 14:55 
GeneralFixed Grid Header with Scrollable Datamemberaswini9 Apr '08 - 1:22 
Generaldont see border in head datagridmemberRoxanaAFG10 Oct '07 - 9:09 
GeneralRe: dont see border in head datagridmemberMarkShoe12 Oct '07 - 5:35 
GeneralRe: dont see border in head datagridmemberjigscool_2225 Feb '08 - 10:44 
GeneralRe: dont see border in head datagridmemberhasitha12319 Mar '08 - 23:04 
GeneralRe: dont see border in head datagridmemberTheSoundofCylons3 Jun '08 - 3:23 
GeneralRe: dont see border in head datagridmemberrterry3 Nov '09 - 7:27 
GeneralRe: dont see border in head datagridmemberTheSoundofCylons3 Nov '09 - 8:11 
GeneralDIV + Fixed Header Not workingmembersbadriprasad21 Sep '07 - 21:13 
QuestionHow to get Vertical Scroll bar onlymembersmcirish21 Aug '07 - 7:59 
AnswerRe: How to get Vertical Scroll bar onlymemberMember 446923413 Jan '11 - 9:32 
GeneralFixed Header and Fixed Pager(or Footer) as wellmemberahmedelbatal22 Jul '07 - 3:43 
Generalexpression not working on Mozilamembersmruti_ranjan18 Apr '07 - 23:52 
GeneralEditing items that you must scroll to seememberevshell1813 Apr '07 - 5:37 
GeneralRe: Editing items that you must scroll to seememberevshell1816 Apr '07 - 5:02 
GeneralRe: Editing items that you must scroll to seememberqtran020331 May '07 - 8:23 
Generaldon't use top: expressionmemberShiggity30 Mar '07 - 8:49 
GeneralRe: don't use top: expressionmemberDebo_Net9 Sep '07 - 20:41 
GeneralWatch Positioningmemberjohnsaxton@yahoo.com15 Nov '06 - 3:03 
GeneralDatagrid Headermembernour12310 Nov '06 - 0:24 
AnswerRe: Datagrid Headermembersmcirish21 Aug '07 - 8:06 
On datagrid, use method item_data_bound
Ex: Datagrid2_ItemDataBound
 
Put code similar to below in the method.   The code below has options to hid columns, and rename columns.
 
Private Sub Datagrid2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles Datagrid2.ItemDataBound
 
            '   ===================               Item Columns            ===========================
            If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
 
                  'Columns to Hide
                  'Hide these cell Columns
                  e.Item.Cells(0).Visible = False                  'Hide items in COL 0     
 

            End If               'end of         If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem
 

            '   ===================               Header Columns            ===========================
            'Need to hide header for column j
            If e.Item.ItemType = ListItemType.Header Then
 
                  'Hide these Header Columns
                  e.Item.Cells(0).Visible = False                  'Hide items in COL 0     
 
                  'Column Names
                  e.Item.Cells(1).Text = "Index"
                  e.Item.Cells(2).Text = "Year"                                      
                  e.Item.Cells(3).Text = "Name"                 
 
                  e.Item.Cells(4).Text = "Address"                                               

            End If                  'end of   If e.Item.ItemType = ListItemType.Header   test
 
      End Sub                  'Datagrid2_ItemDataBound
 
-smc
Generalcheckbox in gridviewmemberRonjon Kumar Ghosh16 Sep '06 - 23:01 
Questionfixed header gridviewmemberSultan Khan16 Sep '06 - 22:38 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 21 Apr 2005
Article Copyright 2005 by KjellSJ
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid