e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
263 lines
8.3 KiB
C#
263 lines
8.3 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="DataSourceControl.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
namespace System.Web.UI {
|
|
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Security.Permissions;
|
|
|
|
|
|
/// <summary>
|
|
/// A DataSourceControl represents a data source that can be used to
|
|
/// data-bind a DataBoundControl.
|
|
/// DataSourceControl is an abstract base class that defines the
|
|
/// interface between a DataBoundControl and its data source.
|
|
/// The design of DataSourceControl enables creation of a variety of
|
|
/// data controls with different underlying data sources such
|
|
/// as SqlDataControl, WebServiceDataControl, XmlDataControl etc.
|
|
/// The data source is implemented as a control even though it
|
|
/// has no visual rendering, to allow it to be persisted
|
|
/// declaratively, and to allow it to participate in state
|
|
/// management should it choose to.
|
|
/// In abstract terms a DataSourceControl has an underlying data source.
|
|
/// This data source may contain one or more lists of data within it.
|
|
/// Each list is associated with a name and at the bare minimum
|
|
/// supports enumeration via the IEnumerable interface. A DataBoundControl
|
|
/// is typically bound to a single list within the DataControl.
|
|
/// </summary>
|
|
[
|
|
Bindable(false),
|
|
ControlBuilder(typeof(DataSourceControlBuilder)),
|
|
Designer("System.Web.UI.Design.DataSourceDesigner, " + AssemblyRef.SystemDesign),
|
|
NonVisualControl()
|
|
]
|
|
public abstract class DataSourceControl : Control, IDataSource, IListSource {
|
|
|
|
private static readonly object EventDataSourceChanged = new object();
|
|
private static readonly object EventDataSourceChangedInternal = new object();
|
|
|
|
[
|
|
Browsable(false),
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override string ClientID {
|
|
get {
|
|
return base.ClientID;
|
|
}
|
|
}
|
|
|
|
[
|
|
Browsable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override ClientIDMode ClientIDMode {
|
|
get {
|
|
return base.ClientIDMode;
|
|
}
|
|
set {
|
|
throw new NotSupportedException();
|
|
}
|
|
}
|
|
|
|
[
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override ControlCollection Controls {
|
|
get {
|
|
return base.Controls;
|
|
}
|
|
}
|
|
|
|
[
|
|
Browsable(false),
|
|
DefaultValue(false),
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override bool EnableTheming {
|
|
get {
|
|
return false;
|
|
}
|
|
set {
|
|
throw new NotSupportedException(SR.GetString(SR.NoThemingSupport, this.GetType().Name));
|
|
}
|
|
}
|
|
|
|
[
|
|
Browsable(false),
|
|
DefaultValue(""),
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override string SkinID {
|
|
get {
|
|
return String.Empty;
|
|
}
|
|
set {
|
|
throw new NotSupportedException(SR.GetString(SR.NoThemingSupport, this.GetType().Name));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value that indicates whether a control should be rendered on
|
|
/// the page.
|
|
/// </summary>
|
|
[
|
|
Browsable(false),
|
|
DefaultValue(false),
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override bool Visible {
|
|
get {
|
|
return false;
|
|
}
|
|
set {
|
|
throw new NotSupportedException(SR.GetString(SR.ControlNonVisual, this.GetType().Name));
|
|
}
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// Raised internally by a DataSource when data-related state is
|
|
/// changed. DataSourceViews attach to this event so that they can
|
|
/// be notified when the parent data source changes.
|
|
/// This event is separate from DataSourceChanged because the DataSourceView
|
|
/// attaches to it and fires its DataSourceViewChanged event. We want that
|
|
/// to fire before the DataSourceChanged event.
|
|
/// </devdoc>
|
|
internal event EventHandler DataSourceChangedInternal {
|
|
add {
|
|
Events.AddHandler(EventDataSourceChangedInternal, value);
|
|
}
|
|
remove {
|
|
Events.RemoveHandler(EventDataSourceChangedInternal, value);
|
|
}
|
|
}
|
|
|
|
|
|
[
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override void ApplyStyleSheetSkin(Page page) {
|
|
base.ApplyStyleSheetSkin(page);
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// Overidden to prevent child controls from being added to this control.
|
|
/// </devdoc>
|
|
protected override ControlCollection CreateControlCollection() {
|
|
return new EmptyControlCollection(this);
|
|
}
|
|
|
|
[
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override Control FindControl(string id) {
|
|
return base.FindControl(id);
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// </devdoc>
|
|
[
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override void Focus() {
|
|
throw new NotSupportedException(SR.GetString(SR.NoFocusSupport, this.GetType().Name));
|
|
}
|
|
|
|
protected abstract DataSourceView GetView(string viewName);
|
|
|
|
protected virtual ICollection GetViewNames() {
|
|
return null;
|
|
}
|
|
|
|
[
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override bool HasControls() {
|
|
return base.HasControls();
|
|
}
|
|
|
|
private void OnDataSourceChanged(EventArgs e) {
|
|
EventHandler handler = (EventHandler)Events[EventDataSourceChanged];
|
|
if (handler != null) {
|
|
handler(this, e);
|
|
}
|
|
}
|
|
|
|
private void OnDataSourceChangedInternal(EventArgs e) {
|
|
EventHandler handler = (EventHandler)Events[EventDataSourceChangedInternal];
|
|
if (handler != null) {
|
|
handler(this, e);
|
|
}
|
|
}
|
|
|
|
protected virtual void RaiseDataSourceChangedEvent(EventArgs e) {
|
|
OnDataSourceChangedInternal(e);
|
|
OnDataSourceChanged(e);
|
|
}
|
|
|
|
[
|
|
EditorBrowsable(EditorBrowsableState.Never),
|
|
]
|
|
public override void RenderControl(HtmlTextWriter writer) {
|
|
base.RenderControl(writer);
|
|
}
|
|
|
|
|
|
#region Implementation of IDataSource
|
|
/// <summary>
|
|
/// Raised when the underlying data source has changed. The
|
|
/// change may be due to a change in the control's properties,
|
|
/// or a change in the data due to an edit action performed by
|
|
/// the DataSourceControl.
|
|
/// </summary>
|
|
event EventHandler IDataSource.DataSourceChanged {
|
|
add {
|
|
Events.AddHandler(EventDataSourceChanged, value);
|
|
}
|
|
remove {
|
|
Events.RemoveHandler(EventDataSourceChanged, value);
|
|
}
|
|
}
|
|
|
|
|
|
/// <internalonly/>
|
|
DataSourceView IDataSource.GetView(string viewName) {
|
|
return GetView(viewName);
|
|
}
|
|
|
|
|
|
/// <internalonly/>
|
|
ICollection IDataSource.GetViewNames() {
|
|
return GetViewNames();
|
|
}
|
|
#endregion
|
|
|
|
|
|
#region Implementation of IListSource
|
|
|
|
/// <internalonly/>
|
|
bool IListSource.ContainsListCollection {
|
|
get {
|
|
if (DesignMode) {
|
|
return false;
|
|
}
|
|
return ListSourceHelper.ContainsListCollection(this);
|
|
}
|
|
}
|
|
|
|
|
|
/// <internalonly/>
|
|
IList IListSource.GetList() {
|
|
if (DesignMode) {
|
|
return null;
|
|
}
|
|
return ListSourceHelper.GetList(this);
|
|
}
|
|
#endregion
|
|
}
|
|
|
|
}
|