PagedControl.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / MIT / System / Web / UI / MobileControls / PagedControl.cs / 1305376 / PagedControl.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

using System; 
using System.Collections; 
using System.ComponentModel;
using System.Web; 
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Diagnostics;
using System.Security.Permissions; 

namespace System.Web.UI.MobileControls 
{ 
    /*
     * Paged control. Abstract control class inherited by all classes 
     * that are internally paginated.
     *
     * Copyright (c) 2000 Microsoft Corporation
     */ 

    ///  
    [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] 
    [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]
    [Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")] 
    public abstract class PagedControl : MobileControl
    {
        private static readonly Object EventLoadItems = new Object();
        private const String _itemCountViewStateKey = "_!PagedControlItemCount"; 
        private bool _pagingCharacteristicsChanged = false;
        int _lastItemIndexLoaded = -1; 
        int _lastItemCountLoaded = -1; 
        Pair _stateLoadItemsArgs = null;
 
        /// 
        [
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.PagedControl_OnLoadItems) 
        ]
        public event LoadItemsEventHandler LoadItems 
        { 
            add
            { 
                Events.AddHandler(EventLoadItems, value);
            }
            remove
            { 
                Events.RemoveHandler(EventLoadItems, value);
            } 
        } 

        private void OnLoadItems() 
        {
            int index, count;

            if (_itemPager != null) 
            {
                index = PagerItemIndex; 
                count = PagerItemCount; 
            }
            else 
            {
                index = 0;
                count = ItemCount;
            } 

            OnLoadItems(new LoadItemsEventArgs(index, count)); 
        } 

        ///  
        protected virtual void OnLoadItems(LoadItemsEventArgs e)
        {
            if (LoadItemsHandler != null)
            { 
                _lastItemIndexLoaded = e.ItemIndex;
                _lastItemCountLoaded = e.ItemCount; 
                LoadItemsHandler(this, e); 
            }
        } 

        private bool IsCustomPaging
        {
            get 
            {
                return ItemCount > 0; 
            } 
        }
 
        private LoadItemsEventHandler LoadItemsHandler
        {
            get
            { 
                return (LoadItemsEventHandler)Events[EventLoadItems];
            } 
        } 

        ///  
        protected abstract int InternalItemCount { get; }


        ///  
        [
            Bindable(true), 
            DefaultValue(0), 
            MobileCategory(SR.Category_Paging),
            MobileSysDescription(SR.PagedControl_ItemCount) 
        ]
        public int ItemCount
        {
            get 
            {
                Object count = ViewState[_itemCountViewStateKey]; 
                return  count == null ? 0 : (int) count; 
            }
            set 
            {
                if (value < 0)
                {
                    throw new ArgumentOutOfRangeException("ItemCount", 
                        SR.GetString(SR.PagedControl_ItemCountCantBeNegative,
                                     value)); 
                } 
                bool changed = (ItemCount != value);
                ViewState[_itemCountViewStateKey] = value; 
                if (changed)
                {
                    InternalItemCountChangedHandler(value);
                } 
                ConditionalLoadItemsFromPersistedArgs();
            } 
        } 

        // Allows special handling of set_ItemCount in derived class, 
        // while maintaining API backward compatibility.
        internal virtual void InternalItemCountChangedHandler(int newItemCount)
        {}
 
        /// 
        [ 
            Bindable(true), 
            DefaultValue(0),
            MobileCategory(SR.Category_Paging), 
            MobileSysDescription(SR.PagedControl_ItemsPerPage)
        ]
        public int ItemsPerPage
        { 
            get
            { 
                object o = ViewState["ItemsPerPage"]; 
                return (o != null) ? (int)o : 0;
            } 
            set
            {
                if (value < 0)
                { 
                    throw new ArgumentOutOfRangeException("ItemsPerPage",
                        SR.GetString(SR.PagedControl_ItemsPerPageCantBeNegative, 
                                     value)); 
                }
                ViewState["ItemsPerPage"] = value; 
            }
        }

        ///  
        protected virtual int ItemWeight
        { 
            get 
            {
                return ControlPager.DefaultWeight; 
            }
        }

        ///  
        [
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 
        ]
        public int FirstVisibleItemIndex 
        {
            get
            {
                return (IsCustomPaging || !EnablePagination) ? 0 : PagerItemIndex; 
            }
        } 
 
        /// 
        [ 
            Browsable(false),
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]
        public int VisibleItemCount 
        {
            get 
            { 
                return (IsCustomPaging || !EnablePagination) ? InternalItemCount : PagerItemCount;
            } 
        }

        /// 
        public override int VisibleWeight 
        {
            get 
            { 
                // Paged control should count the weight as sum of its items
                int count = VisibleItemCount; 
                if (count == -1)
                {
                    return 0;  // -1 means control not on the current page
                } 
                else
                { 
                    return count * GetItemWeight(); 
                }
            } 
        }

        private ItemPager _itemPager;
        ///  
        public override void PaginateRecursive(ControlPager pager)
        { 
            int itemCount = IsCustomPaging ? ItemCount : InternalItemCount; 
            int itemsPerPage = ItemsPerPage;
            _itemPager = pager.GetItemPager(this, itemCount, itemsPerPage, GetItemWeight()); 
        }

        internal int GetItemWeight()
        { 
            int weight = Adapter.ItemWeight;
            if (weight == ControlPager.UseDefaultWeight) 
            { 
                weight = ItemWeight;
            } 
            return weight;
        }

        private int PagerItemIndex 
        {
            get 
            { 
                return (_itemPager == null) ? 0 : _itemPager.ItemIndex;
            } 
        }

        private int PagerItemCount
        { 
            get
            { 
                return (_itemPager == null) ? InternalItemCount : _itemPager.ItemCount; 
            }
        } 

        /// 
        protected override void OnPageChange(int oldPageIndex, int newPageIndex)
        { 
            _pagingCharacteristicsChanged = true;
        } 
 
        /// 
        protected override void OnPreRender(EventArgs e) 
        {
            if (IsCustomPaging &&
                IsVisibleOnPage(Form.CurrentPage) &&
                    (!Page.IsPostBack || 
                    Form.PaginationStateChanged ||
                    _pagingCharacteristicsChanged || 
                    !IsViewStateEnabled())) 
            {
                OnLoadItems(); 
            }

            base.OnPreRender(e);
        } 

        internal override void SetControlPage(int page) 
        { 
            // Custom pagination being turned off.
 
            _itemPager = null;
            _pagingCharacteristicsChanged = true;
            base.SetControlPage(page);
        } 

        private new bool IsViewStateEnabled() 
        { 
            for (Control ctl = this; ctl != null; ctl = ctl.Parent)
            { 
                if (!ctl.EnableViewState)
                {
                    return false;
                } 
            }
            return true; 
        } 

        ///  
        protected override Object SavePrivateViewState()
        {
            // If the base state is non-null, we always return a Pair with the base state as the
            // first item. 
            Object baseState = base.SavePrivateViewState();
            if (IsCustomPaging && IsTemplated && !IsViewStateEnabled() && _lastItemCountLoaded != -1) 
            { 
                return new Pair(baseState, new Pair(_lastItemIndexLoaded, _lastItemCountLoaded));
            } 

            if (baseState != null)
            {
                return new Pair(baseState, null); 
            }
 
            // baseState is null 
            return null;
        } 

        /// 
        protected override void LoadPrivateViewState(Object state)
        { 
            Debug.Assert (state == null || state.GetType() == typeof(Pair),
               "If the base state is non-null, private viewstate should always be saved as a pair"); 
 
            Pair statePair = state as Pair;
            if (statePair != null) 
            {
                base.LoadPrivateViewState(statePair.First);
                _stateLoadItemsArgs = statePair.Second as Pair;
                ConditionalLoadItemsFromPersistedArgs(); 
            }
        } 
 
        // Loads items using view state pair in templated case where custom paging
        // on, view state off.  In this special case, load items early as 
        // possible to enable events to be raised.
        private void ConditionalLoadItemsFromPersistedArgs()
        {
            if (_stateLoadItemsArgs != null && IsCustomPaging && IsTemplated && !IsViewStateEnabled()) 
            {
                OnLoadItems( 
                    new LoadItemsEventArgs((int) _stateLoadItemsArgs.First, (int) _stateLoadItemsArgs.Second)); 
                _stateLoadItemsArgs = null;
            } 
        }
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK