Introduction
I was searching for a way to get a scrollable Gridview with a freeze header and I found different ways to do it, but most of them use CSS or JavaScript. What I want to find was a way to do it in the code file. (.CS or .VB)Here I would try to explain how it could be done with code. (.CS)
Using the Code
You just need to add a Panel control then add a Table and Gridview control inside of Panel control.in the .CS file you need to add this code:
AddSortDirectionImage Function
/// summary
    ///   Email: Antonio.Suarez@GrupoKino.com
    ///Web Page: http://www.grupoKino.com    
    /// [Español]Funcion que agrega una imagen a la columna ordenada de un gridView 
    /// [English]Function that adds a image to the sorted column.
    /// summary
    /// param name="gridviewID"
    /// [Español]Gridview al cual se le agregara la imagen 
    /// [English]GridView to add sort image
    /// param
    /// param name="itemRow"
    /// [Español]Renglon del gridview al cual se le agrega la imagen 
    /// [English]Row of gridview to add sort image
    /// param
    public void AddSortDirectionImage(GridView gridviewID, GridViewRow itemRow)
    {
        if (gridviewID.AllowSorting == false)
            return;
        Image sortImage = new Image();
        Label space = new Label();
        sortImage.ImageUrl = (
            gridviewID.SortDirection ==
            SortDirection.Ascending ? @"~/sort_asc.gif" : @"~/sort_desc.gif");
        sortImage.Visible = true;
        space.Text = " ";
        for (int i = 0; i < gridviewID.Columns.Count; i++)
        {
            string colExpr = gridviewID.Columns[i].SortExpression;
            if (colExpr != "" && colExpr == gridviewID.SortExpression)
            {
                itemRow.Cells[i].Controls.Add(space);
                itemRow.Cells[i].Controls.Add(sortImage);
            }
        }
    }And FreezeGridviewHeader Function
/// summary
    ///  Author: Antonio Suarez
    ///   Email: Antonio.Suarez@GrupoKino.com
    ///Web Page: http://www.grupoKino.com    
    /// [Español]Funcion que copia el header de un gridview a un control tipo Table 
    /// [English]Function that copy a gridview header to a table control.
    /// summary
    /// param name="_gv1"
    /// [Español]Gridview del cual se copiara el encabezado.
    /// [English]GridView from where the header row will be copied
    /// param
    /// param name="_tb1"
    /// [Español]Renglon del gridview al cual se le agrega la imagen 
    /// [English]Row of gridview to add sort image
    /// 
    /// param name="_pc1"
    /// [Español]Panel que contendra tanto al gridview como al control table
    /// [English]Panel container of the gridview and table control.   
    /// param    
    protected void FreezeGridviewHeader(GridView _gv1, Table _tb1,Panel _pc1)
    {
        Page.EnableViewState = false;
        //[Español]Copiando las propiedades del renglon de encabezado
        //[English]Copying a header row data and properties    
        _tb1.Rows.Add(_gv1.HeaderRow);
        _tb1.Rows[0].ControlStyle.CopyFrom(_gv1.HeaderStyle);
        _tb1.CellPadding = _gv1.CellPadding;
        _tb1.CellSpacing = _gv1.CellSpacing;
        _tb1.BorderWidth = _gv1.BorderWidth;
        //if (!_gv1.Width.IsEmpty)
        //_gv1.Width = Unit.Pixel(Convert.ToInt32(_gv1.Width.Value) + Convert.ToInt32(
        //    _tb1.Width.Value) + 13);
        //[Español]Copiando las propiedades de cada celda del nuevo encabezado.
        //[English]Copying  each cells properties to the new header cells properties
        int Count = 0;
        _pc1.Width = Unit.Pixel(100);
        for (Count = 0; Count < _gv1.HeaderRow.Cells.Count - 1; Count++)
        {
            _tb1.Rows[0].Cells[Count].Width = _gv1.Columns[Count].ItemStyle.Width;
            _tb1.Rows[0].Cells[Count].BorderWidth = 
                _gv1.Columns[Count].HeaderStyle.BorderWidth;
            _tb1.Rows[0].Cells[Count].BorderStyle = 
                _gv1.Columns[Count].HeaderStyle.BorderStyle;
            _pc1.Width = Unit.Pixel(Convert.ToInt32(
                _tb1.Rows[0].Cells[Count].Width.Value) +
                Convert.ToInt32(_pc1.Width.Value) + 14);
        }
        //Panel1.Width = Unit.Pixel(Convert.ToInt32(
        //    _tb1.Rows[0].Cells[Count-1].Width.Value) + 12);
    } in web.config-----------------<?xml version="1.0"?>
<configuration>
 <configSections>
  <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
   <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
    <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
    <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
     <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere"/>
     <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
     <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
    </sectionGroup>
   </sectionGroup>
  </sectionGroup>
 </configSections>
 <connectionStrings>
  <add name="NorthwindConnectionString" connectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient"/>
 </connectionStrings>
 <system.web>
  <pages>
   <controls>
    <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
   </controls>
  </pages>
  <!--
          Set compilation debug="true" to insert debugging
          symbols into the compiled page. Because this
          affects performance, set this value to true only
          during development.
    -->
  <compilation debug="true">
   <assemblies>
    <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
   </assemblies>
  </compilation>
  <httpHandlers>
   <remove verb="*" path="*.asmx"/>
   <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
   <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
   <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
  </httpHandlers>
  <httpModules>
   <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </httpModules>
 </system.web>
 <system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules>
   <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </modules>
  <handlers>
   <remove name="WebServiceHandlerFactory-Integrated"/>
   <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
   <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
   <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </handlers>
 </system.webServer>
</configuration>
 masterpage.master---------------<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Antonio.Suarez@grupoKino.com - Gridview</title>
</head>
<body>
    <form id="form1" runat="server">
        <table border="0" cellpadding="0" cellspacing="0" style="width: 100%">
            <tr>
                <td style="font-size: 1.5em; color: blue; font-family: verdana">
                    <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
                        Scrollable Gridview with Freeze header and sort image that works inside and outside of UpdatePanel.
                        It works in Firefox and Internet Explorer too.
                        <br />
                    </asp:contentplaceholder>
                </td>
            </tr>
            <tr>
                <td>
                    <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
                    </asp:ContentPlaceHolder>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>
 in default.aspx------------------using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
///  Author: Antonio Suarez
///   Email: Antonio.Suarez@GrupoKino.com
///Web Page: http://www.grupoKino.com
/// </summary>
public partial class _Default : System.Web.UI.Page
{
    #region Global Variables
    #endregion
    protected void Page_Load(object sender, 
EventArgs e)
    {
        if (!IsPostBack)
            FreezeGridviewHeader(GridView1, _tb, 
PanelContainer);
    }
    #region GridView1 Functions
    protected void GridView1_RowDataBound(object 
sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType ==  
DataControlRowType.DataRow)
            if (e.Row.RowIndex == 1)
                FreezeGridviewHeader
(GridView1,_tb,PanelContainer);
    }
    protected void GridView1_RowCreated(object 
sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == 
DataControlRowType.Header)
            AddSortDirectionImage(GridView1, 
e.Row);
    }
    #endregion
    #region GridView1 Functions
      protected void GridView2_RowDataBound(object 
sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == 
DataControlRowType.DataRow)
            if (e.Row.RowIndex == 1)
                FreezeGridviewHeader(GridView2, 
_tb2, PanelContainer2);
    }  
    protected void GridView2_RowCreated(object 
sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == 
DataControlRowType.Header)
            AddSortDirectionImage(GridView2, 
e.Row);
    }    
    #endregion
    /// <summary>
    ///  Author: Antonio Suarez
    ///   Email: Antonio.Suarez@GrupoKino.com
    ///Web Page: http://www.grupoKino.com    
    /// [Español]Funcion que copia el header de un 
gridview a un control tipo Table 
    /// [English]Function that copy a gridview 
header to a table control.
    /// </summary>
    /// <param name="_gv1">
    /// [Español]Gridview del cual se copiara el 
encabezado.
    /// [English]GridView from where the header 
row will be copied
    /// </param>
    /// <param name="_tb1">
    /// [Español]Renglon del gridview al cual se 
le agrega la imagen 
    /// [English]Row of gridview to add sort image
    /// </param>
    /// <param name="_pc1">
    /// [Español]Panel que contendra tanto al 
gridview como al control table
    /// [English]Panel container of the gridview 
and table control.   
    /// </param>     
    protected void FreezeGridviewHeader(GridView 
_gv1, Table _tb1,Panel _pc1)
    {
        Page.EnableViewState = false;
        //[Español]Copiando las propiedades del 
renglon de encabezado
        //[English]Coping a header row data and 
properties    
        _tb1.Rows.Add(_gv1.HeaderRow);
        _tb1.Rows[0].ControlStyle.CopyFrom
(_gv1.HeaderStyle);
        _tb1.CellPadding = _gv1.CellPadding;
        _tb1.CellSpacing = _gv1.CellSpacing;
        _tb1.BorderWidth = _gv1.BorderWidth;
        //if (!_gv1.Width.IsEmpty)
        //_gv1.Width = Unit.Pixel(Convert.ToInt32
(_gv1.Width.Value) + Convert.ToInt32
(_tb1.Width.Value) + 13);
        //[Español]Copiando las propiedades de 
cada celda del nuevo encabezado.
        //[English]Coping  each cells properties 
to the new header cells properties
        int Count = 0;
        _pc1.Width = Unit.Pixel(100);
        for (Count = 0; Count < 
_gv1.HeaderRow.Cells.Count - 1; Count++)
        {
            _tb1.Rows[0].Cells[Count].Width = 
_gv1.Columns[Count].ItemStyle.Width;
            _tb1.Rows[0].Cells[Count].BorderWidth 
= _gv1.Columns[Count].HeaderStyle.BorderWidth;
            _tb1.Rows[0].Cells[Count].BorderStyle 
= _gv1.Columns[Count].HeaderStyle.BorderStyle;
            _pc1.Width = Unit.Pixel
(Convert.ToInt32(_tb1.Rows[0].Cells
[Count].Width.Value) + Convert.ToInt32
(_pc1.Width.Value) + 14);
        }
        //Panel1.Width = Unit.Pixel
(Convert.ToInt32(_tb1.Rows[0].Cells[Count-
1].Width.Value) + 12);
    }
    /// <summary>
    ///  Author: Antonio Suarez
    ///   Email: Antonio.Suarez@GrupoKino.com
    ///Web Page: http://www.grupoKino.com    
    /// [Español]Funcion que agrega una imagen a 
la columna ordenada de un gridView 
    /// [English]Function that adds a image to the 
sorted column.
    /// </summary>
    /// <param name="gridviewID">
    /// [Español]Gridview al cual se le agregara 
la imagen 
    /// [English]GridView to add sort image
    /// </param>
    /// <param name="itemRow">
    /// [Español]Renglon del gridview al cual se 
le agrega la imagen 
    /// [English]Row of gridview to add sort image
    /// </param>
    public void AddSortDirectionImage(GridView 
gridviewID, GridViewRow itemRow)
    {
        if (gridviewID.AllowSorting == false)
            return;
        Image sortImage = new Image();
        Label space = new Label();
        sortImage.ImageUrl = 
(gridviewID.SortDirection == 
SortDirection.Ascending ? @"~/sort_asc.gif" : 
@"~/sort_desc.gif");
        sortImage.Visible = true;
        space.Text = " ";
        for (int i = 0; i < 
gridviewID.Columns.Count; i++)
        {
            string colExpr = gridviewID.Columns
[i].SortExpression;
            if (colExpr != "" && colExpr == 
gridviewID.SortExpression)
            {
                itemRow.Cells[i].Controls.Add
(space);
                itemRow.Cells[i].Controls.Add
(sortImage);
            }
        }
    }
}
 add to .gif file(sort_desc.gif and sort_Asc .gif) 
No comments:
Post a Comment