e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
555 lines
18 KiB
C#
555 lines
18 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="SelectionList.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Drawing.Design;
|
|
using System.Web;
|
|
using System.Web.UI;
|
|
using System.Web.UI.WebControls;
|
|
using System.Web.UI.HtmlControls;
|
|
using System.Runtime.Serialization;
|
|
using System.Security.Permissions;
|
|
|
|
namespace System.Web.UI.MobileControls
|
|
{
|
|
/*
|
|
* Mobile SelectionList class.
|
|
*
|
|
* Copyright (c) 2000 Microsoft Corporation
|
|
*/
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList"]/*' />
|
|
[
|
|
ControlBuilderAttribute(typeof(ListControlBuilder)),
|
|
DefaultEvent("SelectedIndexChanged"),
|
|
DefaultProperty("DataSource"),
|
|
Designer(typeof(System.Web.UI.Design.MobileControls.SelectionListDesigner)),
|
|
DesignerAdapter(typeof(System.Web.UI.Design.MobileControls.Adapters.DesignerSelectionListAdapter)),
|
|
Editor(typeof(System.Web.UI.Design.MobileControls.SelectionListComponentEditor), typeof(ComponentEditor)),
|
|
ToolboxData("<{0}:SelectionList runat=\"server\"></{0}:SelectionList>"),
|
|
ToolboxItem("System.Web.UI.Design.WebControlToolboxItem, " + AssemblyRef.SystemDesign),
|
|
ValidationProperty("Selection")
|
|
]
|
|
[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 SelectionList : MobileControl, IPostBackDataHandler, IListControl
|
|
{
|
|
private static readonly Object EventItemDataBind = new Object();
|
|
private static readonly Object EventSelectedIndexChanged = new Object();
|
|
|
|
private ListDataHelper _dataHelper;
|
|
private int _cachedSelectedIndex = -1;
|
|
|
|
private ListDataHelper DataHelper {
|
|
get {
|
|
if (_dataHelper == null) {
|
|
_dataHelper = new ListDataHelper(this, ViewState);
|
|
}
|
|
|
|
return _dataHelper;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// IListControl
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.IListControl.OnItemDataBind"]/*' />
|
|
/// <internalonly/>
|
|
void IListControl.OnItemDataBind(ListDataBindEventArgs e)
|
|
{
|
|
OnItemDataBind(e);
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.IListControl.TrackingViewState"]/*' />
|
|
/// <internalonly/>
|
|
bool IListControl.TrackingViewState
|
|
{
|
|
get
|
|
{
|
|
return IsTrackingViewState;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.DataSource"]/*' />
|
|
/// <summary>
|
|
/// <para>
|
|
/// Gets or sets the <see langword='DataSource'/> property of the control which is used to populate
|
|
/// the items within the control.
|
|
/// </para>
|
|
/// </summary>
|
|
[
|
|
Bindable(true),
|
|
DefaultValue(null),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|
MobileCategory(SR.Category_Data),
|
|
MobileSysDescription(SR.List_DataSource)
|
|
]
|
|
public virtual Object DataSource
|
|
{
|
|
get
|
|
{
|
|
return DataHelper.DataSource;
|
|
}
|
|
|
|
set
|
|
{
|
|
DataHelper.DataSource = value;
|
|
}
|
|
}
|
|
|
|
private IEnumerable ResolvedDataSource
|
|
{
|
|
get
|
|
{
|
|
return DataHelper.ResolvedDataSource;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.DataMember"]/*' />
|
|
[
|
|
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
|
|
{
|
|
return DataHelper.DataMember;
|
|
}
|
|
|
|
set
|
|
{
|
|
DataHelper.DataMember = value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.DataTextField"]/*' />
|
|
[
|
|
DefaultValue(""),
|
|
MobileCategory(SR.Category_Data),
|
|
MobileSysDescription(SR.List_DataTextField),
|
|
TypeConverter(typeof(System.Web.UI.Design.MobileControls.Converters.DataFieldConverter))
|
|
]
|
|
public String DataTextField
|
|
{
|
|
get
|
|
{
|
|
return DataHelper.DataTextField;
|
|
}
|
|
set
|
|
{
|
|
DataHelper.DataTextField = value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.DataValueField"]/*' />
|
|
[
|
|
DefaultValue(""),
|
|
MobileCategory(SR.Category_Data),
|
|
MobileSysDescription(SR.List_DataValueField),
|
|
TypeConverter(typeof(System.Web.UI.Design.MobileControls.Converters.DataFieldConverter))
|
|
]
|
|
public String DataValueField
|
|
{
|
|
get
|
|
{
|
|
return DataHelper.DataValueField;
|
|
}
|
|
set
|
|
{
|
|
DataHelper.DataValueField = value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.IsMultiSelect"]/*' />
|
|
[
|
|
Bindable(false),
|
|
Browsable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
|
|
]
|
|
public bool IsMultiSelect
|
|
{
|
|
get
|
|
{
|
|
return (SelectType == ListSelectType.MultiSelectListBox ||
|
|
SelectType == ListSelectType.CheckBox);
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.Rows"]/*' />
|
|
[
|
|
Bindable(true),
|
|
Browsable(true),
|
|
DefaultValue(4),
|
|
MobileCategory(SR.Category_Appearance),
|
|
MobileSysDescription(SR.SelectionList_Rows)
|
|
]
|
|
public int Rows
|
|
{
|
|
get
|
|
{
|
|
Object o = ViewState["Rows"];
|
|
return o != null ? (int)o : 4;
|
|
}
|
|
set
|
|
{
|
|
if (value < 1)
|
|
{
|
|
throw new ArgumentOutOfRangeException("value");
|
|
}
|
|
ViewState["Rows"] = value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.SelectedIndex"]/*' />
|
|
[
|
|
Bindable(false),
|
|
Browsable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
|
|
]
|
|
public int SelectedIndex
|
|
{
|
|
get
|
|
{
|
|
for (int i = 0; i < Items.Count; i++)
|
|
{
|
|
if (Items[i].Selected)
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
set
|
|
{
|
|
// if we have no items, save the selectedindex
|
|
// for later databinding
|
|
if (Items.Count == 0)
|
|
{
|
|
_cachedSelectedIndex = value;
|
|
}
|
|
else
|
|
{
|
|
if (value < -1 || value >= Items.Count)
|
|
{
|
|
throw new ArgumentOutOfRangeException(
|
|
"SelectedIndex",
|
|
SR.GetString(SR.SelectionList_OutOfRange,value));
|
|
}
|
|
ClearSelection();
|
|
if (value >= 0)
|
|
{
|
|
Items[value].Selected = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.Selection"]/*' />
|
|
[
|
|
Bindable(false),
|
|
Browsable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|
]
|
|
public MobileListItem Selection
|
|
{
|
|
get
|
|
{
|
|
int selectedIndex = SelectedIndex;
|
|
if (selectedIndex >= 0 && selectedIndex < Items.Count)
|
|
{
|
|
return Items[selectedIndex];
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.Items"]/*' />
|
|
[
|
|
Bindable(false),
|
|
DefaultValue(null),
|
|
Editor(typeof(System.Web.UI.Design.MobileControls.ItemCollectionEditor), typeof(UITypeEditor)),
|
|
MergableProperty(false),
|
|
MobileSysDescription(SR.List_Items),
|
|
PersistenceMode(PersistenceMode.InnerDefaultProperty)
|
|
]
|
|
public MobileListItemCollection Items
|
|
{
|
|
get
|
|
{
|
|
return DataHelper.Items;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.AddParsedSubObject"]/*' />
|
|
protected override void AddParsedSubObject(Object obj)
|
|
{
|
|
if (!(obj is LiteralControl))
|
|
{
|
|
if (obj is MobileListItem)
|
|
{
|
|
DataHelper.AddItem((MobileListItem)obj);
|
|
if(_cachedSelectedIndex != -1 &&
|
|
DataHelper.Items.Count > _cachedSelectedIndex)
|
|
{
|
|
SelectedIndex = _cachedSelectedIndex;
|
|
_cachedSelectedIndex = -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
base.AddParsedSubObject(obj);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.OnPreRender"]/*' />
|
|
protected override void OnPreRender(EventArgs e)
|
|
{
|
|
base.OnPreRender(e);
|
|
if (Page != null && IsMultiSelect)
|
|
{
|
|
// ensure postback when no item is selected
|
|
Page.RegisterRequiresPostBack(this);
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.OnDataBinding"]/*' />
|
|
protected override void OnDataBinding(EventArgs e)
|
|
{
|
|
base.OnDataBinding(e);
|
|
|
|
if (ResolvedDataSource != null)
|
|
{
|
|
CreateItems(ResolvedDataSource);
|
|
}
|
|
|
|
if (_cachedSelectedIndex != -1)
|
|
{
|
|
SelectedIndex = _cachedSelectedIndex;
|
|
_cachedSelectedIndex = -1;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.CreateItems"]/*' />
|
|
protected virtual void CreateItems(IEnumerable dataSource)
|
|
{
|
|
DataHelper.CreateItems(dataSource);
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.SelectedIndexChanged"]/*' />
|
|
[
|
|
MobileCategory(SR.Category_Action),
|
|
MobileSysDescription(SR.SelectionList_OnSelectedIndexChanged)
|
|
]
|
|
public event EventHandler SelectedIndexChanged
|
|
{
|
|
add
|
|
{
|
|
Events.AddHandler(EventSelectedIndexChanged, value);
|
|
}
|
|
remove
|
|
{
|
|
Events.RemoveHandler(EventSelectedIndexChanged, value);
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.OnSelectedIndexChanged"]/*' />
|
|
protected virtual void OnSelectedIndexChanged(EventArgs e)
|
|
{
|
|
EventHandler onSelectedIndexChangedHandler = (EventHandler)Events[EventSelectedIndexChanged];
|
|
if (onSelectedIndexChangedHandler != null)
|
|
{
|
|
onSelectedIndexChangedHandler(this, e);
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.ItemDataBind"]/*' />
|
|
[
|
|
MobileCategory(SR.Category_Action),
|
|
MobileSysDescription(SR.List_OnItemDataBind)
|
|
]
|
|
public event ListDataBindEventHandler ItemDataBind
|
|
{
|
|
add
|
|
{
|
|
Events.AddHandler(EventItemDataBind, value);
|
|
}
|
|
remove
|
|
{
|
|
Events.RemoveHandler(EventItemDataBind, value);
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.OnItemDataBind"]/*' />
|
|
protected virtual void OnItemDataBind(ListDataBindEventArgs e)
|
|
{
|
|
ListDataBindEventHandler onItemDataBindHandler = (ListDataBindEventHandler)Events[EventItemDataBind];
|
|
if (onItemDataBindHandler != null)
|
|
{
|
|
onItemDataBindHandler(this, e);
|
|
}
|
|
}
|
|
|
|
/// <internalonly/>
|
|
protected bool LoadPostData(String postDataKey, NameValueCollection postCollection)
|
|
{
|
|
bool dataChanged;
|
|
bool handledByAdapter =
|
|
Adapter.LoadPostData(postDataKey,
|
|
postCollection,
|
|
SelectedIndicesInternal.ToArray(typeof(int)),
|
|
out dataChanged);
|
|
|
|
if (!handledByAdapter)
|
|
{
|
|
throw new
|
|
Exception(SR.GetString(SR.SelectionList_AdapterNotHandlingLoadPostData));
|
|
}
|
|
|
|
return dataChanged;
|
|
}
|
|
|
|
/// <internalonly/>
|
|
protected void RaisePostDataChangedEvent()
|
|
{
|
|
OnSelectedIndexChanged(EventArgs.Empty);
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.SelectType"]/*' />
|
|
[
|
|
Bindable(true),
|
|
DefaultValue(ListSelectType.DropDown),
|
|
MobileCategory(SR.Category_Appearance),
|
|
MobileSysDescription(SR.SelectionList_SelectType)
|
|
]
|
|
public ListSelectType SelectType
|
|
{
|
|
get
|
|
{
|
|
Object o = ViewState["SelectType"];
|
|
return (o != null) ? (ListSelectType)o : ListSelectType.DropDown;
|
|
}
|
|
set
|
|
{
|
|
ViewState["SelectType"] = value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.Title"]/*' />
|
|
[
|
|
Bindable(true),
|
|
DefaultValue(""),
|
|
MobileCategory(SR.Category_Appearance),
|
|
MobileSysDescription(SR.Input_Title)
|
|
]
|
|
public String Title
|
|
{
|
|
get
|
|
{
|
|
return ToString(ViewState["Title"]);
|
|
}
|
|
set
|
|
{
|
|
ViewState["Title"] = value;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// STATE MANAGEMENT
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.TrackViewState"]/*' />
|
|
protected override void TrackViewState()
|
|
{
|
|
base.TrackViewState();
|
|
if (DataHelper.HasItems())
|
|
{
|
|
((IStateManager)Items).TrackViewState();
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.SaveViewState"]/*' />
|
|
protected override Object SaveViewState()
|
|
{
|
|
Object baseState = base.SaveViewState();
|
|
Items.SaveSelection = true;
|
|
Object items = ((IStateManager)Items).SaveViewState();
|
|
|
|
if (items != null || baseState != null)
|
|
{
|
|
return new Object[] { baseState, items };
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/// <include file='doc\SelectionList.uex' path='docs/doc[@for="SelectionList.LoadViewState"]/*' />
|
|
protected override void LoadViewState(Object savedState)
|
|
{
|
|
if (savedState != null)
|
|
{
|
|
Object[] state = (Object[])savedState;
|
|
if (state[0] != null)
|
|
{
|
|
base.LoadViewState(state[0]);
|
|
}
|
|
|
|
// restore state of items
|
|
Items.SaveSelection = true;
|
|
((IStateManager)Items).LoadViewState(state[1]);
|
|
}
|
|
}
|
|
|
|
private ArrayList SelectedIndicesInternal
|
|
{
|
|
get
|
|
{
|
|
int count = Items.Count;
|
|
ArrayList selectedIndices = new ArrayList(count);
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
if (Items[i].Selected)
|
|
{
|
|
selectedIndices.Add(i);
|
|
}
|
|
}
|
|
return selectedIndices;
|
|
}
|
|
}
|
|
|
|
internal void ClearSelection()
|
|
{
|
|
for (int i = 0; i < Items.Count; i++)
|
|
{
|
|
Items[i].Selected = false;
|
|
}
|
|
}
|
|
|
|
#region IPostBackDataHandler implementation
|
|
bool IPostBackDataHandler.LoadPostData(String key, NameValueCollection data) {
|
|
return LoadPostData(key, data);
|
|
}
|
|
|
|
void IPostBackDataHandler.RaisePostDataChangedEvent() {
|
|
RaisePostDataChangedEvent();
|
|
}
|
|
#endregion
|
|
}
|
|
}
|