typo
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / BaseDataBoundControl.cs
index 0b6b199eb28ca4ad883b05c711ce248f33042e47..71f3f6b5d94e830e33abfed5d1d33f4316167942 100644 (file)
@@ -97,10 +97,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;
                        }
                }
                
@@ -153,20 +175,19 @@ namespace System.Web.UI.WebControls {
                        base.OnPreRender (e);
                }
 
-               internal static IHierarchicalDataSource FindDataSource (Control start, string id)
+               internal Control FindDataSource ()
                {
-                       if (start == null || String.IsNullOrEmpty (id))
-                               return null;
-                       
-                       Control ret = null;
-                       Control nc = start;
+                       Control ctrl = null;
+                       Control namingContainer = NamingContainer;
 
-                       while (ret == null && nc != start.Page) {
-                               nc = nc.NamingContainer;
-                               ret = nc.FindControl (id);
+                       while (namingContainer != null) {
+                               ctrl = namingContainer.FindControl (DataSourceID);
+                               if (ctrl != null)
+                                       break;
+                               namingContainer = namingContainer.NamingContainer;
                        }
 
-                       return ret as IHierarchicalDataSource;
+                       return ctrl;
                }
                
                protected abstract void PerformSelect ();