Merge pull request #2916 from ludovic-henry/fix-40306
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / HierarchicalDataBoundControl.cs
index 6d9713ab7b6bbdf17d05cf5568a2b786ad99ac46..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,31 +57,36 @@ 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;
                }
 
                bool IsDataBound {
-                       get {
-                               return ViewState.GetBool ("DataBound", false);
-                       }
-                       set {
-                               ViewState ["DataBound"] = value;
-                       }
+                       get { return ViewState.GetBool ("DataBound", false); }
+                       set { ViewState ["DataBound"] = value; }
                }
 
                protected void MarkAsDataBound ()
@@ -108,7 +114,7 @@ namespace System.Web.UI.WebControls
                        base.OnLoad(e);
                }
 
-               private void Initialize ()
+               void Initialize ()
                {
                        if (!Page.IsPostBack || (IsViewStateEnabled && !IsDataBound))
                                RequiresDataBinding = true;
@@ -125,6 +131,16 @@ namespace System.Web.UI.WebControls
                        Initialize ();
                }
                
+               protected void InternalPerformDataBinding ()
+               {
+                       HierarchicalDataBoundControlAdapter adapter 
+                               = Adapter as HierarchicalDataBoundControlAdapter;
+                       if (adapter != null)
+                               adapter.PerformDataBinding ();
+                       else
+                               PerformDataBinding ();
+               }
+               
                protected internal virtual void PerformDataBinding ()
                {
                }
@@ -132,7 +148,7 @@ namespace System.Web.UI.WebControls
                protected override void PerformSelect ()
                {
                        OnDataBinding (EventArgs.Empty);
-                       PerformDataBinding ();
+                       InternalPerformDataBinding ();
                        // The PerformDataBinding method has completed.
                        RequiresDataBinding = false;
                        MarkAsDataBound ();
@@ -141,11 +157,12 @@ namespace System.Web.UI.WebControls
                
                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
+
+