// 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
// 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)]
[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 ()
{
}
[DefaultValueAttribute (null)]
[DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
public virtual object DataSource {
- get {
- return dataSource;
- }
+ get { return dataSource; }
set {
if(value!=null)
ValidateDataSource (value);
[DefaultValueAttribute ("")]
[ThemeableAttribute (false)]
public virtual string DataSourceID {
- get {
- return ViewState.GetString ("DataSourceID", "");
- }
+ get { return ViewState.GetString ("DataSourceID", String.Empty); }
set {
ViewState["DataSourceID"] = value;
OnDataPropertyChanged ();
protected bool RequiresDataBinding {
get { return requiresDataBinding; }
set {
- requiresDataBinding = value;
- if (value && preRendered && IsBoundUsingDataSourceID && Page != null && !Page.IsCallback)
+ // 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;
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 ()
internal Control FindDataSource ()
{
- Control ctrl = null;
+ Control ctrl;
Control namingContainer = NamingContainer;
-
+ string dataSourceID = DataSourceID;
+
while (namingContainer != null) {
- ctrl = namingContainer.FindControl (DataSourceID);
+ ctrl = namingContainer.FindControl (dataSourceID);
if (ctrl != null)
- break;
+ return ctrl;
namingContainer = namingContainer.NamingContainer;
}
- return ctrl;
+ return null;
}
protected abstract void PerformSelect ();
}
}
-
-#endif
-
-