X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.Web%2FSystem.Web.UI.WebControls%2FBaseDataBoundControl.cs;h=e255f407852cc6333c1cddeea183ceac73cadeae;hb=69fd76078eb720a89f3420bab3fe1bc919896bec;hp=1412b84c0128cd84109abc43c336f5534f7f3801;hpb=881f83658281916d8f0784df7c726ecb7cc289db;p=mono.git diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/BaseDataBoundControl.cs b/mcs/class/System.Web/System.Web.UI.WebControls/BaseDataBoundControl.cs index 1412b84c012..e255f407852 100644 --- a/mcs/class/System.Web/System.Web.UI.WebControls/BaseDataBoundControl.cs +++ b/mcs/class/System.Web/System.Web.UI.WebControls/BaseDataBoundControl.cs @@ -4,7 +4,7 @@ // Authors: // Lluis Sanchez Gual (lluis@novell.com) // -// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com) +// Copyright (C) 2004-2010 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 @@ -26,13 +26,12 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -#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)] @@ -41,13 +40,19 @@ 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 (); object dataSource; bool initialized; bool preRendered; bool requiresDataBinding; + public event EventHandler DataBound { + add { events.AddHandler (dataBoundEvent, value); } + remove { events.RemoveHandler (dataBoundEvent, value); } + } + protected BaseDataBoundControl () { } @@ -64,11 +69,10 @@ namespace System.Web.UI.WebControls { [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)] public virtual object DataSource { - get { - return dataSource; - } + get { return dataSource; } set { - ValidateDataSource (value); + if(value!=null) + ValidateDataSource (value); dataSource = value; OnDataPropertyChanged (); } @@ -77,9 +81,7 @@ namespace System.Web.UI.WebControls { [DefaultValueAttribute ("")] [ThemeableAttribute (false)] public virtual string DataSourceID { - get { - return ViewState.GetString ("DataSourceID", ""); - } + get { return ViewState.GetString ("DataSourceID", String.Empty); } set { ViewState["DataSourceID"] = value; OnDataPropertyChanged (); @@ -96,13 +98,37 @@ 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; } } - + public override bool SupportsDisabledAttribute { + get { return RenderingCompatibilityLessThan40; } + } protected void ConfirmInitState () { initialized = true; @@ -110,7 +136,6 @@ namespace System.Web.UI.WebControls { public override void DataBind () { - RequiresDataBinding = false; PerformSelect (); } @@ -122,13 +147,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) @@ -151,6 +178,22 @@ namespace System.Web.UI.WebControls { EnsureDataBound (); base.OnPreRender (e); } + + internal Control FindDataSource () + { + Control ctrl; + Control namingContainer = NamingContainer; + string dataSourceID = DataSourceID; + + while (namingContainer != null) { + ctrl = namingContainer.FindControl (dataSourceID); + if (ctrl != null) + return ctrl; + namingContainer = namingContainer.NamingContainer; + } + + return null; + } protected abstract void PerformSelect (); @@ -158,6 +201,3 @@ namespace System.Web.UI.WebControls { } } - -#endif -