ObjectList.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

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

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

using System; 
using System.Collections; 
using System.ComponentModel;
using System.Data; 
using System.Diagnostics;
using System.Drawing.Design;
using System.Globalization;
using System.Web; 
using System.Web.UI;
using System.Web.UI.WebControls; 
using System.Web.UI.HtmlControls; 
using System.Security.Permissions;
 
namespace System.Web.UI.MobileControls
{
    /*
     * Object List class. 
     *
     * Copyright (c) 2000 Microsoft Corporation 
     */ 
    /// 
    [ 
        ControlBuilderAttribute(typeof(ObjectListControlBuilder)),
        DefaultEvent("ItemCommand"),
        DefaultProperty("DataSource"),
        Designer(typeof(System.Web.UI.Design.MobileControls.ObjectListDesigner)), 
        DesignerAdapter(typeof(System.Web.UI.Design.MobileControls.Adapters.DesignerObjectListAdapter)),
        Editor(typeof(System.Web.UI.Design.MobileControls.ObjectListComponentEditor), typeof(ComponentEditor)), 
        ToolboxData("<{0}:ObjectList runat=\"server\" LabelStyle-StyleReference=\"title\" CommandStyle-StyleReference=\"subcommand\">"), 
        ToolboxItem("System.Web.UI.Design.WebControlToolboxItem, " + AssemblyRef.SystemDesign)
    ] 
    [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 class ObjectList : PagedControl, INamingContainer, ITemplateable, IPostBackEventHandler 
    {
        private static readonly Object EventItemDataBind = new Object(); 
        private static readonly Object EventItemCommand = new Object(); 
        private static readonly Object EventItemSelect = new Object();
        private static readonly Object EventShowItemCommands = new Object(); 

        private Object _dataSource;
        private IEnumerable _resolvedDataSource;
        private ObjectListFieldCollection _fields; 
        private ObjectListFieldCollection _autoGeneratedFields;
        private ObjectListFieldCollection _allFields; 
        private ObjectListItemCollection _items; 
        private ObjectListCommandCollection _commands;
        private ObjectListCommandCollection _globalCommands; 
        private int _labelFieldIndex = -1;
        private int[] _tableFieldIndices = null;
        private IEnumerator _storedEnumerator = null;
        private Object _firstDataItem = null; 
        private bool _storedDataValid = false;
        private ObjectListViewMode _viewMode = ObjectListViewMode.List; 
        private bool _ignoreFieldsItemsViewModeViewState = false; 
        private Style _commandStyle = null;
        private Style _labelStyle = null; 
        private const string _itemCountViewStateKey = "_!ItemCount";
        private int _selectedIndex = -1;
        private bool _selectedIndexDirty = false;
        private bool _loadingItems = false; 

        ///  
        public static String SelectMoreCommand 
        {
            get 
            {
                return "More";
            }
        } 

        ///  
        [ 
            Bindable(true),
            DefaultValue(null), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
            MobileCategory(SR.Category_Data),
            MobileSysDescription(SR.ObjectList_DataSource)
        ] 
        public virtual Object DataSource
        { 
            get 
            {
                return _dataSource; 
            }
            set
            {
                _dataSource = value; 
                // _allFields and _resolvedDataSource need to be recalculated.
                _allFields = null; 
                _resolvedDataSource = null; 
            }
        } 

        /// 
        [
            Bindable(false), 
            DefaultValue(""),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.List_DataMember), 
            TypeConverter(typeof(System.Web.UI.Design.MobileControls.Converters.DataMemberConverter))
        ] 
        public virtual String DataMember
        {
            get
            { 
                String s = (String)ViewState["DataMember"];
                return s == null ? String.Empty : s; 
            } 
            set
            { 
                ViewState["DataMember"] = value;
            }
        }
 
        /// 
        [ 
            Bindable(false), 
            DefaultValue(null),
            Editor(typeof(System.Web.UI.Design.MobileControls.FieldCollectionEditor), typeof(UITypeEditor)), 
            MergableProperty(false),
            MobileCategory(SR.Category_Data),
            MobileSysDescription(SR.ObjectList_Fields),
            PersistenceMode(PersistenceMode.InnerDefaultProperty) 
        ]
        public virtual ObjectListFieldCollection Fields 
        { 
            get
            { 
                if (_fields == null)
                {
                    _fields = new ObjectListFieldCollection(this);
                    if (IsTrackingViewState) 
                    {
                        ((IStateManager)_fields).TrackViewState(); 
                    } 
                }
                return _fields; 
            }
        }

        ///  
        [
            Bindable(true), 
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public virtual ObjectListItemCollection Items
        {
            get
            { 
                if (_items == null)
                { 
                    _items = new ObjectListItemCollection(this); 
                    if (IsTrackingViewState)
                    { 
                        ((IStateManager)_items).TrackViewState();
                    }
                }
                return _items; 
            }
        } 
 
        /// 
        [ 
            Bindable(false),
            Editor(typeof(System.Web.UI.Design.MobileControls.CommandCollectionEditor), typeof(UITypeEditor)),
            MergableProperty(false),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.ObjectList_Commands),
            PersistenceMode(PersistenceMode.InnerDefaultProperty) 
        ] 
        public virtual ObjectListCommandCollection Commands
        { 
            get
            {
                if (_commands == null)
                { 
                    _commands = new ObjectListCommandCollection();
                    if (IsTrackingViewState) 
                    { 
                        ((IStateManager)_commands).TrackViewState();
                    } 
                }
                return _commands;
            }
        } 

        ///  
        [ 
            DefaultValue(""),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.ObjectList_LabelField),
            TypeConverter(typeof(System.Web.UI.Design.MobileControls.Converters.DataFieldConverter))
        ]
        public String LabelField 
        {
            get 
            { 
                String s = (String)ViewState["LabelField"];
                return (s != null) ? s : String.Empty; 
            }
            set
            {
                ViewState["LabelField"] = value; 
                InvalidateDisplayFieldIndices();
            } 
        } 

        ///  
        [
            Bindable(true),
            DefaultValue(""),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.ObjectList_DefaultCommand),
            TypeConverter(typeof(System.Web.UI.Design.MobileControls.Converters.DefaultCommandConverter)) 
        ] 
        public String DefaultCommand
        { 
            get
            {
                String s = (String)ViewState["DefaultCommand"];
                return (s != null) ? s : String.Empty; 
            }
            set 
            { 
                ViewState["DefaultCommand"] = value;
            } 
        }

        /// 
        [ 
            Bindable(true),
            DefaultValue(""), 
            Editor(typeof(System.Web.UI.Design.MobileControls.TableFieldsEditor), 
                typeof(UITypeEditor)),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.ObjectList_TableFields)
        ]
        public String TableFields
        { 
            get
            { 
                String s = (String)ViewState["TableFields"]; 
                return (s != null) ? s : String.Empty;
            } 
            set
            {
                ViewState["TableFields"] = value;
                InvalidateDisplayFieldIndices(); 
            }
        } 
 
        /// 
        [ 
            Bindable(false),
            Browsable(false),
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public int SelectedIndex
        { 
            get 
            {
                return _selectedIndex; 
            }
            set
            {
                if (value == -1 && ViewMode != ObjectListViewMode.List) 
                {
                    throw new Exception( 
                        SR.GetString(SR.ObjectList_MustBeInListModeToClearSelectedIndex)); 
                }
                int itemCount = ItemCount > 0 ? ItemCount : Items.Count; 
                if (value < -1)
                {
                    throw new ArgumentOutOfRangeException("SelectedIndex",
                        SR.GetString(SR.ObjectList_SelectedIndexTooSmall, value)); 
                }
                else if (itemCount > 0 && value >= itemCount) 
                { 
                    throw new ArgumentOutOfRangeException("SelectedIndex",
                        SR.GetString(SR.ObjectList_SelectedIndexTooBig, value, itemCount)); 
                }
                // End of guard clauses.

                _selectedIndexDirty = (value != _selectedIndex) && IsTrackingViewState; 
                DeselectItemIfLoaded(_selectedIndex);
                SelectItemIfLoaded(value); 
                _selectedIndex = value; 
            }
        } 

        /// 
        [
            Bindable(false), 
            Browsable(false),
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 
        ] 
        public ObjectListItem Selection
        { 
            get
            {
                if (SelectedIndex == -1)
                { 
                    return null;
                } 
                EnsureItemLoaded (SelectedIndex); 
                int selectedIndex = TranslateVirtualItemIndex(SelectedIndex);
                if (selectedIndex >= 0 && selectedIndex < Items.Count) 
                {
                    Debug.Assert (Items[selectedIndex].Selected);
                    return Items[selectedIndex];
                } 
                else
                { 
                    return null; 
                }
            } 
        }

        /// 
        [ 
            Bindable(false),
            Browsable(true), 
            DefaultValue(true), 
            MobileCategory(SR.Category_Behavior),
            MobileSysDescription(SR.ObjectList_AutoGenerateFields) 
        ]
        public bool AutoGenerateFields
        {
            get 
            {
                Object b = ViewState["AutoGenerateFields"]; 
                return (b != null) ? (bool)b : true; 
            }
            set 
            {
                if (value != AutoGenerateFields)
                {
                    ViewState["AutoGenerateFields"] = value; 
                    _allFields = null;
                    _autoGeneratedFields = null; 
                    _items = null; 
                    InvalidateDisplayFieldIndices();
                } 
            }
        }

        ///  
        [
            Bindable(false), 
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public IObjectListFieldCollection AllFields
        {
            get
            { 
                if (_allFields == null)
                { 
                    if (_autoGeneratedFields == null) 
                    {
                        if (_fields == null) 
                        {
                            return null;
                        }
                        else 
                        {
                            _allFields = _fields; 
                        } 
                    }
                    else 
                    {
                        if (_fields == null)
                        {
                            _allFields = _autoGeneratedFields; 
                        }
                        else 
                        { 
                            int count = _fields.Count + _autoGeneratedFields.Count;
 
                            ArrayList list = new ArrayList(count);

                            foreach (ObjectListField field in _fields)
                            { 
                                list.Add(field);
                            } 
 
                            foreach (ObjectListField field in _autoGeneratedFields)
                            { 
                                list.Add(field);
                            }

                            _allFields = new ObjectListFieldCollection(this, list); 
                        }
                    } 
                } 
                return _allFields;
            } 
        }

        /// 
        [ 
            Bindable(false),
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) 
        ]
        public int LabelFieldIndex 
        {
            get
            {
                if (_labelFieldIndex == -1) 
                {
                    CalculateDisplayFieldIndices(); 
                } 
                return _labelFieldIndex;
            } 
        }

        /// 
        [ 
            Bindable(false),
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) 
        ]
        public Panel Details 
        {
            get
            {
                EnsureChildControls(); 
                if (ViewMode != ObjectListViewMode.Details)
                { 
                    throw new Exception(SR.GetString(SR.ObjectList_MustBeInDetailsModeToGetDetails)); 
                }
                return Selection; 
            }
        }

        ///  
        [
            Bindable(false), 
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ] 
        public int[] TableFieldIndices
        {
            get
            { 
                if (_labelFieldIndex == -1)
                { 
                    CalculateDisplayFieldIndices(); 
                }
                Debug.Assert(_tableFieldIndices != null, "_tableFieldIndices is null."); 
                return _tableFieldIndices;
            }
        }
 
        /// 
        public override void EnsureTemplatedUI() 
        { 
            EnsureChildControls();
        } 

        /// 
        protected override void EnsureChildControls()
        { 
            // if EnsureChildControls is called before items are created (e.g., at
            // LoadPrivateViewState), there will be no controls.  Need to build child 
            // controls in this case, so we set ChildControlsCreated to false. 
            ChildControlsCreated = ChildControlsCreated && Controls.Count > 0;
            base.EnsureChildControls(); 
        }

        private void CalculateDisplayFieldIndices()
        { 
            String labelField = LabelField;
            if (labelField.Length > 0) 
            { 
                _labelFieldIndex = GetFieldIndex(labelField);
            } 
            else
            {
                _labelFieldIndex = 0;
            } 

            String tableFields = TableFields; 
            int length = tableFields.Length; 

            // Populate the _tableFieldIndices array. 
            ArrayList tableFieldIndexList = new ArrayList();
            for (int pos = 0; pos < length; )
            {
                int nextSemicolon = tableFields.IndexOf(';', pos); 
                String fieldName = (nextSemicolon == -1) ?
                    tableFields.Substring(pos) : 
                    tableFields.Substring(pos, nextSemicolon - pos); 
                tableFieldIndexList.Add(GetFieldIndex(fieldName));
                pos = nextSemicolon == -1 ? length : nextSemicolon + 1; 
            }
            _tableFieldIndices = (int[])tableFieldIndexList.ToArray(typeof(int));
        }
 
        internal void InvalidateDisplayFieldIndices()
        { 
            _labelFieldIndex = -1; 
            _tableFieldIndices = null;
        } 

        private int GetFieldIndex(String field)
        {
            int index = AllFields.IndexOf(field); 
            if (index == -1)
            { 
                throw new ArgumentException(SR.GetString( 
                                        SR.ObjectList_FieldNotFound, field));
            } 
            return index;
        }

        ///  
        protected override void AddParsedSubObject(Object obj)
        { 
            if (!(obj is LiteralControl)) 
            {
                if (obj is ObjectListField) 
                {
                    Fields.Add((ObjectListField)obj);
                }
                else if (obj is ObjectListCommand) 
                {
                    Commands.Add((ObjectListCommand)obj); 
                } 
                else
                { 
                    base.AddParsedSubObject(obj);
                }
            }
        } 

        private IEnumerable ResolvedDataSource 
        { 
            get
            { 
                if (_resolvedDataSource == null)
                {
                    _resolvedDataSource =
                        DataSourceHelper.GetResolvedDataSource(DataSource, DataMember); 
                }
                return _resolvedDataSource; 
            } 
        }
 
        /// 
        protected override void CreateChildControls()
        {
            Controls.Clear(); 
            if (ViewState[_itemCountViewStateKey] != null)
            { 
                CreateChildControls(false); 
            }
        } 

        private void CreateChildControls(bool doDataBind)
        {
            if (IsTemplated) 
            {
                Controls.Clear(); 
                CreateTemplatedUI(doDataBind); 
                ChildControlsCreated = true;
            } 
        }

        /// 
        public override void DataBind() 
        {
            // Do our own databinding 
            OnDataBinding(EventArgs.Empty); 

            // Contained items will be databound after they have been created, 
            // so we don't want to walk the hierarchy here.
        }

        ///  
        protected override void OnDataBinding(EventArgs e)
        { 
            base.OnDataBinding(e); 

            if (ResolvedDataSource == null) 
            {
                ClearItemsAndControls();
                return;
            } 

            if (AutoGenerateFields) 
            { 
                CreateAutoGeneratedFields(ResolvedDataSource);
            } 

            if ((AllFields == null || AllFields.Count == 0)
                && MobilePage != null
                && !MobilePage.DesignMode) 
            {
                throw new Exception( 
                    SR.GetString(SR.ObjectList_MustHaveOneOrMoreFields)); 
            }
 
            CreateItems(ResolvedDataSource);

            if (!_loadingItems)
            { 
                // To clear the selected index, the ViewMode must be list.
                ViewMode = ObjectListViewMode.List; 
                SelectedIndex = -1; 
            }
            else 
            {
                SelectItemIfLoaded(SelectedIndex);
            }
 
            CreateChildControls(true);
        } 
 
        /// 
        public void CreateTemplatedItemsList(bool doDataBind) 
        {
            ObjectListItemCollection items = Items;

            ITemplate headerTemplate = GetTemplate(Constants.HeaderTemplateTag); 
            ITemplate footerTemplate = GetTemplate(Constants.FooterTemplateTag);
            ITemplate itemTemplate = GetTemplate(Constants.ItemTemplateTag); 
            ITemplate separatorTemplate = GetTemplate(Constants.SeparatorTemplateTag); 
            ITemplate alternatingItemTemplate = GetTemplate(Constants.AlternatingItemTemplateTag);
            if (alternatingItemTemplate == null) 
            {
                alternatingItemTemplate = itemTemplate;
            }
 
            CreateControlItem(MobileListItemType.HeaderItem, headerTemplate, doDataBind);
            for (int i = 0; i < items.Count; i++) 
            { 
                if (i > 0)
                { 
                    CreateControlItem(MobileListItemType.SeparatorItem,
                                      separatorTemplate,
                                      doDataBind);
                } 
                AddItemAsControl(i, items[i],
                                   ((i & 1) == 1) ? alternatingItemTemplate : itemTemplate, 
                                   doDataBind); 
            }
            CreateControlItem(MobileListItemType.FooterItem, footerTemplate, doDataBind); 
        }

        private void AddItemAsControl(
            int itemIndex, 
            MobileListItem item,
            ITemplate itemTemplate, 
            bool doDataBind) 
        {
            if (itemTemplate != null) 
            {
                // No need to do it again, since CreateItems already does it.
                item.Controls.Clear();
                item.ID = null; 
                Controls.Add(item);
                CheckedInstantiateTemplate (itemTemplate, item, this); 
                if (doDataBind) 
                {
                    item.DataBind(); 
                }
            }
        }
 
        private void CreateControlItem(
            MobileListItemType itemType, 
            ITemplate itemTemplate, 
            bool doDataBind)
        { 
            if (itemTemplate != null)
            {
                MobileListItem item = new MobileListItem(itemType);
                AddItemAsControl(-1, item, itemTemplate, doDataBind); 
            }
        } 
 
        /// 
        public void CreateTemplatedItemDetails(bool doDataBind) 
        {
            ITemplate detailsTemplate = GetTemplate(Constants.ItemDetailsTemplateTag);
            Selection.Controls.Clear();
 
            // Selection ID must be the same on each request.  AUI 8007.
            Selection.ID = "_ctl"; 
 
            if (detailsTemplate != null)
            { 
                if (!Controls.Contains (Selection))
                {
                    Controls.Add (Selection);
                } 
                CheckedInstantiateTemplate (detailsTemplate, Selection, this);
                if (doDataBind) 
                { 
                    Selection.DataBind();
                } 
            }
        }

        ///  
        protected virtual void CreateItems(IEnumerable dataSource)
        { 
            Debug.Assert (dataSource != null, "dataSource is null"); 

            Items.Clear(); 

            int count = 0;
            IEnumerator enumerator;
 
            if(_storedDataValid  && _firstDataItem != null)
            { 
                enumerator = _storedEnumerator; 
                ObjectListItem item = CreateItem(_firstDataItem);
                item.SetIndex(count + Items.BaseIndex); 
                Items.Add(item);
                count++;
                _storedDataValid = false;
                _firstDataItem = null; 
                _storedEnumerator = null;
            } 
            else 
            {
                enumerator = dataSource.GetEnumerator(); 
            }

            while(enumerator.MoveNext())
            { 
                Object dataItem = enumerator.Current;
                ObjectListItem item = CreateItem(dataItem); 
                item.SetIndex(count + Items.BaseIndex); 
                Items.Add(item);
                count++; 
            }
        }

        ///  
        protected virtual ObjectListItem CreateItem(Object dataItem)
        { 
            ObjectListItem item = new ObjectListItem(this, dataItem); 

            // Set fields. 

            IObjectListFieldCollection allFields = AllFields;
            int fieldIndex = 0;
            foreach (ObjectListField field in AllFields) 
            {
                field.DataBindItem(fieldIndex, item); 
                fieldIndex++; 
            }
 
            // Use delegated data binding, if specified.

            if (dataItem != null)
            { 
                OnItemDataBind(new ObjectListDataBindEventArgs(item, dataItem));
            } 
 
            return item;
        } 

        /// 
        protected override void OnPreRender(EventArgs e)
        { 
            base.OnPreRender(e);
 
            if (IsTemplated) 
            {
                int firstVisibleItem = FirstVisibleItemIndex; 
                int pageSize = VisibleItemCount;
                int lastVisibleItem = firstVisibleItem + pageSize - 1;
                int itemIndex = 0;
                int separatorIndex = 0; 
                foreach(Control ctl in Controls)
                { 
                    MobileListItem item = ctl as MobileListItem; 
                    if (item != null)
                    { 
                        if (item.ItemType == MobileListItemType.ListItem)
                        {
                            item.Visible = itemIndex >= firstVisibleItem && itemIndex <= lastVisibleItem;
                            itemIndex++; 
                        }
                        else if (item.ItemType == MobileListItemType.SeparatorItem) 
                        { 
                            item.Visible = separatorIndex >= firstVisibleItem &&
                                                separatorIndex < lastVisibleItem; 
                            separatorIndex++;
                        }
                    }
                } 
            }
        } 
 
        /////////////////////////////////////////////////////////////////////////
        //  FIELD AUTO-GENERATION 
        /////////////////////////////////////////////////////////////////////////

        /// 
        protected void CreateAutoGeneratedFields(IEnumerable dataSource) 
        {
            if (dataSource == null) 
            { 
                return;
            } 

            ArrayList list = new ArrayList();
            PropertyDescriptorCollection propertyDescriptors = null;
 
            if (dataSource is ITypedList)
            { 
                propertyDescriptors = 
                    ((ITypedList)dataSource).GetItemProperties(new PropertyDescriptor[0]);
            } 

            if (propertyDescriptors == null)
            {
                IEnumerator enumerator = dataSource.GetEnumerator(); 
                if (enumerator.MoveNext())
                { 
                    Object sampleItem = enumerator.Current; 
                    StoreEnumerator(enumerator, sampleItem);
                    if (IsBindableType(sampleItem.GetType())) 
                    {
                        list.Add(CreateAutoGeneratedField(
                                        SR.GetString(SR.ObjectList_ItemTitle),
                                        null)); 
                    }
                    else 
                    { 
                        propertyDescriptors = TypeDescriptor.GetProperties(sampleItem);
                    } 
                }
            }

            if (propertyDescriptors != null && propertyDescriptors.Count > 0) 
            {
                foreach (PropertyDescriptor pd in propertyDescriptors) 
                { 
                    if (IsBindableType(pd.PropertyType))
                    { 
                        String title;
                        ObjectListTitleAttribute attr =
                            (ObjectListTitleAttribute)pd.Attributes[typeof(ObjectListTitleAttribute)];
                        if (attr != null) 
                        {
                            title = attr.Title; 
                        } 
                        else
                        { 
                            title = pd.Name;
                        }
                        list.Add(CreateAutoGeneratedField(title, pd.Name));
                    } 
                }
            } 
 
            _autoGeneratedFields = new ObjectListFieldCollection(this, list);
        } 

        ///  Caches the fact that we have already consumed the first item from the enumeration
        ///  and must use it first during our item creation.
        internal void StoreEnumerator(IEnumerator enumerator, object firstDataItem) 
        {
            _storedEnumerator = enumerator; 
            _firstDataItem = firstDataItem; 
            _storedDataValid = true;
        } 

        private bool IsBindableType(Type type)
        {
            return(type.IsPrimitive || 
                   (type == typeof(String)) ||
                   (type == typeof(DateTime)) || 
                   (type == typeof(Decimal))); 
        }
 
        private ObjectListField CreateAutoGeneratedField(String title, String dataField)
        {
            ObjectListField field = new ObjectListField();
            ((IStateManager)field).TrackViewState(); 
            field.Title = title;
            if (dataField != null) 
            { 
                field.DataField = dataField;
            } 
            else
            {
                field.SelfReference = true;
            } 
            return field;
        } 
 
        Object SaveAutoFieldsState()
        { 
            int autoGeneratedCount = (_autoGeneratedFields != null) ? _autoGeneratedFields.Count : 0;
            if (autoGeneratedCount != 0)
            {
                Object[] fieldStates = new Object[autoGeneratedCount]; 
                for (int i = 0; i < autoGeneratedCount; i++)
                { 
                    fieldStates[i] = ((IStateManager)_autoGeneratedFields[i]).SaveViewState(); 
                }
                return fieldStates; 
            }
            else
            {
                return null; 
            }
        } 
 
        void LoadAutoFieldsState(Object state)
        { 
            if (state != null)
            {
                Object[] fieldStates = (Object[])state;
                int count = fieldStates.Length; 
                ArrayList list = new ArrayList(count);
                foreach (Object fieldState in fieldStates) 
                { 
                    ObjectListField field = new ObjectListField();
                    ((IStateManager)field).TrackViewState(); 
                    ((IStateManager)field).LoadViewState (fieldState);
                    list.Add(field);
                }
                _autoGeneratedFields = new ObjectListFieldCollection(this, list); 
            }
        } 
 
        internal void OnFieldChanged(bool fieldAddedOrRemoved)
        { 
            // Called when a field is added, removed, etc.
            if (IsTrackingViewState)
            {
                _items = null; 
                // avoid view state being out of [....] with fields.
                _ignoreFieldsItemsViewModeViewState = true; 
                if (fieldAddedOrRemoved) 
                {
                    _allFields = null; 
                }
                InvalidateDisplayFieldIndices();
            }
        } 

        ///  
        protected override int InternalItemCount 
        {
            get 
            {
                if (_items != null && Items.Count > 0)
                {
                    return Items.Count; 
                }
                else 
                { 
                    return 0;
                } 
            }

        }
 
        /////////////////////////////////////////////////////////////////////////
        //  EVENT HANDLING 
        ///////////////////////////////////////////////////////////////////////// 

        ///  
        [
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.ObjectList_OnItemDataBind)
        ] 
        public event ObjectListDataBindEventHandler ItemDataBind
        { 
            add 
            {
                Events.AddHandler(EventItemDataBind, value); 
            }
            remove
            {
                Events.RemoveHandler(EventItemDataBind, value); 
            }
        } 
 
        /// 
        protected virtual void OnItemDataBind(ObjectListDataBindEventArgs e) 
        {
            ObjectListDataBindEventHandler onItemDataBindHandler =
                (ObjectListDataBindEventHandler)Events[EventItemDataBind];
            if (onItemDataBindHandler != null) 
            {
                onItemDataBindHandler(this, e); 
            } 
        }
 
        /// 
        [
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.ObjectList_OnItemCommand) 
        ]
        public event ObjectListCommandEventHandler ItemCommand 
        { 
            add
            { 
                Events.AddHandler(EventItemCommand, value);
            }
            remove
            { 
                Events.RemoveHandler(EventItemCommand, value);
            } 
        } 

        ///  
        protected virtual void OnItemCommand(ObjectListCommandEventArgs e)
        {
            ObjectListCommandEventHandler onItemCommandHandler = (ObjectListCommandEventHandler)Events[EventItemCommand];
            if (onItemCommandHandler != null) 
            {
                onItemCommandHandler(this, e); 
            } 
        }
 
        /// 
        [
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.ObjectList_OnItemSelect) 
        ]
        public event ObjectListSelectEventHandler ItemSelect 
        { 
            add
            { 
                Events.AddHandler(EventItemSelect, value);
            }
            remove
            { 
                Events.RemoveHandler(EventItemSelect, value);
            } 
        } 

        ///  
        protected virtual void OnItemSelect(ObjectListSelectEventArgs e)
        {
            ObjectListSelectEventHandler onItemSelectHandler = (ObjectListSelectEventHandler)Events[EventItemSelect];
            if (onItemSelectHandler != null) 
            {
                onItemSelectHandler(this, e); 
            } 
        }
 
        /// 
        [
            Bindable(false),
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public bool HasItemCommandHandler 
        {
            get 
            {
                return Events[EventItemCommand] != null;
            }
        } 

        ///  
        [ 
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.ObjectList_OnShowItemCommands) 
        ]
        public event ObjectListShowCommandsEventHandler ShowItemCommands
        {
            add 
            {
                Events.AddHandler(EventShowItemCommands, value); 
            } 
            remove
            { 
                Events.RemoveHandler(EventShowItemCommands, value);
            }
        }
 
        /// 
        protected virtual void OnShowItemCommands(ObjectListShowCommandsEventArgs e) 
        { 
            ObjectListShowCommandsEventHandler onShowItemCommandsHandler
                = (ObjectListShowCommandsEventHandler)Events[EventShowItemCommands]; 
            if (onShowItemCommandsHandler != null)
            {
                onShowItemCommandsHandler(this, e);
            } 
        }
 
        ///  
        protected override bool OnBubbleEvent(Object sender, EventArgs e)
        { 
            bool handled = false;

            if (e is CommandEventArgs)
            { 
                if (e is ObjectListCommandEventArgs)
                { 
                    OnItemCommand((ObjectListCommandEventArgs)e); 
                    handled = true;
                } 
            }

            return handled;
        } 

        ///  
        protected void RaisePostBackEvent(String eventArgument) 
        {
            if (!Adapter.HandlePostBackEvent(eventArgument)) 
            {
                OnItemCommand(new ObjectListCommandEventArgs(Selection, eventArgument));
            }
        } 

        ///  
        public void RaiseDefaultItemEvent(int itemIndex) 
        {
            EnsureItemLoaded (itemIndex); 
            int itemCollIndex = TranslateVirtualItemIndex(itemIndex);
            SelectedIndex = itemIndex;
            OnItemCommand(new ObjectListCommandEventArgs(Items[itemCollIndex], DefaultCommand));
        } 

        ///  
        public bool SelectListItem(int itemIndex, bool selectMore) 
        {
            EnsureItemLoaded (itemIndex); 
            int itemCollIndex = TranslateVirtualItemIndex(itemIndex);

            ObjectListSelectEventArgs args = new ObjectListSelectEventArgs(
                                                        Items[itemCollIndex], 
                                                        selectMore);
            SelectedIndex = itemIndex; 
            OnItemSelect(args); 
            return args.UseDefaultHandling;
        } 

        /// 
        public void PreShowItemCommands(int itemIndex)
        { 
            // Called just before commands are shown for a given item. We call
            // an event handler that can modify (or even replace) the commands collection, 
            // but first we mark the collection, and save it off, so that we can 
            // save the state of the collection at this point.
 
            if (_commands != null)
            {
                _globalCommands = _commands;
                _commands.GlobalStateSet(); 
            }
 
            SelectedIndex = itemIndex; 

            ObjectListShowCommandsEventArgs eventArgs = 
                new ObjectListShowCommandsEventArgs(Selection, Commands);
            OnShowItemCommands(eventArgs);
            if (eventArgs.Commands != _commands)
            { 
                _commands = eventArgs.Commands;
            } 
        } 

        private void EnsureItemLoaded(int virtualIndex) 
        {
            Debug.Assert (virtualIndex >= 0, "virtualIndex < 0");
            if (ItemCount > 0 &&
                    (_items == null || 
                    virtualIndex < Items.BaseIndex ||
                    Items.Count <= virtualIndex - Items.BaseIndex)) 
            { 
                OnLoadItems(new LoadItemsEventArgs(virtualIndex, 1));
            } 
        }

        private int TranslateVirtualItemIndex(int virtualIndex)
        { 
            Debug.Assert(ItemCount > 0 || Items.BaseIndex == 0);
 
            // Translate virtual index to true index within collection. 
            // If custom pagination is off, virtual index is the true index.
            return virtualIndex - Items.BaseIndex; 
        }

        /// 
        protected override void OnLoadItems(LoadItemsEventArgs e) 
        {
            // We should only load items if the base index has changed, or if 
            // the desired items do not exist in the list. Otherwise, we are making 
            // the app reload the same items over and over.
 
            if (e.ItemIndex != Items.BaseIndex || e.ItemCount != Items.Count)
            {
                _loadingItems = true;
                Items.BaseIndex = e.ItemIndex; 
                Items.Clear();
                base.OnLoadItems(e); 
                _loadingItems = false; 
            }
        } 

        /////////////////////////////////////////////////////////////////////////
        //  STATE MANAGEMENT
        ///////////////////////////////////////////////////////////////////////// 

        ///  
        protected override void TrackViewState() 
        {
            base.TrackViewState(); 
            if (_fields != null)
            {
                ((IStateManager)_fields).TrackViewState();
            } 
            if (_commands != null)
            { 
                ((IStateManager)_commands).TrackViewState(); 
            }
            if (_items != null) 
            {
                ((IStateManager)_items).TrackViewState();
            }
        } 

        ///  
        protected override Object SavePrivateViewState() 
        {
            Object baseState = base.SavePrivateViewState(); 
            if (ViewMode != ObjectListViewMode.List || _selectedIndexDirty)
            {
                return new Triplet(baseState, (int) ViewMode, SelectedIndex);
            } 
            else if (baseState != null)
            { 
                return baseState; 
            }
            return null; 
        }

        /// 
        protected override void LoadPrivateViewState(Object state) 
        {
            if (state != null) 
            { 
                Triplet stateTriplet = state as Triplet;
                if (stateTriplet != null) 
                {
                    base.LoadPrivateViewState (stateTriplet.First);
                    ObjectListViewMode originalViewMode = _viewMode;
 
                    // use private field because property get calls CreateChildControls.
                    _viewMode = (ObjectListViewMode) stateTriplet.Second; 
 
                    // use property to insure we load items if necessary and set selected index dirty.
                    SelectedIndex = (int)stateTriplet.Third; 

                    bool viewModeChanged = (originalViewMode != _viewMode);
                    if (ChildControlsCreated && viewModeChanged)
                    { 
                        // This is before items loaded in LVS, so we only do this if
                        // child controls already created in init (e.g., no VS.) 
                        CreateChildControls (true); 
                    }
                } 
                else
                {
                    base.LoadPrivateViewState(state);
                } 
            }
        } 
 
        /// 
        protected override Object SaveViewState() 
        {
            Object baseState, fieldsState, autoFieldsState, commandsState, itemsState;

            Debug.Assert (Items != null, "get_Items should initialize Items collection."); 
            int count = Items.Count;
            // HasControls implies DataBound on this or a prev req (but not converse). 
            if (count > 0 || HasControls()) 
            {
                ViewState[_itemCountViewStateKey] = count; 
            }
            baseState = base.SaveViewState();
            fieldsState = (_fields != null) ? ((IStateManager)_fields).SaveViewState() : null;
            autoFieldsState = SaveAutoFieldsState(); 
            commandsState = (_commands != null) ? ((IStateManager)_commands).SaveViewState() : null;
            itemsState = (_items != null) ? ((IStateManager)_items).SaveViewState() : null; 
 
            if (itemsState != null ||
                fieldsState != null || 
                autoFieldsState != null ||
                commandsState != null )
            {
                return new Object[5] 
                {
                    baseState, 
                    fieldsState, 
                    autoFieldsState,
                    commandsState, 
                    itemsState
                };
            }
            else if (baseState != null) 
            {
                return new Object[1] { baseState }; 
            } 
            return null;
        } 

        /// 
        protected override void LoadViewState(Object savedState)
        { 
            // copy locally (can change during Fields.LVS).
            bool ignoreFieldsItemsViewModeViewState = _ignoreFieldsItemsViewModeViewState; 
            if (savedState != null) 
            {
                Object[] state = (Object[])savedState; 
                base.LoadViewState(state[0]);

                if (state.Length > 1)
                { 
                    // Always load items after loading fields, because field changes can wipe out
                    // items! 
                    if(!ignoreFieldsItemsViewModeViewState) 
                    {
                        ((IStateManager)Fields).LoadViewState(state[1]); 
                        LoadAutoFieldsState(state[2]);
                    }
                    ((IStateManager)Commands).LoadViewState(state[3]);
                    if(!ignoreFieldsItemsViewModeViewState) 
                    {
                        ((IStateManager)Items).LoadViewState(state[4]); 
                        SelectItemIfLoaded(SelectedIndex); 
                    }
                } 
            }
        }

        ///  
        [
            Bindable(false), 
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public ObjectListViewMode ViewMode
        {
            get
            { 
                return _viewMode;
            } 
            set 
            {
                if (SelectedIndex == -1 && value != ObjectListViewMode.List) 
                {
                    throw new Exception(SR.GetString(
                        SR.ObjectList_CannotSetViewModeWithNoSelectedItem));
                } 
                if (value == ObjectListViewMode.List)
                { 
                    // Set pagination state changed to refresh pagination. 
                    Form.PaginationStateChanged = true;
                } 
                _viewMode = value;
                CreateChildControls(true);
            }
        } 

        ///  
        [ 
            Bindable(true),
            Browsable(true), 
            DefaultValue(""),
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.ObjectList_DetailsCommandText),
        ] 
        public String DetailsCommandText
        { 
            get 
            {
                String detailsCommandText = (String)ViewState["DetailsCommandText"]; 
                return detailsCommandText != null ? detailsCommandText : String.Empty;
            }
            set
            { 
                ViewState["DetailsCommandText"] = value;
            } 
        } 

        ///  
        [
            Bindable(true),
            Browsable(true),
            DefaultValue(""), 
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.ObjectList_BackCommandText), 
        ] 
        public String BackCommandText
        { 
            get
            {
                String backCommandText = (String) ViewState["BackCommandText"];
                return backCommandText != null ? backCommandText : String.Empty; 
            }
            set 
            { 
                ViewState["BackCommandText"] = value;
            } 
        }

        /// 
        [ 
            Bindable(true),
            Browsable(true), 
            DefaultValue(""), 
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.ObjectList_MoreText) 
        ]
        public String MoreText
        {
            get 
            {
                String moreText = (String)ViewState["MoreText"]; 
                return moreText != null ? moreText : String.Empty; 
            }
            set 
            {
                ViewState["MoreText"] = value;
            }
        } 

        ///  
        [ 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
            MobileCategory(SR.Category_Style), 
            MobileSysDescription(SR.ObjectList_CommandStyle),
            NotifyParentProperty(true)
        ]
        public Style CommandStyle 
        {
            get 
            { 
                if (_commandStyle == null)
                { 
                    _commandStyle = new Style();
                    _commandStyle.SetControl(this);
                    _commandStyle.StyleReference = "subcommand";
                } 
                return _commandStyle;
            } 
            set 
            {
                _commandStyle = value; 
            }
        }

        ///  
        [
            DefaultValue(null), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
            MobileCategory(SR.Category_Style),
            MobileSysDescription(SR.ObjectList_LabelStyle), 
            NotifyParentProperty(true)
        ]
        public Style LabelStyle
        { 
            get
            { 
                if (_labelStyle == null) 
                {
                    _labelStyle = new Style(); 
                    _labelStyle.SetControl(this);
                    _labelStyle.StyleReference = "title";
                }
                return _labelStyle; 
            }
            set 
            { 
                _labelStyle = value;
            } 
        }

        internal override void InvalidateParentStyles()
        { 
            if (_commandStyle != null)
            { 
                _commandStyle.InvalidateParentStyle(); 
            }
            if (_labelStyle != null) 
            {
                _labelStyle.InvalidateParentStyle();
            }
            base.InvalidateParentStyles(); 
        }
 
        internal override void InternalItemCountChangedHandler(int newItemCount) 
        {
            if (newItemCount == 0) 
            {
                ClearItemsAndControls();
            }
        } 

        private void ClearItemsAndControls() 
        { 
            ViewMode = ObjectListViewMode.List;
            SelectedIndex = -1; 
            Items.Clear();
            Controls.Clear();
        }
 
        // Wrapper to increase intelligibility at point of call.
        private void SelectItemIfLoaded(int virtualIndex) 
        { 
            SetItemSelectedPropertyIfItemLoaded(virtualIndex, true);
        } 

        // Wrapper to increase intelligibility at point of call.
        private void DeselectItemIfLoaded(int virtualIndex)
        { 
            SetItemSelectedPropertyIfItemLoaded(virtualIndex, false);
        } 
 
        private void SetItemSelectedPropertyIfItemLoaded(int virtualIndex, bool newValue)
        { 
            if (virtualIndex < 0)
            {
                return;
            } 
            int physicalIndex = TranslateVirtualItemIndex(virtualIndex);
            if (physicalIndex >= 0 && physicalIndex < Items.Count) 
            { 
                Items[physicalIndex].Selected = newValue;
            } 
        }

        #region IPostBackEventHandler implementation
        void IPostBackEventHandler.RaisePostBackEvent(String eventArgument) { 
            RaisePostBackEvent(eventArgument);
        } 
        #endregion 
    }
 

    /*
     * Control builder for object lists.
     * 
     * 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 class ObjectListControlBuilder : MobileControlBuilder
    { 
        /// 
        public override Type GetChildControlType(String tagName, IDictionary attributes) 
        { 
            if (String.Compare(tagName, "Field", StringComparison.OrdinalIgnoreCase) == 0)
            { 
                return typeof(ObjectListField);
            }
            else if (String.Compare(tagName, "Command", StringComparison.OrdinalIgnoreCase) == 0)
            { 
                return typeof(ObjectListCommand);
            } 
            else 
            {
                return base.GetChildControlType(tagName, attributes); 
            }
        }
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

using System; 
using System.Collections; 
using System.ComponentModel;
using System.Data; 
using System.Diagnostics;
using System.Drawing.Design;
using System.Globalization;
using System.Web; 
using System.Web.UI;
using System.Web.UI.WebControls; 
using System.Web.UI.HtmlControls; 
using System.Security.Permissions;
 
namespace System.Web.UI.MobileControls
{
    /*
     * Object List class. 
     *
     * Copyright (c) 2000 Microsoft Corporation 
     */ 
    /// 
    [ 
        ControlBuilderAttribute(typeof(ObjectListControlBuilder)),
        DefaultEvent("ItemCommand"),
        DefaultProperty("DataSource"),
        Designer(typeof(System.Web.UI.Design.MobileControls.ObjectListDesigner)), 
        DesignerAdapter(typeof(System.Web.UI.Design.MobileControls.Adapters.DesignerObjectListAdapter)),
        Editor(typeof(System.Web.UI.Design.MobileControls.ObjectListComponentEditor), typeof(ComponentEditor)), 
        ToolboxData("<{0}:ObjectList runat=\"server\" LabelStyle-StyleReference=\"title\" CommandStyle-StyleReference=\"subcommand\">"), 
        ToolboxItem("System.Web.UI.Design.WebControlToolboxItem, " + AssemblyRef.SystemDesign)
    ] 
    [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 class ObjectList : PagedControl, INamingContainer, ITemplateable, IPostBackEventHandler 
    {
        private static readonly Object EventItemDataBind = new Object(); 
        private static readonly Object EventItemCommand = new Object(); 
        private static readonly Object EventItemSelect = new Object();
        private static readonly Object EventShowItemCommands = new Object(); 

        private Object _dataSource;
        private IEnumerable _resolvedDataSource;
        private ObjectListFieldCollection _fields; 
        private ObjectListFieldCollection _autoGeneratedFields;
        private ObjectListFieldCollection _allFields; 
        private ObjectListItemCollection _items; 
        private ObjectListCommandCollection _commands;
        private ObjectListCommandCollection _globalCommands; 
        private int _labelFieldIndex = -1;
        private int[] _tableFieldIndices = null;
        private IEnumerator _storedEnumerator = null;
        private Object _firstDataItem = null; 
        private bool _storedDataValid = false;
        private ObjectListViewMode _viewMode = ObjectListViewMode.List; 
        private bool _ignoreFieldsItemsViewModeViewState = false; 
        private Style _commandStyle = null;
        private Style _labelStyle = null; 
        private const string _itemCountViewStateKey = "_!ItemCount";
        private int _selectedIndex = -1;
        private bool _selectedIndexDirty = false;
        private bool _loadingItems = false; 

        ///  
        public static String SelectMoreCommand 
        {
            get 
            {
                return "More";
            }
        } 

        ///  
        [ 
            Bindable(true),
            DefaultValue(null), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
            MobileCategory(SR.Category_Data),
            MobileSysDescription(SR.ObjectList_DataSource)
        ] 
        public virtual Object DataSource
        { 
            get 
            {
                return _dataSource; 
            }
            set
            {
                _dataSource = value; 
                // _allFields and _resolvedDataSource need to be recalculated.
                _allFields = null; 
                _resolvedDataSource = null; 
            }
        } 

        /// 
        [
            Bindable(false), 
            DefaultValue(""),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.List_DataMember), 
            TypeConverter(typeof(System.Web.UI.Design.MobileControls.Converters.DataMemberConverter))
        ] 
        public virtual String DataMember
        {
            get
            { 
                String s = (String)ViewState["DataMember"];
                return s == null ? String.Empty : s; 
            } 
            set
            { 
                ViewState["DataMember"] = value;
            }
        }
 
        /// 
        [ 
            Bindable(false), 
            DefaultValue(null),
            Editor(typeof(System.Web.UI.Design.MobileControls.FieldCollectionEditor), typeof(UITypeEditor)), 
            MergableProperty(false),
            MobileCategory(SR.Category_Data),
            MobileSysDescription(SR.ObjectList_Fields),
            PersistenceMode(PersistenceMode.InnerDefaultProperty) 
        ]
        public virtual ObjectListFieldCollection Fields 
        { 
            get
            { 
                if (_fields == null)
                {
                    _fields = new ObjectListFieldCollection(this);
                    if (IsTrackingViewState) 
                    {
                        ((IStateManager)_fields).TrackViewState(); 
                    } 
                }
                return _fields; 
            }
        }

        ///  
        [
            Bindable(true), 
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public virtual ObjectListItemCollection Items
        {
            get
            { 
                if (_items == null)
                { 
                    _items = new ObjectListItemCollection(this); 
                    if (IsTrackingViewState)
                    { 
                        ((IStateManager)_items).TrackViewState();
                    }
                }
                return _items; 
            }
        } 
 
        /// 
        [ 
            Bindable(false),
            Editor(typeof(System.Web.UI.Design.MobileControls.CommandCollectionEditor), typeof(UITypeEditor)),
            MergableProperty(false),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.ObjectList_Commands),
            PersistenceMode(PersistenceMode.InnerDefaultProperty) 
        ] 
        public virtual ObjectListCommandCollection Commands
        { 
            get
            {
                if (_commands == null)
                { 
                    _commands = new ObjectListCommandCollection();
                    if (IsTrackingViewState) 
                    { 
                        ((IStateManager)_commands).TrackViewState();
                    } 
                }
                return _commands;
            }
        } 

        ///  
        [ 
            DefaultValue(""),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.ObjectList_LabelField),
            TypeConverter(typeof(System.Web.UI.Design.MobileControls.Converters.DataFieldConverter))
        ]
        public String LabelField 
        {
            get 
            { 
                String s = (String)ViewState["LabelField"];
                return (s != null) ? s : String.Empty; 
            }
            set
            {
                ViewState["LabelField"] = value; 
                InvalidateDisplayFieldIndices();
            } 
        } 

        ///  
        [
            Bindable(true),
            DefaultValue(""),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.ObjectList_DefaultCommand),
            TypeConverter(typeof(System.Web.UI.Design.MobileControls.Converters.DefaultCommandConverter)) 
        ] 
        public String DefaultCommand
        { 
            get
            {
                String s = (String)ViewState["DefaultCommand"];
                return (s != null) ? s : String.Empty; 
            }
            set 
            { 
                ViewState["DefaultCommand"] = value;
            } 
        }

        /// 
        [ 
            Bindable(true),
            DefaultValue(""), 
            Editor(typeof(System.Web.UI.Design.MobileControls.TableFieldsEditor), 
                typeof(UITypeEditor)),
            MobileCategory(SR.Category_Data), 
            MobileSysDescription(SR.ObjectList_TableFields)
        ]
        public String TableFields
        { 
            get
            { 
                String s = (String)ViewState["TableFields"]; 
                return (s != null) ? s : String.Empty;
            } 
            set
            {
                ViewState["TableFields"] = value;
                InvalidateDisplayFieldIndices(); 
            }
        } 
 
        /// 
        [ 
            Bindable(false),
            Browsable(false),
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public int SelectedIndex
        { 
            get 
            {
                return _selectedIndex; 
            }
            set
            {
                if (value == -1 && ViewMode != ObjectListViewMode.List) 
                {
                    throw new Exception( 
                        SR.GetString(SR.ObjectList_MustBeInListModeToClearSelectedIndex)); 
                }
                int itemCount = ItemCount > 0 ? ItemCount : Items.Count; 
                if (value < -1)
                {
                    throw new ArgumentOutOfRangeException("SelectedIndex",
                        SR.GetString(SR.ObjectList_SelectedIndexTooSmall, value)); 
                }
                else if (itemCount > 0 && value >= itemCount) 
                { 
                    throw new ArgumentOutOfRangeException("SelectedIndex",
                        SR.GetString(SR.ObjectList_SelectedIndexTooBig, value, itemCount)); 
                }
                // End of guard clauses.

                _selectedIndexDirty = (value != _selectedIndex) && IsTrackingViewState; 
                DeselectItemIfLoaded(_selectedIndex);
                SelectItemIfLoaded(value); 
                _selectedIndex = value; 
            }
        } 

        /// 
        [
            Bindable(false), 
            Browsable(false),
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 
        ] 
        public ObjectListItem Selection
        { 
            get
            {
                if (SelectedIndex == -1)
                { 
                    return null;
                } 
                EnsureItemLoaded (SelectedIndex); 
                int selectedIndex = TranslateVirtualItemIndex(SelectedIndex);
                if (selectedIndex >= 0 && selectedIndex < Items.Count) 
                {
                    Debug.Assert (Items[selectedIndex].Selected);
                    return Items[selectedIndex];
                } 
                else
                { 
                    return null; 
                }
            } 
        }

        /// 
        [ 
            Bindable(false),
            Browsable(true), 
            DefaultValue(true), 
            MobileCategory(SR.Category_Behavior),
            MobileSysDescription(SR.ObjectList_AutoGenerateFields) 
        ]
        public bool AutoGenerateFields
        {
            get 
            {
                Object b = ViewState["AutoGenerateFields"]; 
                return (b != null) ? (bool)b : true; 
            }
            set 
            {
                if (value != AutoGenerateFields)
                {
                    ViewState["AutoGenerateFields"] = value; 
                    _allFields = null;
                    _autoGeneratedFields = null; 
                    _items = null; 
                    InvalidateDisplayFieldIndices();
                } 
            }
        }

        ///  
        [
            Bindable(false), 
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public IObjectListFieldCollection AllFields
        {
            get
            { 
                if (_allFields == null)
                { 
                    if (_autoGeneratedFields == null) 
                    {
                        if (_fields == null) 
                        {
                            return null;
                        }
                        else 
                        {
                            _allFields = _fields; 
                        } 
                    }
                    else 
                    {
                        if (_fields == null)
                        {
                            _allFields = _autoGeneratedFields; 
                        }
                        else 
                        { 
                            int count = _fields.Count + _autoGeneratedFields.Count;
 
                            ArrayList list = new ArrayList(count);

                            foreach (ObjectListField field in _fields)
                            { 
                                list.Add(field);
                            } 
 
                            foreach (ObjectListField field in _autoGeneratedFields)
                            { 
                                list.Add(field);
                            }

                            _allFields = new ObjectListFieldCollection(this, list); 
                        }
                    } 
                } 
                return _allFields;
            } 
        }

        /// 
        [ 
            Bindable(false),
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) 
        ]
        public int LabelFieldIndex 
        {
            get
            {
                if (_labelFieldIndex == -1) 
                {
                    CalculateDisplayFieldIndices(); 
                } 
                return _labelFieldIndex;
            } 
        }

        /// 
        [ 
            Bindable(false),
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) 
        ]
        public Panel Details 
        {
            get
            {
                EnsureChildControls(); 
                if (ViewMode != ObjectListViewMode.Details)
                { 
                    throw new Exception(SR.GetString(SR.ObjectList_MustBeInDetailsModeToGetDetails)); 
                }
                return Selection; 
            }
        }

        ///  
        [
            Bindable(false), 
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ] 
        public int[] TableFieldIndices
        {
            get
            { 
                if (_labelFieldIndex == -1)
                { 
                    CalculateDisplayFieldIndices(); 
                }
                Debug.Assert(_tableFieldIndices != null, "_tableFieldIndices is null."); 
                return _tableFieldIndices;
            }
        }
 
        /// 
        public override void EnsureTemplatedUI() 
        { 
            EnsureChildControls();
        } 

        /// 
        protected override void EnsureChildControls()
        { 
            // if EnsureChildControls is called before items are created (e.g., at
            // LoadPrivateViewState), there will be no controls.  Need to build child 
            // controls in this case, so we set ChildControlsCreated to false. 
            ChildControlsCreated = ChildControlsCreated && Controls.Count > 0;
            base.EnsureChildControls(); 
        }

        private void CalculateDisplayFieldIndices()
        { 
            String labelField = LabelField;
            if (labelField.Length > 0) 
            { 
                _labelFieldIndex = GetFieldIndex(labelField);
            } 
            else
            {
                _labelFieldIndex = 0;
            } 

            String tableFields = TableFields; 
            int length = tableFields.Length; 

            // Populate the _tableFieldIndices array. 
            ArrayList tableFieldIndexList = new ArrayList();
            for (int pos = 0; pos < length; )
            {
                int nextSemicolon = tableFields.IndexOf(';', pos); 
                String fieldName = (nextSemicolon == -1) ?
                    tableFields.Substring(pos) : 
                    tableFields.Substring(pos, nextSemicolon - pos); 
                tableFieldIndexList.Add(GetFieldIndex(fieldName));
                pos = nextSemicolon == -1 ? length : nextSemicolon + 1; 
            }
            _tableFieldIndices = (int[])tableFieldIndexList.ToArray(typeof(int));
        }
 
        internal void InvalidateDisplayFieldIndices()
        { 
            _labelFieldIndex = -1; 
            _tableFieldIndices = null;
        } 

        private int GetFieldIndex(String field)
        {
            int index = AllFields.IndexOf(field); 
            if (index == -1)
            { 
                throw new ArgumentException(SR.GetString( 
                                        SR.ObjectList_FieldNotFound, field));
            } 
            return index;
        }

        ///  
        protected override void AddParsedSubObject(Object obj)
        { 
            if (!(obj is LiteralControl)) 
            {
                if (obj is ObjectListField) 
                {
                    Fields.Add((ObjectListField)obj);
                }
                else if (obj is ObjectListCommand) 
                {
                    Commands.Add((ObjectListCommand)obj); 
                } 
                else
                { 
                    base.AddParsedSubObject(obj);
                }
            }
        } 

        private IEnumerable ResolvedDataSource 
        { 
            get
            { 
                if (_resolvedDataSource == null)
                {
                    _resolvedDataSource =
                        DataSourceHelper.GetResolvedDataSource(DataSource, DataMember); 
                }
                return _resolvedDataSource; 
            } 
        }
 
        /// 
        protected override void CreateChildControls()
        {
            Controls.Clear(); 
            if (ViewState[_itemCountViewStateKey] != null)
            { 
                CreateChildControls(false); 
            }
        } 

        private void CreateChildControls(bool doDataBind)
        {
            if (IsTemplated) 
            {
                Controls.Clear(); 
                CreateTemplatedUI(doDataBind); 
                ChildControlsCreated = true;
            } 
        }

        /// 
        public override void DataBind() 
        {
            // Do our own databinding 
            OnDataBinding(EventArgs.Empty); 

            // Contained items will be databound after they have been created, 
            // so we don't want to walk the hierarchy here.
        }

        ///  
        protected override void OnDataBinding(EventArgs e)
        { 
            base.OnDataBinding(e); 

            if (ResolvedDataSource == null) 
            {
                ClearItemsAndControls();
                return;
            } 

            if (AutoGenerateFields) 
            { 
                CreateAutoGeneratedFields(ResolvedDataSource);
            } 

            if ((AllFields == null || AllFields.Count == 0)
                && MobilePage != null
                && !MobilePage.DesignMode) 
            {
                throw new Exception( 
                    SR.GetString(SR.ObjectList_MustHaveOneOrMoreFields)); 
            }
 
            CreateItems(ResolvedDataSource);

            if (!_loadingItems)
            { 
                // To clear the selected index, the ViewMode must be list.
                ViewMode = ObjectListViewMode.List; 
                SelectedIndex = -1; 
            }
            else 
            {
                SelectItemIfLoaded(SelectedIndex);
            }
 
            CreateChildControls(true);
        } 
 
        /// 
        public void CreateTemplatedItemsList(bool doDataBind) 
        {
            ObjectListItemCollection items = Items;

            ITemplate headerTemplate = GetTemplate(Constants.HeaderTemplateTag); 
            ITemplate footerTemplate = GetTemplate(Constants.FooterTemplateTag);
            ITemplate itemTemplate = GetTemplate(Constants.ItemTemplateTag); 
            ITemplate separatorTemplate = GetTemplate(Constants.SeparatorTemplateTag); 
            ITemplate alternatingItemTemplate = GetTemplate(Constants.AlternatingItemTemplateTag);
            if (alternatingItemTemplate == null) 
            {
                alternatingItemTemplate = itemTemplate;
            }
 
            CreateControlItem(MobileListItemType.HeaderItem, headerTemplate, doDataBind);
            for (int i = 0; i < items.Count; i++) 
            { 
                if (i > 0)
                { 
                    CreateControlItem(MobileListItemType.SeparatorItem,
                                      separatorTemplate,
                                      doDataBind);
                } 
                AddItemAsControl(i, items[i],
                                   ((i & 1) == 1) ? alternatingItemTemplate : itemTemplate, 
                                   doDataBind); 
            }
            CreateControlItem(MobileListItemType.FooterItem, footerTemplate, doDataBind); 
        }

        private void AddItemAsControl(
            int itemIndex, 
            MobileListItem item,
            ITemplate itemTemplate, 
            bool doDataBind) 
        {
            if (itemTemplate != null) 
            {
                // No need to do it again, since CreateItems already does it.
                item.Controls.Clear();
                item.ID = null; 
                Controls.Add(item);
                CheckedInstantiateTemplate (itemTemplate, item, this); 
                if (doDataBind) 
                {
                    item.DataBind(); 
                }
            }
        }
 
        private void CreateControlItem(
            MobileListItemType itemType, 
            ITemplate itemTemplate, 
            bool doDataBind)
        { 
            if (itemTemplate != null)
            {
                MobileListItem item = new MobileListItem(itemType);
                AddItemAsControl(-1, item, itemTemplate, doDataBind); 
            }
        } 
 
        /// 
        public void CreateTemplatedItemDetails(bool doDataBind) 
        {
            ITemplate detailsTemplate = GetTemplate(Constants.ItemDetailsTemplateTag);
            Selection.Controls.Clear();
 
            // Selection ID must be the same on each request.  AUI 8007.
            Selection.ID = "_ctl"; 
 
            if (detailsTemplate != null)
            { 
                if (!Controls.Contains (Selection))
                {
                    Controls.Add (Selection);
                } 
                CheckedInstantiateTemplate (detailsTemplate, Selection, this);
                if (doDataBind) 
                { 
                    Selection.DataBind();
                } 
            }
        }

        ///  
        protected virtual void CreateItems(IEnumerable dataSource)
        { 
            Debug.Assert (dataSource != null, "dataSource is null"); 

            Items.Clear(); 

            int count = 0;
            IEnumerator enumerator;
 
            if(_storedDataValid  && _firstDataItem != null)
            { 
                enumerator = _storedEnumerator; 
                ObjectListItem item = CreateItem(_firstDataItem);
                item.SetIndex(count + Items.BaseIndex); 
                Items.Add(item);
                count++;
                _storedDataValid = false;
                _firstDataItem = null; 
                _storedEnumerator = null;
            } 
            else 
            {
                enumerator = dataSource.GetEnumerator(); 
            }

            while(enumerator.MoveNext())
            { 
                Object dataItem = enumerator.Current;
                ObjectListItem item = CreateItem(dataItem); 
                item.SetIndex(count + Items.BaseIndex); 
                Items.Add(item);
                count++; 
            }
        }

        ///  
        protected virtual ObjectListItem CreateItem(Object dataItem)
        { 
            ObjectListItem item = new ObjectListItem(this, dataItem); 

            // Set fields. 

            IObjectListFieldCollection allFields = AllFields;
            int fieldIndex = 0;
            foreach (ObjectListField field in AllFields) 
            {
                field.DataBindItem(fieldIndex, item); 
                fieldIndex++; 
            }
 
            // Use delegated data binding, if specified.

            if (dataItem != null)
            { 
                OnItemDataBind(new ObjectListDataBindEventArgs(item, dataItem));
            } 
 
            return item;
        } 

        /// 
        protected override void OnPreRender(EventArgs e)
        { 
            base.OnPreRender(e);
 
            if (IsTemplated) 
            {
                int firstVisibleItem = FirstVisibleItemIndex; 
                int pageSize = VisibleItemCount;
                int lastVisibleItem = firstVisibleItem + pageSize - 1;
                int itemIndex = 0;
                int separatorIndex = 0; 
                foreach(Control ctl in Controls)
                { 
                    MobileListItem item = ctl as MobileListItem; 
                    if (item != null)
                    { 
                        if (item.ItemType == MobileListItemType.ListItem)
                        {
                            item.Visible = itemIndex >= firstVisibleItem && itemIndex <= lastVisibleItem;
                            itemIndex++; 
                        }
                        else if (item.ItemType == MobileListItemType.SeparatorItem) 
                        { 
                            item.Visible = separatorIndex >= firstVisibleItem &&
                                                separatorIndex < lastVisibleItem; 
                            separatorIndex++;
                        }
                    }
                } 
            }
        } 
 
        /////////////////////////////////////////////////////////////////////////
        //  FIELD AUTO-GENERATION 
        /////////////////////////////////////////////////////////////////////////

        /// 
        protected void CreateAutoGeneratedFields(IEnumerable dataSource) 
        {
            if (dataSource == null) 
            { 
                return;
            } 

            ArrayList list = new ArrayList();
            PropertyDescriptorCollection propertyDescriptors = null;
 
            if (dataSource is ITypedList)
            { 
                propertyDescriptors = 
                    ((ITypedList)dataSource).GetItemProperties(new PropertyDescriptor[0]);
            } 

            if (propertyDescriptors == null)
            {
                IEnumerator enumerator = dataSource.GetEnumerator(); 
                if (enumerator.MoveNext())
                { 
                    Object sampleItem = enumerator.Current; 
                    StoreEnumerator(enumerator, sampleItem);
                    if (IsBindableType(sampleItem.GetType())) 
                    {
                        list.Add(CreateAutoGeneratedField(
                                        SR.GetString(SR.ObjectList_ItemTitle),
                                        null)); 
                    }
                    else 
                    { 
                        propertyDescriptors = TypeDescriptor.GetProperties(sampleItem);
                    } 
                }
            }

            if (propertyDescriptors != null && propertyDescriptors.Count > 0) 
            {
                foreach (PropertyDescriptor pd in propertyDescriptors) 
                { 
                    if (IsBindableType(pd.PropertyType))
                    { 
                        String title;
                        ObjectListTitleAttribute attr =
                            (ObjectListTitleAttribute)pd.Attributes[typeof(ObjectListTitleAttribute)];
                        if (attr != null) 
                        {
                            title = attr.Title; 
                        } 
                        else
                        { 
                            title = pd.Name;
                        }
                        list.Add(CreateAutoGeneratedField(title, pd.Name));
                    } 
                }
            } 
 
            _autoGeneratedFields = new ObjectListFieldCollection(this, list);
        } 

        ///  Caches the fact that we have already consumed the first item from the enumeration
        ///  and must use it first during our item creation.
        internal void StoreEnumerator(IEnumerator enumerator, object firstDataItem) 
        {
            _storedEnumerator = enumerator; 
            _firstDataItem = firstDataItem; 
            _storedDataValid = true;
        } 

        private bool IsBindableType(Type type)
        {
            return(type.IsPrimitive || 
                   (type == typeof(String)) ||
                   (type == typeof(DateTime)) || 
                   (type == typeof(Decimal))); 
        }
 
        private ObjectListField CreateAutoGeneratedField(String title, String dataField)
        {
            ObjectListField field = new ObjectListField();
            ((IStateManager)field).TrackViewState(); 
            field.Title = title;
            if (dataField != null) 
            { 
                field.DataField = dataField;
            } 
            else
            {
                field.SelfReference = true;
            } 
            return field;
        } 
 
        Object SaveAutoFieldsState()
        { 
            int autoGeneratedCount = (_autoGeneratedFields != null) ? _autoGeneratedFields.Count : 0;
            if (autoGeneratedCount != 0)
            {
                Object[] fieldStates = new Object[autoGeneratedCount]; 
                for (int i = 0; i < autoGeneratedCount; i++)
                { 
                    fieldStates[i] = ((IStateManager)_autoGeneratedFields[i]).SaveViewState(); 
                }
                return fieldStates; 
            }
            else
            {
                return null; 
            }
        } 
 
        void LoadAutoFieldsState(Object state)
        { 
            if (state != null)
            {
                Object[] fieldStates = (Object[])state;
                int count = fieldStates.Length; 
                ArrayList list = new ArrayList(count);
                foreach (Object fieldState in fieldStates) 
                { 
                    ObjectListField field = new ObjectListField();
                    ((IStateManager)field).TrackViewState(); 
                    ((IStateManager)field).LoadViewState (fieldState);
                    list.Add(field);
                }
                _autoGeneratedFields = new ObjectListFieldCollection(this, list); 
            }
        } 
 
        internal void OnFieldChanged(bool fieldAddedOrRemoved)
        { 
            // Called when a field is added, removed, etc.
            if (IsTrackingViewState)
            {
                _items = null; 
                // avoid view state being out of [....] with fields.
                _ignoreFieldsItemsViewModeViewState = true; 
                if (fieldAddedOrRemoved) 
                {
                    _allFields = null; 
                }
                InvalidateDisplayFieldIndices();
            }
        } 

        ///  
        protected override int InternalItemCount 
        {
            get 
            {
                if (_items != null && Items.Count > 0)
                {
                    return Items.Count; 
                }
                else 
                { 
                    return 0;
                } 
            }

        }
 
        /////////////////////////////////////////////////////////////////////////
        //  EVENT HANDLING 
        ///////////////////////////////////////////////////////////////////////// 

        ///  
        [
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.ObjectList_OnItemDataBind)
        ] 
        public event ObjectListDataBindEventHandler ItemDataBind
        { 
            add 
            {
                Events.AddHandler(EventItemDataBind, value); 
            }
            remove
            {
                Events.RemoveHandler(EventItemDataBind, value); 
            }
        } 
 
        /// 
        protected virtual void OnItemDataBind(ObjectListDataBindEventArgs e) 
        {
            ObjectListDataBindEventHandler onItemDataBindHandler =
                (ObjectListDataBindEventHandler)Events[EventItemDataBind];
            if (onItemDataBindHandler != null) 
            {
                onItemDataBindHandler(this, e); 
            } 
        }
 
        /// 
        [
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.ObjectList_OnItemCommand) 
        ]
        public event ObjectListCommandEventHandler ItemCommand 
        { 
            add
            { 
                Events.AddHandler(EventItemCommand, value);
            }
            remove
            { 
                Events.RemoveHandler(EventItemCommand, value);
            } 
        } 

        ///  
        protected virtual void OnItemCommand(ObjectListCommandEventArgs e)
        {
            ObjectListCommandEventHandler onItemCommandHandler = (ObjectListCommandEventHandler)Events[EventItemCommand];
            if (onItemCommandHandler != null) 
            {
                onItemCommandHandler(this, e); 
            } 
        }
 
        /// 
        [
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.ObjectList_OnItemSelect) 
        ]
        public event ObjectListSelectEventHandler ItemSelect 
        { 
            add
            { 
                Events.AddHandler(EventItemSelect, value);
            }
            remove
            { 
                Events.RemoveHandler(EventItemSelect, value);
            } 
        } 

        ///  
        protected virtual void OnItemSelect(ObjectListSelectEventArgs e)
        {
            ObjectListSelectEventHandler onItemSelectHandler = (ObjectListSelectEventHandler)Events[EventItemSelect];
            if (onItemSelectHandler != null) 
            {
                onItemSelectHandler(this, e); 
            } 
        }
 
        /// 
        [
            Bindable(false),
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public bool HasItemCommandHandler 
        {
            get 
            {
                return Events[EventItemCommand] != null;
            }
        } 

        ///  
        [ 
            MobileCategory(SR.Category_Action),
            MobileSysDescription(SR.ObjectList_OnShowItemCommands) 
        ]
        public event ObjectListShowCommandsEventHandler ShowItemCommands
        {
            add 
            {
                Events.AddHandler(EventShowItemCommands, value); 
            } 
            remove
            { 
                Events.RemoveHandler(EventShowItemCommands, value);
            }
        }
 
        /// 
        protected virtual void OnShowItemCommands(ObjectListShowCommandsEventArgs e) 
        { 
            ObjectListShowCommandsEventHandler onShowItemCommandsHandler
                = (ObjectListShowCommandsEventHandler)Events[EventShowItemCommands]; 
            if (onShowItemCommandsHandler != null)
            {
                onShowItemCommandsHandler(this, e);
            } 
        }
 
        ///  
        protected override bool OnBubbleEvent(Object sender, EventArgs e)
        { 
            bool handled = false;

            if (e is CommandEventArgs)
            { 
                if (e is ObjectListCommandEventArgs)
                { 
                    OnItemCommand((ObjectListCommandEventArgs)e); 
                    handled = true;
                } 
            }

            return handled;
        } 

        ///  
        protected void RaisePostBackEvent(String eventArgument) 
        {
            if (!Adapter.HandlePostBackEvent(eventArgument)) 
            {
                OnItemCommand(new ObjectListCommandEventArgs(Selection, eventArgument));
            }
        } 

        ///  
        public void RaiseDefaultItemEvent(int itemIndex) 
        {
            EnsureItemLoaded (itemIndex); 
            int itemCollIndex = TranslateVirtualItemIndex(itemIndex);
            SelectedIndex = itemIndex;
            OnItemCommand(new ObjectListCommandEventArgs(Items[itemCollIndex], DefaultCommand));
        } 

        ///  
        public bool SelectListItem(int itemIndex, bool selectMore) 
        {
            EnsureItemLoaded (itemIndex); 
            int itemCollIndex = TranslateVirtualItemIndex(itemIndex);

            ObjectListSelectEventArgs args = new ObjectListSelectEventArgs(
                                                        Items[itemCollIndex], 
                                                        selectMore);
            SelectedIndex = itemIndex; 
            OnItemSelect(args); 
            return args.UseDefaultHandling;
        } 

        /// 
        public void PreShowItemCommands(int itemIndex)
        { 
            // Called just before commands are shown for a given item. We call
            // an event handler that can modify (or even replace) the commands collection, 
            // but first we mark the collection, and save it off, so that we can 
            // save the state of the collection at this point.
 
            if (_commands != null)
            {
                _globalCommands = _commands;
                _commands.GlobalStateSet(); 
            }
 
            SelectedIndex = itemIndex; 

            ObjectListShowCommandsEventArgs eventArgs = 
                new ObjectListShowCommandsEventArgs(Selection, Commands);
            OnShowItemCommands(eventArgs);
            if (eventArgs.Commands != _commands)
            { 
                _commands = eventArgs.Commands;
            } 
        } 

        private void EnsureItemLoaded(int virtualIndex) 
        {
            Debug.Assert (virtualIndex >= 0, "virtualIndex < 0");
            if (ItemCount > 0 &&
                    (_items == null || 
                    virtualIndex < Items.BaseIndex ||
                    Items.Count <= virtualIndex - Items.BaseIndex)) 
            { 
                OnLoadItems(new LoadItemsEventArgs(virtualIndex, 1));
            } 
        }

        private int TranslateVirtualItemIndex(int virtualIndex)
        { 
            Debug.Assert(ItemCount > 0 || Items.BaseIndex == 0);
 
            // Translate virtual index to true index within collection. 
            // If custom pagination is off, virtual index is the true index.
            return virtualIndex - Items.BaseIndex; 
        }

        /// 
        protected override void OnLoadItems(LoadItemsEventArgs e) 
        {
            // We should only load items if the base index has changed, or if 
            // the desired items do not exist in the list. Otherwise, we are making 
            // the app reload the same items over and over.
 
            if (e.ItemIndex != Items.BaseIndex || e.ItemCount != Items.Count)
            {
                _loadingItems = true;
                Items.BaseIndex = e.ItemIndex; 
                Items.Clear();
                base.OnLoadItems(e); 
                _loadingItems = false; 
            }
        } 

        /////////////////////////////////////////////////////////////////////////
        //  STATE MANAGEMENT
        ///////////////////////////////////////////////////////////////////////// 

        ///  
        protected override void TrackViewState() 
        {
            base.TrackViewState(); 
            if (_fields != null)
            {
                ((IStateManager)_fields).TrackViewState();
            } 
            if (_commands != null)
            { 
                ((IStateManager)_commands).TrackViewState(); 
            }
            if (_items != null) 
            {
                ((IStateManager)_items).TrackViewState();
            }
        } 

        ///  
        protected override Object SavePrivateViewState() 
        {
            Object baseState = base.SavePrivateViewState(); 
            if (ViewMode != ObjectListViewMode.List || _selectedIndexDirty)
            {
                return new Triplet(baseState, (int) ViewMode, SelectedIndex);
            } 
            else if (baseState != null)
            { 
                return baseState; 
            }
            return null; 
        }

        /// 
        protected override void LoadPrivateViewState(Object state) 
        {
            if (state != null) 
            { 
                Triplet stateTriplet = state as Triplet;
                if (stateTriplet != null) 
                {
                    base.LoadPrivateViewState (stateTriplet.First);
                    ObjectListViewMode originalViewMode = _viewMode;
 
                    // use private field because property get calls CreateChildControls.
                    _viewMode = (ObjectListViewMode) stateTriplet.Second; 
 
                    // use property to insure we load items if necessary and set selected index dirty.
                    SelectedIndex = (int)stateTriplet.Third; 

                    bool viewModeChanged = (originalViewMode != _viewMode);
                    if (ChildControlsCreated && viewModeChanged)
                    { 
                        // This is before items loaded in LVS, so we only do this if
                        // child controls already created in init (e.g., no VS.) 
                        CreateChildControls (true); 
                    }
                } 
                else
                {
                    base.LoadPrivateViewState(state);
                } 
            }
        } 
 
        /// 
        protected override Object SaveViewState() 
        {
            Object baseState, fieldsState, autoFieldsState, commandsState, itemsState;

            Debug.Assert (Items != null, "get_Items should initialize Items collection."); 
            int count = Items.Count;
            // HasControls implies DataBound on this or a prev req (but not converse). 
            if (count > 0 || HasControls()) 
            {
                ViewState[_itemCountViewStateKey] = count; 
            }
            baseState = base.SaveViewState();
            fieldsState = (_fields != null) ? ((IStateManager)_fields).SaveViewState() : null;
            autoFieldsState = SaveAutoFieldsState(); 
            commandsState = (_commands != null) ? ((IStateManager)_commands).SaveViewState() : null;
            itemsState = (_items != null) ? ((IStateManager)_items).SaveViewState() : null; 
 
            if (itemsState != null ||
                fieldsState != null || 
                autoFieldsState != null ||
                commandsState != null )
            {
                return new Object[5] 
                {
                    baseState, 
                    fieldsState, 
                    autoFieldsState,
                    commandsState, 
                    itemsState
                };
            }
            else if (baseState != null) 
            {
                return new Object[1] { baseState }; 
            } 
            return null;
        } 

        /// 
        protected override void LoadViewState(Object savedState)
        { 
            // copy locally (can change during Fields.LVS).
            bool ignoreFieldsItemsViewModeViewState = _ignoreFieldsItemsViewModeViewState; 
            if (savedState != null) 
            {
                Object[] state = (Object[])savedState; 
                base.LoadViewState(state[0]);

                if (state.Length > 1)
                { 
                    // Always load items after loading fields, because field changes can wipe out
                    // items! 
                    if(!ignoreFieldsItemsViewModeViewState) 
                    {
                        ((IStateManager)Fields).LoadViewState(state[1]); 
                        LoadAutoFieldsState(state[2]);
                    }
                    ((IStateManager)Commands).LoadViewState(state[3]);
                    if(!ignoreFieldsItemsViewModeViewState) 
                    {
                        ((IStateManager)Items).LoadViewState(state[4]); 
                        SelectItemIfLoaded(SelectedIndex); 
                    }
                } 
            }
        }

        ///  
        [
            Bindable(false), 
            Browsable(false), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ] 
        public ObjectListViewMode ViewMode
        {
            get
            { 
                return _viewMode;
            } 
            set 
            {
                if (SelectedIndex == -1 && value != ObjectListViewMode.List) 
                {
                    throw new Exception(SR.GetString(
                        SR.ObjectList_CannotSetViewModeWithNoSelectedItem));
                } 
                if (value == ObjectListViewMode.List)
                { 
                    // Set pagination state changed to refresh pagination. 
                    Form.PaginationStateChanged = true;
                } 
                _viewMode = value;
                CreateChildControls(true);
            }
        } 

        ///  
        [ 
            Bindable(true),
            Browsable(true), 
            DefaultValue(""),
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.ObjectList_DetailsCommandText),
        ] 
        public String DetailsCommandText
        { 
            get 
            {
                String detailsCommandText = (String)ViewState["DetailsCommandText"]; 
                return detailsCommandText != null ? detailsCommandText : String.Empty;
            }
            set
            { 
                ViewState["DetailsCommandText"] = value;
            } 
        } 

        ///  
        [
            Bindable(true),
            Browsable(true),
            DefaultValue(""), 
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.ObjectList_BackCommandText), 
        ] 
        public String BackCommandText
        { 
            get
            {
                String backCommandText = (String) ViewState["BackCommandText"];
                return backCommandText != null ? backCommandText : String.Empty; 
            }
            set 
            { 
                ViewState["BackCommandText"] = value;
            } 
        }

        /// 
        [ 
            Bindable(true),
            Browsable(true), 
            DefaultValue(""), 
            MobileCategory(SR.Category_Appearance),
            MobileSysDescription(SR.ObjectList_MoreText) 
        ]
        public String MoreText
        {
            get 
            {
                String moreText = (String)ViewState["MoreText"]; 
                return moreText != null ? moreText : String.Empty; 
            }
            set 
            {
                ViewState["MoreText"] = value;
            }
        } 

        ///  
        [ 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
            MobileCategory(SR.Category_Style), 
            MobileSysDescription(SR.ObjectList_CommandStyle),
            NotifyParentProperty(true)
        ]
        public Style CommandStyle 
        {
            get 
            { 
                if (_commandStyle == null)
                { 
                    _commandStyle = new Style();
                    _commandStyle.SetControl(this);
                    _commandStyle.StyleReference = "subcommand";
                } 
                return _commandStyle;
            } 
            set 
            {
                _commandStyle = value; 
            }
        }

        ///  
        [
            DefaultValue(null), 
            DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
            MobileCategory(SR.Category_Style),
            MobileSysDescription(SR.ObjectList_LabelStyle), 
            NotifyParentProperty(true)
        ]
        public Style LabelStyle
        { 
            get
            { 
                if (_labelStyle == null) 
                {
                    _labelStyle = new Style(); 
                    _labelStyle.SetControl(this);
                    _labelStyle.StyleReference = "title";
                }
                return _labelStyle; 
            }
            set 
            { 
                _labelStyle = value;
            } 
        }

        internal override void InvalidateParentStyles()
        { 
            if (_commandStyle != null)
            { 
                _commandStyle.InvalidateParentStyle(); 
            }
            if (_labelStyle != null) 
            {
                _labelStyle.InvalidateParentStyle();
            }
            base.InvalidateParentStyles(); 
        }
 
        internal override void InternalItemCountChangedHandler(int newItemCount) 
        {
            if (newItemCount == 0) 
            {
                ClearItemsAndControls();
            }
        } 

        private void ClearItemsAndControls() 
        { 
            ViewMode = ObjectListViewMode.List;
            SelectedIndex = -1; 
            Items.Clear();
            Controls.Clear();
        }
 
        // Wrapper to increase intelligibility at point of call.
        private void SelectItemIfLoaded(int virtualIndex) 
        { 
            SetItemSelectedPropertyIfItemLoaded(virtualIndex, true);
        } 

        // Wrapper to increase intelligibility at point of call.
        private void DeselectItemIfLoaded(int virtualIndex)
        { 
            SetItemSelectedPropertyIfItemLoaded(virtualIndex, false);
        } 
 
        private void SetItemSelectedPropertyIfItemLoaded(int virtualIndex, bool newValue)
        { 
            if (virtualIndex < 0)
            {
                return;
            } 
            int physicalIndex = TranslateVirtualItemIndex(virtualIndex);
            if (physicalIndex >= 0 && physicalIndex < Items.Count) 
            { 
                Items[physicalIndex].Selected = newValue;
            } 
        }

        #region IPostBackEventHandler implementation
        void IPostBackEventHandler.RaisePostBackEvent(String eventArgument) { 
            RaisePostBackEvent(eventArgument);
        } 
        #endregion 
    }
 

    /*
     * Control builder for object lists.
     * 
     * 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 class ObjectListControlBuilder : MobileControlBuilder
    { 
        /// 
        public override Type GetChildControlType(String tagName, IDictionary attributes) 
        { 
            if (String.Compare(tagName, "Field", StringComparison.OrdinalIgnoreCase) == 0)
            { 
                return typeof(ObjectListField);
            }
            else if (String.Compare(tagName, "Command", StringComparison.OrdinalIgnoreCase) == 0)
            { 
                return typeof(ObjectListCommand);
            } 
            else 
            {
                return base.GetChildControlType(tagName, attributes); 
            }
        }
    }
} 

// 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