Merge pull request #2916 from ludovic-henry/fix-40306
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / HierarchicalDataBoundControl.cs
index 6461f176643b353551e228b3b1835aa9a32fd8de..ae6bf97caab0240f4a31880dfb41c906e0a98a16 100644 (file)
@@ -4,7 +4,7 @@
 // Authors:
 //     Lluis Sanchez Gual (lluis@novell.com)
 //
-// (C) 2004 Novell, Inc (http://www.novell.com)
+// (C) 2004-2010 Novell, Inc (http://www.novell.com)
 //
 
 //
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
 using System.Collections;
 using System.ComponentModel;
+using System.Web.UI;
+using System.Web.UI.WebControls.Adapters;
 
 namespace System.Web.UI.WebControls
 {
@@ -56,28 +57,41 @@ namespace System.Web.UI.WebControls
                
                protected virtual HierarchicalDataSourceView GetData (string viewPath)
                {
-                       if (DataSource != null && DataSourceID != "")
-                               throw new HttpException ();
-                       
+                       if (DataSource != null && !String.IsNullOrEmpty (DataSourceID))
+                               throw new HttpException ();     
                        IHierarchicalDataSource ds = GetDataSource ();
                        if (ds != null)
                                return ds.GetHierarchicalView (viewPath);
-                       else
-                               return null; 
+                       
+                       if (DataSource is IHierarchicalEnumerable)
+                               return new ReadOnlyDataSourceView ((IHierarchicalEnumerable) DataSource);
+                       
+                       return null;
                }
                
                protected virtual IHierarchicalDataSource GetDataSource ()
                {
-                       if (DataSourceID != "")
-                               return NamingContainer.FindControl (DataSourceID) as IHierarchicalDataSource;
+                       if (IsBoundUsingDataSourceID) {
+                               Control ctrl = FindDataSource ();
+
+                               if (ctrl == null)
+                                       throw new HttpException (string.Format ("A control with ID '{0}' could not be found.", DataSourceID));
+                               if (!(ctrl is IHierarchicalDataSource))
+                                       throw new HttpException (string.Format ("The control with ID '{0}' is not a control of type IHierarchicalDataSource.", DataSourceID));
+                               return (IHierarchicalDataSource) ctrl;
+                       }
                        
                        return DataSource as IHierarchicalDataSource;
                }
 
-               [MonoTODO ("Not implemented")]
+               bool IsDataBound {
+                       get { return ViewState.GetBool ("DataBound", false); }
+                       set { ViewState ["DataBound"] = value; }
+               }
+
                protected void MarkAsDataBound ()
                {
-                       throw new NotImplementedException ();
+                       IsDataBound = true;
                }
                
                protected override void OnDataPropertyChanged ()
@@ -92,19 +106,39 @@ namespace System.Web.UI.WebControls
 
                protected internal override void OnLoad (EventArgs e)
                {
-                       if (IsBoundUsingDataSourceID && (!Page.IsPostBack || !EnableViewState))
+                       if (!Initialized) {
+                               Initialize ();
+                               ConfirmInitState ();
+                       }
+                       
+                       base.OnLoad(e);
+               }
+
+               void Initialize ()
+               {
+                       if (!Page.IsPostBack || (IsViewStateEnabled && !IsDataBound))
                                RequiresDataBinding = true;
-               
+
                        IHierarchicalDataSource ds = GetDataSource ();
                        if (ds != null && DataSourceID != "")
                                ds.DataSourceChanged += new EventHandler (OnDataSourceChanged);
-                       
-                       base.OnLoad(e);
                }
 
                protected override void OnPagePreLoad (object sender, EventArgs e)
                {
                        base.OnPagePreLoad (sender, e);
+                       
+                       Initialize ();
+               }
+               
+               protected void InternalPerformDataBinding ()
+               {
+                       HierarchicalDataBoundControlAdapter adapter 
+                               = Adapter as HierarchicalDataBoundControlAdapter;
+                       if (adapter != null)
+                               adapter.PerformDataBinding ();
+                       else
+                               PerformDataBinding ();
                }
                
                protected internal virtual void PerformDataBinding ()
@@ -114,17 +148,21 @@ namespace System.Web.UI.WebControls
                protected override void PerformSelect ()
                {
                        OnDataBinding (EventArgs.Empty);
-                       PerformDataBinding ();
+                       InternalPerformDataBinding ();
+                       // The PerformDataBinding method has completed.
+                       RequiresDataBinding = false;
+                       MarkAsDataBound ();
                        OnDataBound (EventArgs.Empty);
                }
                
                protected override void ValidateDataSource (object dataSource)
                {
-                       if (dataSource is IHierarchicalDataSource || dataSource is IHierarchicalEnumerable)
+                       if (dataSource == null || dataSource is IHierarchicalDataSource || dataSource is IHierarchicalEnumerable)
                                return;
                        throw new InvalidOperationException ("Invalid data source");
                }
        }
 }
-#endif
+
+