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\">{0}:ObjectList>"), 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\">{0}:ObjectList>"), 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
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- WebServiceEnumData.cs
- OLEDB_Util.cs
- RemoteWebConfigurationHostStream.cs
- clipboard.cs
- XmlCodeExporter.cs
- GlobalProxySelection.cs
- DrawListViewSubItemEventArgs.cs
- ZipIOBlockManager.cs
- Freezable.cs
- WebPartAuthorizationEventArgs.cs
- EnumerableRowCollectionExtensions.cs
- UnsafeNativeMethods.cs
- LinearGradientBrush.cs
- XmlTypeAttribute.cs
- AsyncOperation.cs
- HttpApplicationFactory.cs
- SemanticResolver.cs
- XmlResolver.cs
- GridEntryCollection.cs
- WebBrowserBase.cs
- ExpandoClass.cs
- milexports.cs
- CollectionView.cs
- GridProviderWrapper.cs
- DbConnectionPoolGroup.cs
- TableItemPatternIdentifiers.cs
- StrongName.cs
- Timer.cs
- PathFigureCollectionConverter.cs
- InvalidDataException.cs
- FormClosingEvent.cs
- ComponentEditorPage.cs
- RegisteredDisposeScript.cs
- AsmxEndpointPickerExtension.cs
- SamlSubject.cs
- ScrollProperties.cs
- TextOutput.cs
- ContentPresenter.cs
- MemberAccessException.cs
- SqlCacheDependency.cs
- DrawTreeNodeEventArgs.cs
- ListItemParagraph.cs
- AffineTransform3D.cs
- WindowsSecurityToken.cs
- SqlConnectionString.cs
- HttpProtocolReflector.cs
- PenContexts.cs
- XmlComplianceUtil.cs
- VariantWrapper.cs
- loginstatus.cs
- SingleKeyFrameCollection.cs
- UnicodeEncoding.cs
- D3DImage.cs
- MouseButtonEventArgs.cs
- BufferedStream.cs
- TagPrefixCollection.cs
- BrowserDefinitionCollection.cs
- RepeatInfo.cs
- EncoderBestFitFallback.cs
- Compensate.cs
- BinaryObjectWriter.cs
- LineSegment.cs
- MediaTimeline.cs
- XmlDataContract.cs
- ThreadSafeMessageFilterTable.cs
- XXXInfos.cs
- WmlTextViewAdapter.cs
- WebPartHelpVerb.cs
- QueryOutputWriter.cs
- SoapWriter.cs
- EntityProviderFactory.cs
- XmlUrlResolver.cs
- WpfGeneratedKnownProperties.cs
- ReachPageContentCollectionSerializerAsync.cs
- RectangleGeometry.cs
- GlyphRunDrawing.cs
- QilSortKey.cs
- AssemblyCollection.cs
- ArgumentReference.cs
- TextMarkerSource.cs
- OverrideMode.cs
- TableLayoutColumnStyleCollection.cs
- SafeNativeMethods.cs
- Vector3DConverter.cs
- CodeMethodInvokeExpression.cs
- CodeDOMProvider.cs
- CommandDevice.cs
- GetPageCompletedEventArgs.cs
- TargetInvocationException.cs
- PageRequestManager.cs
- OleDbReferenceCollection.cs
- ZipIOZip64EndOfCentralDirectoryBlock.cs
- X509Certificate2.cs
- OdbcInfoMessageEvent.cs
- XmlDataSourceDesigner.cs
- UpdatePanelControlTrigger.cs
- SaveRecipientRequest.cs
- CompModSwitches.cs
- TemplatePartAttribute.cs
- ReaderWriterLockWrapper.cs