[bcl] Rename variables to avoid conflict with later renames
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / BaseDataBoundControl.cs
index b00479685ba414bcd153134d3284d6d9e9109553..e255f407852cc6333c1cddeea183ceac73cadeae 100644 (file)
@@ -4,7 +4,7 @@
 // Authors:
 //     Lluis Sanchez Gual (lluis@novell.com)
 //
-// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004-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
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
 using System.Collections;
 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)]
@@ -41,13 +40,19 @@ namespace System.Web.UI.WebControls {
        [DesignerAttribute ("System.Web.UI.Design.WebControls.BaseDataBoundControlDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
        public abstract class BaseDataBoundControl: WebControl
        {
-               public event EventHandler DataBound;
-               
+               static readonly object dataBoundEvent = new object ();
+
+               EventHandlerList events = new EventHandlerList ();
                object dataSource;
                bool initialized;
                bool preRendered;
                bool requiresDataBinding;
                
+               public event EventHandler DataBound {
+                       add { events.AddHandler (dataBoundEvent, value); }
+                       remove { events.RemoveHandler (dataBoundEvent, value); }
+               }
+               
                protected BaseDataBoundControl ()
                {
                }
@@ -64,9 +69,7 @@ namespace System.Web.UI.WebControls {
                [DefaultValueAttribute (null)]
                [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
                public virtual object DataSource {
-                       get {
-                               return dataSource;
-                       }
+                       get { return dataSource; }
                        set {
                                if(value!=null)
                                        ValidateDataSource (value);
@@ -78,9 +81,7 @@ namespace System.Web.UI.WebControls {
                [DefaultValueAttribute ("")]
                [ThemeableAttribute (false)]
                public virtual string DataSourceID {
-                       get {
-                               return ViewState.GetString ("DataSourceID", "");
-                       }
+                       get { return ViewState.GetString ("DataSourceID", String.Empty); }
                        set {
                                ViewState["DataSourceID"] = value;
                                OnDataPropertyChanged ();
@@ -98,12 +99,36 @@ namespace System.Web.UI.WebControls {
                protected bool RequiresDataBinding {
                        get { return requiresDataBinding; }
                        set {
-                               requiresDataBinding = value;
-                               if (value && preRendered && IsBoundUsingDataSourceID && Page != null && !Page.IsCallback)
+                               // MSDN: If you set the RequiresDataBinding
+                               // property to true when the data-bound control
+                               // has already begun to render its output to the
+                               // page, the current HTTP request is not a
+                               // callback, and you are using the DataSourceID
+                               // property to identify the data source control
+                               // to bind to, the DataBind method is called
+                               // immediately. In this case, the
+                               // RequiresDataBinding property is _not_ actually
+                               // set to true.
+                               //
+                               // LAMESPEC, the docs quoted above mention that
+                               // DataBind is called in the described
+                               // case. This is wrong since that way we don't
+                               // break recursion when the property is set from
+                               // within the OnSelect handler in user's
+                               // code. EnsureDataBound makes sure that no
+                               // recursive binding is performed. Also the
+                               // property DOES get set in this case (according
+                               // to tests)
+                               if (value && preRendered && IsBoundUsingDataSourceID && Page != null && !Page.IsCallback) {
+                                       requiresDataBinding = true;
                                        EnsureDataBound ();
+                               } else
+                                       requiresDataBinding = value;
                        }
                }
-               
+               public override bool SupportsDisabledAttribute {
+                       get { return RenderingCompatibilityLessThan40; }
+               }
                protected void ConfirmInitState ()
                {
                        initialized = true;
@@ -122,8 +147,9 @@ namespace System.Web.UI.WebControls {
                
                protected virtual void OnDataBound (EventArgs e)
                {
-                       if (DataBound != null)
-                               DataBound (this, e);
+                       EventHandler eh = events [dataBoundEvent] as EventHandler;
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnDataPropertyChanged ()
@@ -155,17 +181,18 @@ namespace System.Web.UI.WebControls {
 
                internal Control FindDataSource ()
                {
-                       Control ctrl = null;
+                       Control ctrl;
                        Control namingContainer = NamingContainer;
-
+                       string dataSourceID = DataSourceID;
+                       
                        while (namingContainer != null) {
-                               ctrl = namingContainer.FindControl (DataSourceID);
+                               ctrl = namingContainer.FindControl (dataSourceID);
                                if (ctrl != null)
-                                       break;
+                                       return ctrl;
                                namingContainer = namingContainer.NamingContainer;
                        }
 
-                       return ctrl;
+                       return null;
                }
                
                protected abstract void PerformSelect ();
@@ -174,7 +201,3 @@ namespace System.Web.UI.WebControls {
                
        }
 }
-
-#endif
-
-