typo
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / BaseDataBoundControl.cs
index e80b73b057c60551a65567a02b1753ded3d8446c..71f3f6b5d94e830e33abfed5d1d33f4316167942 100644 (file)
@@ -4,9 +4,7 @@
 // Authors:
 //     Lluis Sanchez Gual (lluis@novell.com)
 //
-// (C) 2004 Novell, Inc (http://www.novell.com)
-//
-
+// Copyright (C) 2004-2005 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
 #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)]
+       // attributes
        [DefaultProperty ("DataSourceID")]
-       [DesignerAttribute ("System.Web.UI.Design.WebControls.BaseDataBoundControlDesigner, System.Design, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.ComponentModel.Design.IDesigner")]
+       [DesignerAttribute ("System.Web.UI.Design.WebControls.BaseDataBoundControlDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
        public abstract class BaseDataBoundControl: WebControl
        {
                public event EventHandler DataBound;
                
                object dataSource;
-               string dataSourceId;
                bool initialized;
+               bool preRendered;
                bool requiresDataBinding;
                
+               protected BaseDataBoundControl ()
+               {
+               }
+
+               /* Used for controls that used to inherit from
+                * WebControl, so the tag can propagate upwards
+                */
+               internal BaseDataBoundControl (HtmlTextWriterTag tag) : base (tag)
+               {
+               }
+               
                [BindableAttribute (true)]
                [ThemeableAttribute (false)]
                [DefaultValueAttribute (null)]
@@ -54,10 +68,10 @@ namespace System.Web.UI.WebControls
                                return dataSource;
                        }
                        set {
-                               ValidateDataSource (value);
+                               if(value!=null)
+                                       ValidateDataSource (value);
                                dataSource = value;
-                               if (initialized)
-                                       OnDataPropertyChanged ();
+                               OnDataPropertyChanged ();
                        }
                }
                
@@ -65,12 +79,11 @@ namespace System.Web.UI.WebControls
                [ThemeableAttribute (false)]
                public virtual string DataSourceID {
                        get {
-                               return dataSourceId != null ? dataSourceId : string.Empty;
+                               return ViewState.GetString ("DataSourceID", "");
                        }
                        set {
-                               dataSourceId = value;
-                               if (initialized)
-                                       OnDataPropertyChanged ();
+                               ViewState["DataSourceID"] = value;
+                               OnDataPropertyChanged ();
                        }
                }
                
@@ -84,7 +97,33 @@ namespace System.Web.UI.WebControls
                
                protected bool RequiresDataBinding {
                        get { return requiresDataBinding; }
-                       set { requiresDataBinding = value; }
+                       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;
+                       }
                }
                
                protected void ConfirmInitState ()
@@ -94,10 +133,9 @@ namespace System.Web.UI.WebControls
                
                public override void DataBind ()
                {
-                       RequiresDataBinding = false;
                        PerformSelect ();
                }
-               
+
                protected virtual void EnsureDataBound ()
                {
                        if (RequiresDataBinding && IsBoundUsingDataSourceID)
@@ -112,13 +150,17 @@ namespace System.Web.UI.WebControls
 
                protected virtual void OnDataPropertyChanged ()
                {
-                       RequiresDataBinding = true;
+                       if (Initialized)
+                               RequiresDataBinding = true;
                }
                
-               protected override void OnInit (EventArgs e)
+               protected internal override void OnInit (EventArgs e)
                {
                        base.OnInit (e);
                        Page.PreLoad += new EventHandler (OnPagePreLoad);
+
+                       if (!IsViewStateEnabled && Page != null && Page.IsPostBack)
+                               RequiresDataBinding = true;
                }
                
                protected virtual void OnPagePreLoad (object sender, EventArgs e)
@@ -126,11 +168,27 @@ namespace System.Web.UI.WebControls
                        ConfirmInitState ();
                }
                
-               protected override void OnPreRender (EventArgs e)
+               protected internal override void OnPreRender (EventArgs e)
                {
+                       preRendered = true;
                        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 ();
                
@@ -141,3 +199,4 @@ namespace System.Web.UI.WebControls
 
 #endif
 
+