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=0b6b199eb28ca4ad883b05c711ce248f33042e47;hpb=53d54edc22a9e4a59db4ed9d0bb85ee4545600b3;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 0b6b199eb28..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,9 +69,7 @@ namespace System.Web.UI.WebControls { [DefaultValueAttribute (null)] [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)] public virtual object DataSource { - get { - return dataSource; - } + get { return dataSource; } set { if(value!=null) ValidateDataSource (value); @@ -78,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 (); @@ -97,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; @@ -122,8 +147,9 @@ 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 () @@ -153,20 +179,20 @@ 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 ctrl; + Control namingContainer = NamingContainer; + string dataSourceID = DataSourceID; - Control ret = null; - Control nc = start; - - while (ret == null && nc != start.Page) { - nc = nc.NamingContainer; - ret = nc.FindControl (id); + while (namingContainer != null) { + ctrl = namingContainer.FindControl (dataSourceID); + if (ctrl != null) + return ctrl; + namingContainer = namingContainer.NamingContainer; } - return ret as IHierarchicalDataSource; + return null; } protected abstract void PerformSelect (); @@ -175,7 +201,3 @@ namespace System.Web.UI.WebControls { } } - -#endif - -