* ToolTask.cs (ProcessOuputTool): Move logging of tool
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / BaseDataBoundControl.cs
index 7034834321a71bfa882f469cebe185f8c4a19f32..6f89c9e45e0398e1bf6078c003dc8fe7bb193e3a 100644 (file)
@@ -41,7 +41,14 @@ 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 ();
+               
+               public event EventHandler DataBound {
+                       add { events.AddHandler (dataBoundEvent, value); }
+                       remove { events.RemoveHandler (dataBoundEvent, value); }
+               }
                
                object dataSource;
                bool initialized;
@@ -68,10 +75,10 @@ namespace System.Web.UI.WebControls {
                                return dataSource;
                        }
                        set {
-                               ValidateDataSource (value);
+                               if(value!=null)
+                                       ValidateDataSource (value);
                                dataSource = value;
-                               if (initialized)
-                                       OnDataPropertyChanged ();
+                               OnDataPropertyChanged ();
                        }
                }
                
@@ -83,8 +90,7 @@ namespace System.Web.UI.WebControls {
                        }
                        set {
                                ViewState["DataSourceID"] = value;
-                               if (initialized)
-                                       OnDataPropertyChanged ();
+                               OnDataPropertyChanged ();
                        }
                }
                
@@ -98,10 +104,32 @@ namespace System.Web.UI.WebControls {
                
                protected bool RequiresDataBinding {
                        get { return requiresDataBinding; }
-                       set { 
-                               requiresDataBinding = value;
-                               if (value && preRendered && IsBoundUsingDataSourceID && Page != null && !Page.IsCallback)
+                       set {
+                               // 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;
                        }
                }
                
@@ -112,7 +140,6 @@ namespace System.Web.UI.WebControls {
                
                public override void DataBind ()
                {
-                       RequiresDataBinding = false;
                        PerformSelect ();
                }
 
@@ -124,13 +151,15 @@ 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 ()
                {
-                       RequiresDataBinding = true;
+                       if (Initialized)
+                               RequiresDataBinding = true;
                }
                
                protected internal override void OnInit (EventArgs e)
@@ -153,6 +182,21 @@ namespace System.Web.UI.WebControls {
                        EnsureDataBound ();
                        base.OnPreRender (e);
                }
+
+               internal Control FindDataSource ()
+               {
+                       Control ctrl = null;
+                       Control namingContainer = NamingContainer;
+
+                       while (namingContainer != null) {
+                               ctrl = namingContainer.FindControl (DataSourceID);
+                               if (ctrl != null)
+                                       break;
+                               namingContainer = namingContainer.NamingContainer;
+                       }
+
+                       return ctrl;
+               }
                
                protected abstract void PerformSelect ();
                
@@ -163,3 +207,4 @@ namespace System.Web.UI.WebControls {
 
 #endif
 
+