// Author:
// Sebastien Pouliot <sebastien@ximian.com>
//
-// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2005-2010 Novell, Inc (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
using System.ComponentModel;
using System.Security.Permissions;
-namespace System.Web.UI.WebControls {
-
+namespace System.Web.UI.WebControls
+{
// CAS
[AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[DefaultEvent ("SelectedIndexChanged")]
[DefaultProperty ("DataSource")]
[Designer ("System.Web.UI.Design.WebControls.BaseDataListDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
- public abstract class BaseDataList : WebControl {
+ public abstract class BaseDataList : WebControl
+ {
+ static readonly object selectedIndexChangedEvent = new object ();
- private static readonly object selectedIndexChangedEvent = new object ();
+ DataKeyCollection keycoll;
+ object source;
- private DataKeyCollection keycoll;
- private object source;
-#if NET_2_0
- //private string dataSourceId;
+ //string dataSourceId;
IDataSource boundDataSource = null;
- private bool initialized;
- private bool requiresDataBinding;
- private DataSourceSelectArguments selectArguments;
- private IEnumerable data;
-#endif
+ bool initialized;
+ bool requiresDataBinding;
+ DataSourceSelectArguments selectArguments;
+ IEnumerable data;
protected BaseDataList ()
{
[DefaultValue ("")]
-#if NET_2_0
[Localizable (true)]
-#endif
[WebSysDescription ("")]
[WebCategory ("Accessibility")]
public virtual string Caption {
- get { return ViewState.GetString ("Caption", ""); }
+ get { return ViewState.GetString ("Caption", String.Empty); }
set {
if (value == null)
ViewState.Remove ("Caption");
}
}
-#if ONLY_1_1
- [Bindable (true)]
-#endif
[DefaultValue (-1)]
[WebSysDescription("")]
[WebCategory("Layout")]
set { TableStyle.CellPadding = value; }
}
-#if ONLY_1_1
- [Bindable (true)]
-#endif
[DefaultValue (0)]
[WebSysDescription("")]
[WebCategory("Layout")]
}
[DefaultValue ("")]
-#if NET_2_0
[Themeable (false)]
-#endif
[MonoTODO ("incomplete")]
[WebSysDescription("")]
[WebCategory("Data")]
public virtual string DataKeyField {
- get { return ViewState.GetString ("DataKeyField", ""); }
+ get { return ViewState.GetString ("DataKeyField", String.Empty); }
set {
if (value == null)
ViewState.Remove ("DataKeyField");
}
[DefaultValue ("")]
-#if NET_2_0
[Themeable (false)]
-#endif
[WebSysDescription("")]
[WebCategory("Data")]
public string DataMember {
- get { return ViewState.GetString ("DataMember", ""); }
+ get { return ViewState.GetString ("DataMember", String.Empty); }
set {
if (value == null)
ViewState.Remove ("DataMember");
else
ViewState ["DataMember"] = value;
-#if NET_2_0
- if (!Initialized)
- OnDataPropertyChanged ();
-#endif
+ OnDataPropertyChanged ();
}
}
[Bindable (true)]
[DefaultValue (null)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
-#if NET_2_0
[Themeable (false)]
-#endif
[WebSysDescription("")]
[WebCategory("Data")]
- public virtual object DataSource {
+ public virtual object DataSource {
get { return source; }
set {
if ((value == null) || (value is IEnumerable) || (value is IListSource)) {
-#if NET_2_0
-// FIXME - can't duplicate in a test case ? LAMESPEC ?
-// can't duplicate in a test case
-// if ((dataSourceId != null) && (dataSourceId.Length != 0))
-// throw new HttpException (Locale.GetText ("DataSourceID is already set."));
+ // FIXME - can't duplicate in a test case ? LAMESPEC ?
+ // can't duplicate in a test case
+ // if ((dataSourceId != null) && (dataSourceId.Length != 0))
+ // throw new HttpException (Locale.GetText ("DataSourceID is already set."));
source = value;
- if (!Initialized)
- OnDataPropertyChanged ();
-#else
- source = value;
-#endif
+ OnDataPropertyChanged ();
+
} else {
string msg = Locale.GetText ("Invalid data source. This requires an object implementing {0} or {1}.",
- "IEnumerable", "IListSource");
+ "IEnumerable", "IListSource");
throw new ArgumentException (msg);
}
}
}
-#if ONLY_1_1
- [Bindable (true)]
-#endif
[DefaultValue (GridLines.Both)]
[WebSysDescription("")]
[WebCategory("Appearance")]
set { TableStyle.GridLines = value; }
}
-#if ONLY_1_1
- [Bindable (true)]
-#endif
[Category ("Layout")]
[DefaultValue (HorizontalAlign.NotSet)]
[WebSysDescription("")]
get { return ViewState.GetBool ("UseAccessibleHeader", false); }
set { ViewState ["UseAccessibleHeader"] = value; }
}
-#if NET_2_0
+
[DefaultValue ("")]
[IDReferenceProperty (typeof (DataSourceControl))]
[Themeable (false)]
public virtual string DataSourceID {
- get { return ViewState.GetString ("DataSourceID", ""); }
+ get { return ViewState.GetString ("DataSourceID", String.Empty); }
set {
// LAMESPEC ? this is documented as an HttpException in beta2
if (source != null)
ViewState ["DataSourceID"] = value;
- if (!Initialized)
- OnDataPropertyChanged ();
+ OnDataPropertyChanged ();
}
}
return selectArguments;
}
}
-#endif
- private TableStyle TableStyle {
+ public override bool SupportsDisabledAttribute {
+ get { return RenderingCompatibilityLessThan40; }
+ }
+ TableStyle TableStyle {
// this will throw an InvalidCasException just like we need
get { return (TableStyle) ControlStyle; }
}
}
// see Kothari, page 435
-#if NET_2_0
- protected internal
-#else
- protected
-#endif
- override void CreateChildControls ()
+ protected internal override void CreateChildControls ()
{
// We are recreating the children from viewstate
if (HasControls ())
- Controls.Clear();
+ base.Controls.Clear();
- // If presents, build the children from the viewstate
- if (ViewState ["Items"] != null)
+ if (IsDataBound)
CreateControlHierarchy (false);
+ else if (RequiresDataBinding)
+ EnsureDataBound ();
}
protected abstract void CreateControlHierarchy (bool useDataSource);
// Indicate that child controls have been created, preventing
// CreateChildControls from getting called.
ChildControlsCreated = true;
+ RequiresDataBinding = false;
+ IsDataBound = true;
}
-#if NET_2_0
+
protected virtual DataSourceSelectArguments CreateDataSourceSelectArguments ()
{
return DataSourceSelectArguments.Empty;
DataBind ();
}
- private void SelectCallback (IEnumerable data)
+ void SelectCallback (IEnumerable data)
{
this.data = data;
}
dsv.Select (SelectArguments, new DataSourceViewSelectCallback (SelectCallback));
return data;
}
-#endif
+
+ bool IsDataBound {
+ get {
+ return ViewState.GetBool ("_DataBound", false);
+ }
+ set {
+ ViewState ["_DataBound"] = value;
+ }
+ }
protected override void OnDataBinding (EventArgs e)
{
base.OnDataBinding (e);
}
-#if NET_2_0
+
protected virtual void OnDataPropertyChanged ()
{
+ if (Initialized)
+ RequiresDataBinding = true;
}
protected virtual void OnDataSourceViewChanged (object sender, EventArgs e)
protected internal override void OnInit (EventArgs e)
{
base.OnInit (e);
- }
+ Page page = Page;
+ if (page != null) {
+ page.PreLoad += new EventHandler (OnPagePreLoad);
+ if (!IsViewStateEnabled && page.IsPostBack)
+ RequiresDataBinding = true;
+ }
+ }
+
+ void OnPagePreLoad (object sender, EventArgs e)
+ {
+ if (!Initialized)
+ Initialize ();
+ }
+
protected internal override void OnLoad (EventArgs e)
{
- if ((Page != null) && !Page.IsPostBack)
- RequiresDataBinding = true;
+ if (!Initialized)
+ Initialize ();
+
+ base.OnLoad (e);
+ }
+
+ void Initialize ()
+ {
+ Page page = Page;
+ if (page != null) {
+ if (!page.IsPostBack || (IsViewStateEnabled && !IsDataBound))
+ RequiresDataBinding = true;
+ }
if (IsBoundUsingDataSourceID)
ConnectToDataSource ();
initialized = true;
- base.OnLoad (e);
}
protected internal override void OnPreRender (EventArgs e)
EnsureDataBound ();
base.OnPreRender (e);
}
-#endif
+
protected virtual void OnSelectedIndexChanged (EventArgs e)
{
EventHandler selectedIndexChanged = (EventHandler) Events [selectedIndexChangedEvent];
protected abstract void PrepareControlHierarchy ();
-#if NET_2_0
- protected internal
-#else
- protected
-#endif
- override void Render (HtmlTextWriter writer)
+ protected internal override void Render (HtmlTextWriter writer)
{
PrepareControlHierarchy ();
// don't call base class or RenderBegin|EndTag
RenderContents (writer);
}
-
[WebSysDescription("")]
[WebCategory("Action")]
public event EventHandler SelectedIndexChanged {
remove { Events.RemoveHandler (selectedIndexChangedEvent, value); }
}
-
static public bool IsBindableType (Type type)
{
// I can't believe how many NRE are possible in System.Web
throw new NullReferenceException ();
switch (Type.GetTypeCode (type)) {
- case TypeCode.Boolean:
- case TypeCode.Byte:
- case TypeCode.SByte:
- case TypeCode.Int16:
- case TypeCode.UInt16:
- case TypeCode.Int32:
- case TypeCode.UInt32:
- case TypeCode.Int64:
- case TypeCode.UInt64:
- case TypeCode.Char:
- case TypeCode.Double:
- case TypeCode.Single:
- case TypeCode.DateTime:
- case TypeCode.Decimal:
- case TypeCode.String:
- return true;
- default:
- return false;
+ case TypeCode.Boolean:
+ case TypeCode.Byte:
+ case TypeCode.SByte:
+ case TypeCode.Int16:
+ case TypeCode.UInt16:
+ case TypeCode.Int32:
+ case TypeCode.UInt32:
+ case TypeCode.Int64:
+ case TypeCode.UInt64:
+ case TypeCode.Char:
+ case TypeCode.Double:
+ case TypeCode.Single:
+ case TypeCode.DateTime:
+ case TypeCode.Decimal:
+ case TypeCode.String:
+ return true;
+ default:
+ return false;
}
}
-#if NET_2_0
void ConnectToDataSource ()
{
if (NamingContainer != null)
DataSourceView dsv = boundDataSource.GetView (String.Empty);
dsv.DataSourceViewChanged += new EventHandler (OnDataSourceViewChanged);
}
-#endif
}
}