/// <summary>
        /// Handles the state of the GridViewSearchPanel
        /// </summary>
        /// <param name="searchPanel">The search panel.</param>
        /// <param name="persistenceMethod">The persistence method.</param>
        public static void HandleGridViewSearchPanelState( GridViewSearchPanel searchPanel, PersistenceMethod persistenceMethod )
        {
			HandleGridViewSearchPanelState( searchPanel, null, persistenceMethod, null );
		}
        /// <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>
        /// Handles the state of the GridViewSearchPanel
        /// </summary>
        /// <param name="searchPanel">The search panel.</param>
        /// <param name="persistentCookieExpiryDateTime">The date and time the persistent cookie expires.</param>
        public static void HandleGridViewSearchPanelState( GridViewSearchPanel searchPanel, DateTime persistentCookieExpiryDateTime )
        {
			HandleGridViewSearchPanelState( searchPanel, null, PersistenceMethod.PersistentCookie, persistentCookieExpiryDateTime );
		}
        /// <summary>
        /// Handles the state of the GridViewSearchPanel
        /// </summary>
        /// <param name="searchPanel">The search panel.</param>
        public static void HandleGridViewSearchPanelState( GridViewSearchPanel searchPanel )
        {
			HandleGridViewSearchPanelState( searchPanel, PersistenceMethod.Session );
		}
        /// <summary>
        /// Restores the state of the grid view and grid view search panel.
        /// </summary>
        /// <param name="gridView">The grid view.</param>
        /// <param name="searchPanel">The search panel.</param>
        public void RestoreState( ref GridView gridView, ref GridViewSearchPanel searchPanel )
        {
            gridView.PageIndex = this.PageIndex;
            gridView.PageSize = this.PageSize;  

            searchPanel.SearchFieldName = this.SearchFieldName;
            searchPanel.SearchKeyword = this.SearchKeyword;
            searchPanel.SearchOperator = this.SearchOperator;
            searchPanel.Filter = this.Filter;

            if (!string.IsNullOrEmpty(this.SortExpression))
            {
                gridView.Sort(this.SortExpression, this.SortDirection);
            }
        }
        /// <summary>
		/// Saves the state of the grid view and grid view search panel.
		/// </summary>
		/// <param name="gridView">The grid view.</param>
		/// <param name="searchPanel">The search panel.</param>
		public void SaveState( GridView gridView, GridViewSearchPanel searchPanel )
		{
			// Grid view values
			this.PageIndex = gridView.PageIndex;
			this.PageSize = gridView.PageSize;
			this.SortExpression = gridView.SortExpression;
			this.SortDirection = gridView.SortDirection;
	
		    this.SearchFieldName = searchPanel.SearchFieldName;
			this.SearchOperator = searchPanel.SearchOperator;
			this.SearchKeyword = searchPanel.SearchKeyword;
            this.Filter = searchPanel.Filter;
            searchPanel.DataBind();
		}
 /// <summary>
 /// Initializes a new instance of the <see cref="T:GridViewSearchPanelState"/> class.
 /// </summary>
 /// <param name="gridView">The grid view.</param>
 /// <param name="searchPanel">The search panel.</param>
 public GridViewSearchPanelState( GridView gridView, GridViewSearchPanel searchPanel )
 {
     SaveState( gridView, searchPanel );
 }