Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / DEVDIV / depot / DevDiv / releases / whidbey / QFE / ndp / fx / src / xsp / System / Web / UI / WebControls / BaseDataBoundControl.cs / 1 / BaseDataBoundControl.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI.WebControls { using System; using System.Collections; using System.ComponentModel; using System.Security.Permissions; using System.Web.Util; ////// A BaseDataBoundControl is bound to a data source and generates its /// user interface (or child control hierarchy typically), by enumerating /// the items in the data source it is bound to. /// BaseDataBoundControl is an abstract base class that defines the common /// characteristics of all controls that use a list as a data source, such as /// DataGrid, DataBoundTable, ListBox etc. It encapsulates the logic /// of how a data-bound control binds to collections or DataControl instances. /// [ Designer("System.Web.UI.Design.WebControls.BaseDataBoundControlDesigner, " + AssemblyRef.SystemDesign), DefaultProperty("DataSourceID") ] [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public abstract class BaseDataBoundControl : WebControl { private static readonly object EventDataBound = new object(); private object _dataSource; private bool _requiresDataBinding; private bool _inited; private bool _preRendered; private bool _requiresBindToNull; private bool _throwOnDataPropertyChange; ////// The data source to bind to. This allows a BaseDataBoundControl to bind /// to arbitrary lists of data items. /// [ Bindable(true), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Themeable(false), WebCategory("Data"), WebSysDescription(SR.BaseDataBoundControl_DataSource), ] public virtual object DataSource { get { return _dataSource; } set { if (value != null) { ValidateDataSource(value); } _dataSource = value; OnDataPropertyChanged(); } } ////// The ID of the DataControl that this control should use to retrieve /// its data source. When the control is bound to a DataControl, it /// can retrieve a data source instance on-demand, and thereby attempt /// to work in auto-DataBind mode. /// [ DefaultValue(""), Themeable(false), WebCategory("Data"), WebSysDescription(SR.BaseDataBoundControl_DataSourceID) ] public virtual string DataSourceID { get { object o = ViewState["DataSourceID"]; if (o != null) { return (string)o; } return String.Empty; } set { if (String.IsNullOrEmpty(value) && !String.IsNullOrEmpty(DataSourceID)) { _requiresBindToNull = true; } ViewState["DataSourceID"] = value; OnDataPropertyChanged(); } } protected bool Initialized { get { return _inited; } } protected bool IsBoundUsingDataSourceID { get { return (DataSourceID.Length > 0); } } protected bool RequiresDataBinding { get { return _requiresDataBinding; } set { // if we have to play catch-up here because we've already PreRendered, call EnsureDataBound if (value && _preRendered && DataSourceID.Length > 0 && Page != null && !Page.IsCallback) { _requiresDataBinding = true; EnsureDataBound(); } else { _requiresDataBinding = value; } } } [ WebCategory("Data"), WebSysDescription(SR.BaseDataBoundControl_OnDataBound) ] public event EventHandler DataBound { add { Events.AddHandler(EventDataBound, value); } remove { Events.RemoveHandler(EventDataBound, value); } } protected void ConfirmInitState() { _inited = true; // do this in OnLoad in case we were added to the page after Page.OnPreLoad } ////// Overriden by BaseDataBoundControl to use its properties to determine the real /// data source that the control should bind to. It then clears the existing /// control hierarchy, and calls CreateChildControls to create a new control /// hierarchy based on the resolved data source. /// The implementation resolves various data source related properties to /// arrive at the appropriate IEnumerable implementation to use as the real /// data source. /// When resolving data sources, the DataSourceID takes highest precedence. /// If DataSourceID is not set, the value of the DataSource property is used. /// In this second alternative, DataMember is used to extract the appropriate /// list if the control has been handed an IListSource as a data source. /// /// Data bound controls should override PerformDataBinding instead /// of DataBind. If DataBind if overridden, the OnDataBinding and OnDataBound events will /// fire in the wrong order. However, for backwards compat on ListControl and AdRotator, we /// can't seal this method. It is sealed on all new BaseDataBoundControl-derived controls. /// public override void DataBind() { // Don't databind when the control is in the designer but not top-level if (DesignMode) { IDictionary designModeState = GetDesignModeState(); if (((designModeState == null) || (designModeState["EnableDesignTimeDataBinding"] == null)) && (Site == null)) { return; } } PerformSelect(); } protected virtual void EnsureDataBound() { try { _throwOnDataPropertyChange = true; if (RequiresDataBinding && (DataSourceID.Length > 0 || _requiresBindToNull)) { DataBind(); _requiresBindToNull = false; } } finally { _throwOnDataPropertyChange = false; } } protected virtual void OnDataBound(EventArgs e) { EventHandler handler = Events[EventDataBound] as EventHandler; if (handler != null) { handler(this, e); } } ////// This method is called when DataMember, DataSource, or DataSourceID is changed. /// protected virtual void OnDataPropertyChanged() { if (_throwOnDataPropertyChange) { throw new HttpException(SR.GetString(SR.DataBoundControl_InvalidDataPropertyChange, ID)); } if (_inited) { RequiresDataBinding = true; } } protected internal override void OnInit(EventArgs e) { base.OnInit(e); if (Page != null) { Page.PreLoad += new EventHandler(this.OnPagePreLoad); if (!IsViewStateEnabled && Page.IsPostBack) { RequiresDataBinding = true; } } } protected virtual void OnPagePreLoad(object sender, EventArgs e) { _inited = true; if (Page != null) { Page.PreLoad -= new EventHandler(this.OnPagePreLoad); } } protected internal override void OnPreRender(EventArgs e) { _preRendered = true; EnsureDataBound(); base.OnPreRender(e); } ////// Override to control how the data is selected and the control is databound. /// protected abstract void PerformSelect(); protected abstract void ValidateDataSource(object dataSource); } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI.WebControls { using System; using System.Collections; using System.ComponentModel; using System.Security.Permissions; using System.Web.Util; ////// A BaseDataBoundControl is bound to a data source and generates its /// user interface (or child control hierarchy typically), by enumerating /// the items in the data source it is bound to. /// BaseDataBoundControl is an abstract base class that defines the common /// characteristics of all controls that use a list as a data source, such as /// DataGrid, DataBoundTable, ListBox etc. It encapsulates the logic /// of how a data-bound control binds to collections or DataControl instances. /// [ Designer("System.Web.UI.Design.WebControls.BaseDataBoundControlDesigner, " + AssemblyRef.SystemDesign), DefaultProperty("DataSourceID") ] [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public abstract class BaseDataBoundControl : WebControl { private static readonly object EventDataBound = new object(); private object _dataSource; private bool _requiresDataBinding; private bool _inited; private bool _preRendered; private bool _requiresBindToNull; private bool _throwOnDataPropertyChange; ////// The data source to bind to. This allows a BaseDataBoundControl to bind /// to arbitrary lists of data items. /// [ Bindable(true), DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Themeable(false), WebCategory("Data"), WebSysDescription(SR.BaseDataBoundControl_DataSource), ] public virtual object DataSource { get { return _dataSource; } set { if (value != null) { ValidateDataSource(value); } _dataSource = value; OnDataPropertyChanged(); } } ////// The ID of the DataControl that this control should use to retrieve /// its data source. When the control is bound to a DataControl, it /// can retrieve a data source instance on-demand, and thereby attempt /// to work in auto-DataBind mode. /// [ DefaultValue(""), Themeable(false), WebCategory("Data"), WebSysDescription(SR.BaseDataBoundControl_DataSourceID) ] public virtual string DataSourceID { get { object o = ViewState["DataSourceID"]; if (o != null) { return (string)o; } return String.Empty; } set { if (String.IsNullOrEmpty(value) && !String.IsNullOrEmpty(DataSourceID)) { _requiresBindToNull = true; } ViewState["DataSourceID"] = value; OnDataPropertyChanged(); } } protected bool Initialized { get { return _inited; } } protected bool IsBoundUsingDataSourceID { get { return (DataSourceID.Length > 0); } } protected bool RequiresDataBinding { get { return _requiresDataBinding; } set { // if we have to play catch-up here because we've already PreRendered, call EnsureDataBound if (value && _preRendered && DataSourceID.Length > 0 && Page != null && !Page.IsCallback) { _requiresDataBinding = true; EnsureDataBound(); } else { _requiresDataBinding = value; } } } [ WebCategory("Data"), WebSysDescription(SR.BaseDataBoundControl_OnDataBound) ] public event EventHandler DataBound { add { Events.AddHandler(EventDataBound, value); } remove { Events.RemoveHandler(EventDataBound, value); } } protected void ConfirmInitState() { _inited = true; // do this in OnLoad in case we were added to the page after Page.OnPreLoad } ////// Overriden by BaseDataBoundControl to use its properties to determine the real /// data source that the control should bind to. It then clears the existing /// control hierarchy, and calls CreateChildControls to create a new control /// hierarchy based on the resolved data source. /// The implementation resolves various data source related properties to /// arrive at the appropriate IEnumerable implementation to use as the real /// data source. /// When resolving data sources, the DataSourceID takes highest precedence. /// If DataSourceID is not set, the value of the DataSource property is used. /// In this second alternative, DataMember is used to extract the appropriate /// list if the control has been handed an IListSource as a data source. /// /// Data bound controls should override PerformDataBinding instead /// of DataBind. If DataBind if overridden, the OnDataBinding and OnDataBound events will /// fire in the wrong order. However, for backwards compat on ListControl and AdRotator, we /// can't seal this method. It is sealed on all new BaseDataBoundControl-derived controls. /// public override void DataBind() { // Don't databind when the control is in the designer but not top-level if (DesignMode) { IDictionary designModeState = GetDesignModeState(); if (((designModeState == null) || (designModeState["EnableDesignTimeDataBinding"] == null)) && (Site == null)) { return; } } PerformSelect(); } protected virtual void EnsureDataBound() { try { _throwOnDataPropertyChange = true; if (RequiresDataBinding && (DataSourceID.Length > 0 || _requiresBindToNull)) { DataBind(); _requiresBindToNull = false; } } finally { _throwOnDataPropertyChange = false; } } protected virtual void OnDataBound(EventArgs e) { EventHandler handler = Events[EventDataBound] as EventHandler; if (handler != null) { handler(this, e); } } ////// This method is called when DataMember, DataSource, or DataSourceID is changed. /// protected virtual void OnDataPropertyChanged() { if (_throwOnDataPropertyChange) { throw new HttpException(SR.GetString(SR.DataBoundControl_InvalidDataPropertyChange, ID)); } if (_inited) { RequiresDataBinding = true; } } protected internal override void OnInit(EventArgs e) { base.OnInit(e); if (Page != null) { Page.PreLoad += new EventHandler(this.OnPagePreLoad); if (!IsViewStateEnabled && Page.IsPostBack) { RequiresDataBinding = true; } } } protected virtual void OnPagePreLoad(object sender, EventArgs e) { _inited = true; if (Page != null) { Page.PreLoad -= new EventHandler(this.OnPagePreLoad); } } protected internal override void OnPreRender(EventArgs e) { _preRendered = true; EnsureDataBound(); base.OnPreRender(e); } ////// Override to control how the data is selected and the control is databound. /// protected abstract void PerformSelect(); protected abstract void ValidateDataSource(object dataSource); } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- NavigatingCancelEventArgs.cs
- WpfGeneratedKnownTypes.cs
- HttpContextServiceHost.cs
- IconHelper.cs
- SpecialNameAttribute.cs
- OutputWindow.cs
- ListViewDeleteEventArgs.cs
- BooleanStorage.cs
- CriticalHandle.cs
- RoutingSection.cs
- Error.cs
- CallbackHandler.cs
- GridViewSelectEventArgs.cs
- SymLanguageVendor.cs
- WebPartCancelEventArgs.cs
- StringAnimationBase.cs
- pingexception.cs
- DataRecordInfo.cs
- RegexGroupCollection.cs
- ListViewTableRow.cs
- DbgCompiler.cs
- PerformanceCounterPermissionEntry.cs
- MimeTypeAttribute.cs
- TextEndOfLine.cs
- RelationshipEndCollection.cs
- ImageButton.cs
- Misc.cs
- IdentityHolder.cs
- ProfessionalColorTable.cs
- ToolStripRendererSwitcher.cs
- XmlSerializerSection.cs
- UIHelper.cs
- FileVersion.cs
- UriSchemeKeyedCollection.cs
- XamlPathDataSerializer.cs
- TypeValidationEventArgs.cs
- ObfuscationAttribute.cs
- EventWaitHandleSecurity.cs
- OLEDB_Util.cs
- JsonClassDataContract.cs
- NativeMethods.cs
- WindowsListViewSubItem.cs
- AssertSection.cs
- PeerHelpers.cs
- AnonymousIdentificationSection.cs
- OrderPreservingPipeliningSpoolingTask.cs
- Int32Converter.cs
- ImplicitInputBrush.cs
- ControlEvent.cs
- TextDecorationLocationValidation.cs
- metrodevice.cs
- RotateTransform3D.cs
- TitleStyle.cs
- ProcessModuleCollection.cs
- AuthenticatingEventArgs.cs
- DataTable.cs
- IImplicitResourceProvider.cs
- CreateUserErrorEventArgs.cs
- TextEditorCharacters.cs
- PrintEvent.cs
- WeakReference.cs
- CustomAttributeFormatException.cs
- XPathException.cs
- XmlTextAttribute.cs
- SqlXmlStorage.cs
- VectorAnimationBase.cs
- DataErrorValidationRule.cs
- ChameleonKey.cs
- Identity.cs
- UidManager.cs
- OraclePermissionAttribute.cs
- SizeKeyFrameCollection.cs
- PseudoWebRequest.cs
- ServicesUtilities.cs
- RepeaterItem.cs
- ToolStripSplitStackLayout.cs
- VariableExpressionConverter.cs
- counter.cs
- XsltLibrary.cs
- QuotedPrintableStream.cs
- OptimalBreakSession.cs
- TextBoxLine.cs
- NetworkCredential.cs
- MultipartIdentifier.cs
- ForeignConstraint.cs
- InputMethodStateChangeEventArgs.cs
- NumericUpDownAccelerationCollection.cs
- TextLineBreak.cs
- CompoundFileIOPermission.cs
- SafeRightsManagementHandle.cs
- BindableTemplateBuilder.cs
- SystemGatewayIPAddressInformation.cs
- SpoolingTask.cs
- BlobPersonalizationState.cs
- WinEventQueueItem.cs
- CalendarDateChangedEventArgs.cs
- PropertyDescriptor.cs
- CodeMemberProperty.cs
- Missing.cs
- PatternMatchRules.cs