/// <summary>
        /// Serializes the grid view search panel state.
        /// </summary>
        /// <param name="controlState">The control state.</param>
        /// <returns></returns>
        private static string SerializeGridViewSearchPanelState( GridViewSearchPanelState controlState)
        {
            string serializedString = string.Empty;

            using ( StringWriter stringWriter = new StringWriter() )
            {
                XmlSerializer serializer = new XmlSerializer( typeof( GridViewSearchPanelState ) );
                serializer.Serialize( stringWriter, controlState );
                serializedString = stringWriter.ToString();
            }

            return serializedString;
        }
        /// <summary>
        /// Handles the state of the GridViewSearchPanel
        /// </summary>
        /// <param name="searchPanel">The search panel.</param>
        /// <param name="gridView">The grid view.</param>
        /// <param name="persistenceMethod">The persistence method</param>
        /// <param name="persistentCookieExpiryDateTime">The date and time the persistent cookie expires</param>
        public static void HandleGridViewSearchPanelState( GridViewSearchPanel searchPanel, GridView gridView, 
															PersistenceMethod persistenceMethod, DateTime? persistentCookieExpiryDateTime )
        {
            if ( gridView == null )
            {
                // try and find the GridView control if it hasn't been explicitly supplied
                gridView = FindControl( searchPanel.NamingContainer, searchPanel.GridViewControlID ) as GridView;
            }

            if ( gridView != null )
            {
                // restore any previously saved state
                gridView.Page.Load += new EventHandler(
                    delegate( object sender, EventArgs e )
                    {
                        if ( !gridView.Page.IsPostBack )
                        {
                            GridViewSearchPanelState controlState = GetGridViewSearchPanelState( GetUniqueGridViewName( gridView ), persistenceMethod );
                            if ( controlState != null )
                            {
                                controlState.RestoreState( ref gridView, ref searchPanel );
                            }
                        }
                    }
                );

                // save state on row command, and rebind searchPanel
                gridView.RowCommand += new GridViewCommandEventHandler(
                    delegate(object sender, GridViewCommandEventArgs e)
                    {
                        GridViewSearchPanelState controlState = new GridViewSearchPanelState(gridView, searchPanel);
                        SaveGridViewSearchPanelState(controlState, GetUniqueGridViewName(gridView),
                                                        persistenceMethod, persistentCookieExpiryDateTime);
                        searchPanel.DataBind();
                    }
                );

                // save state when page index changes
                gridView.PageIndexChanged += new EventHandler(
                    delegate( object sender, EventArgs e )
                    {
                        GridViewSearchPanelState controlState = new GridViewSearchPanelState( gridView, searchPanel );
                        SaveGridViewSearchPanelState( controlState, GetUniqueGridViewName( gridView ),
                                                        persistenceMethod, persistentCookieExpiryDateTime );
                    }
                );

                // save state when grid is sorted
                gridView.Sorted += new EventHandler(
                    delegate( object sender, EventArgs e )
                    {
                        GridViewSearchPanelState controlState = new GridViewSearchPanelState( gridView, searchPanel );
                        SaveGridViewSearchPanelState( controlState, GetUniqueGridViewName( gridView ),
                                                        persistenceMethod, persistentCookieExpiryDateTime );

                    }
                );

                if (gridView is EntityGridView)
                {
                    // save state when grid's page size changed
                    ((EntityGridView)gridView).PageSizeChanged += new EventHandler(
                        delegate(object sender, EventArgs e)
                        {
                            GridViewSearchPanelState controlState = new GridViewSearchPanelState(gridView, searchPanel);
                            SaveGridViewSearchPanelState(controlState, GetUniqueGridViewName(gridView),
                                                            persistenceMethod, persistentCookieExpiryDateTime);
                        }
                    );
                }
                // save state when search id done
                searchPanel.SearchButtonClicked += new EventHandler(
                    delegate( object sender, EventArgs e )
                    {
                        GridViewSearchPanelState controlState = new GridViewSearchPanelState( gridView, searchPanel );
                        SaveGridViewSearchPanelState( controlState, GetUniqueGridViewName( gridView ),
                                                        persistenceMethod, persistentCookieExpiryDateTime );
                    }
                );

                // save state when reset is done
                searchPanel.ResetButtonClicked += new EventHandler(
                    delegate( object sender, EventArgs e )
                    {
                        GridViewSearchPanelState controlState = new GridViewSearchPanelState( gridView, searchPanel );
                        SaveGridViewSearchPanelState(controlState, GetUniqueGridViewName(gridView),
                                persistenceMethod, persistentCookieExpiryDateTime);
                    }
                );
            }
        }
        /// <summary>
        /// Saves the GridViewSearchPanel State.
        /// </summary>
        /// <param name="controlState">State of the control.</param>
        /// <param name="controlStateName">Name of the control state.</param>
        /// <param name="persistenceMethod">The persistent method.</param>
        /// <param name="persistentCookieExpiryDateTime">The persistent cookie expiry datetime.</param>
        public static void SaveGridViewSearchPanelState( GridViewSearchPanelState controlState, string controlStateName, 
															PersistenceMethod persistenceMethod, DateTime? persistentCookieExpiryDateTime )
        {
            switch ( persistenceMethod )
            {
                case PersistenceMethod.Session :
                    #region Uses Session state
                    HttpContext.Current.Session[ controlStateName ] = controlState;
                    #endregion
                    break;
                case PersistenceMethod.Cookie :
                case PersistenceMethod.PersistentCookie :
                    #region Uses a client cookie
                    string serializedString = SerializeGridViewSearchPanelState( controlState );
                    HttpCookie cookie = new HttpCookie( controlStateName, HttpContext.Current.Server.UrlEncode( serializedString ) );
                    // Determine if this should be persisted longer than just the current session
                    if ( persistentCookieExpiryDateTime != null )
                    {
                        cookie.Expires = persistentCookieExpiryDateTime.Value;
                    }
                    HttpContext.Current.Response.Cookies.Add( cookie );

                    #endregion
                    break;
            }
        }