DataSourceControl Class (System.Web.UI)

Switch View :
ScriptFree
.NET Framework Class Library
DataSourceControl Class

Serves as the base class for controls that represent data sources to data-bound controls.

Inheritance Hierarchy

System.Object
  System.Web.UI.Control
    System.Web.UI.DataSourceControl
      System.Web.UI.WebControls.EntityDataSource
      System.Web.UI.WebControls.ObjectDataSource
      System.Web.UI.WebControls.QueryableDataSource
      System.Web.UI.WebControls.SqlDataSource

Namespace:  System.Web.UI
Assembly:  System.Web (in System.Web.dll)
Syntax

Visual Basic
<BindableAttribute(False)> _
Public MustInherit Class DataSourceControl _
	Inherits Control _
	Implements IDataSource, IListSource
C#
[BindableAttribute(false)]
public abstract class DataSourceControl : Control, 
	IDataSource, IListSource
Visual C++
[BindableAttribute(false)]
public ref class DataSourceControl abstract : public Control, 
	IDataSource, IListSource
F#
[<AbstractClass>]
[<BindableAttribute(false)>]
type DataSourceControl =  
    class
        inherit Control
        interface IDataSource
        interface IListSource
    end
ASP.NET
<asp:DataSourceControl />

The DataSourceControl type exposes the following members.

Constructors

  Name Description
Protected method DataSourceControl Initializes a new instance of the DataSourceControl class.
Top
Properties

  Name Description
Protected property Adapter Gets the browser-specific adapter for the control. (Inherited from Control.)
Public property AppRelativeTemplateSourceDirectory Gets or sets the application-relative virtual directory of the Page or UserControl object that contains this control. (Inherited from Control.)
Public property BindingContainer Infrastructure. Gets the control that contains this control's data binding. (Inherited from Control.)
Protected property ChildControlsCreated Gets a value that indicates whether the server control's child controls have been created. (Inherited from Control.)
Public property ClientID Gets the server control identifier generated by ASP.NET. (Overrides Control.ClientID.)
Public property ClientIDMode This property is not used for data source controls. (Overrides Control.ClientIDMode.)
Protected property ClientIDSeparator Gets a character value representing the separator character used in the ClientID property. (Inherited from Control.)
Protected property Context Gets the HttpContext object associated with the server control for the current Web request. (Inherited from Control.)
Public property Controls Gets a ControlCollection object that represents the child controls for a specified server control in the UI hierarchy. (Overrides Control.Controls.)
Public property DataItemContainer Gets a reference to the naming container if the naming container implements IDataItemContainer. (Inherited from Control.)
Public property DataKeysContainer Gets a reference to the naming container if the naming container implements IDataKeysControl. (Inherited from Control.)
Protected property DesignMode Gets a value indicating whether a control is being used on a design surface. (Inherited from Control.)
Public property EnableTheming Gets a value indicating whether this control supports themes. (Overrides Control.EnableTheming.)
Public property EnableViewState Gets or sets a value indicating whether the server control persists its view state, and the view state of any child controls it contains, to the requesting client. (Inherited from Control.)
Protected property Events Gets a list of event handler delegates for the control. This property is read-only. (Inherited from Control.)
Protected property HasChildViewState Gets a value indicating whether the current server control's child controls have any saved view-state settings. (Inherited from Control.)
Public property ID Gets or sets the programmatic identifier assigned to the server control. (Inherited from Control.)
Protected property IdSeparator Infrastructure. Gets the character used to separate control identifiers. (Inherited from Control.)
Protected property IsChildControlStateCleared Gets a value indicating whether controls contained within this control have control state. (Inherited from Control.)
Protected property IsTrackingViewState Gets a value that indicates whether the server control is saving changes to its view state. (Inherited from Control.)
Protected property IsViewStateEnabled Gets a value indicating whether view state is enabled for this control. (Inherited from Control.)
Protected property LoadViewStateByID Gets a value indicating whether the control participates in loading its view state by ID instead of index. (Inherited from Control.)
Public property NamingContainer Gets a reference to the server control's naming container, which creates a unique namespace for differentiating between server controls with the same Control.ID property value. (Inherited from Control.)
Public property Page Gets a reference to the Page instance that contains the server control. (Inherited from Control.)
Public property Parent Gets a reference to the server control's parent control in the page control hierarchy. (Inherited from Control.)
Public property RenderingCompatibility Gets a value that specifies the ASP.NET version that rendered HTML will be compatible with. (Inherited from Control.)
Public property Site Gets information about the container that hosts the current control when rendered on a design surface. (Inherited from Control.)
Public property SkinID Gets the skin to apply to the DataSourceControl control. (Overrides Control.SkinID.)
Public property TemplateControl Gets or sets a reference to the template that contains this control. (Inherited from Control.)
Public property TemplateSourceDirectory Gets the virtual directory of the Page or UserControl that contains the current server control. (Inherited from Control.)
Public property UniqueID Gets the unique, hierarchically qualified identifier for the server control. (Inherited from Control.)
Protected property ViewState Gets a dictionary of state information that allows you to save and restore the view state of a server control across multiple requests for the same page. (Inherited from Control.)
Protected property ViewStateIgnoresCase Gets a value that indicates whether the StateBag object is case-insensitive. (Inherited from Control.)
Public property ViewStateMode Gets or sets the view-state mode of this control. (Inherited from Control.)
Public property Visible Gets or sets a value indicating whether the control is visually displayed. (Overrides Control.Visible.)
Top
Methods

  Name Description
Protected method AddedControl Called after a child control is added to the Controls collection of the Control object. (Inherited from Control.)
Protected method AddParsedSubObject Notifies the server control that an element, either XML or HTML, was parsed, and adds the element to the server control's ControlCollection object. (Inherited from Control.)
Public method ApplyStyleSheetSkin Applies the style properties that are defined in the page style sheet to the control. (Overrides Control.ApplyStyleSheetSkin(Page).)
Protected method BuildProfileTree Infrastructure. Gathers information about the server control and delivers it to the Trace property to be displayed when tracing is enabled for the page. (Inherited from Control.)
Protected method ClearCachedClientID Infrastructure. Sets the cached ClientID value to null. (Inherited from Control.)
Protected method ClearChildControlState Deletes the control-state information for the server control's child controls. (Inherited from Control.)
Protected method ClearChildState Deletes the view-state and control-state information for all the server control's child controls. (Inherited from Control.)
Protected method ClearChildViewState Deletes the view-state information for all the server control's child controls. (Inherited from Control.)
Protected method ClearEffectiveClientIDMode Infrastructure. Sets the ClientIDMode property of the current control instance and of any child controls to Inherit. (Inherited from Control.)
Protected method CreateChildControls Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. (Inherited from Control.)
Protected method CreateControlCollection Creates a collection to store child controls. (Overrides Control.CreateControlCollection().)
Public method DataBind() Binds a data source to the invoked server control and all its child controls. (Inherited from Control.)
Protected method DataBind(Boolean) Binds a data source to the invoked server control and all its child controls with an option to raise the DataBinding event. (Inherited from Control.)
Protected method DataBindChildren Binds a data source to the server control's child controls. (Inherited from Control.)
Public method Dispose Enables a server control to perform final clean up before it is released from memory. (Inherited from Control.)
Protected method EnsureChildControls Determines whether the server control contains child controls. If it does not, it creates child controls. (Inherited from Control.)
Protected method EnsureID Creates an identifier for controls that do not have an identifier assigned. (Inherited from Control.)
Public method Equals(Object) Determines whether the specified Object is equal to the current Object. (Inherited from Object.)
Protected method Finalize Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.)
Public method FindControl(String) Searches the current naming container for a server control with the specified id parameter. (Overrides Control.FindControl(String).)
Protected method FindControl(String, Int32) Infrastructure. Searches the current naming container for a server control with the specified id and an integer, specified in the pathOffset parameter, which aids in the search. You should not override this version of the FindControl method. (Inherited from Control.)
Public method Focus Sets input focus to the control. (Overrides Control.Focus().)
Protected method GetDesignModeState Infrastructure. Gets design-time data for a control. (Inherited from Control.)
Public method GetHashCode Serves as a hash function for a particular type. (Inherited from Object.)
Public method GetRouteUrl(Object) Gets the URL that corresponds to a set of route parameters. (Inherited from Control.)
Public method GetRouteUrl(RouteValueDictionary) Gets the URL that corresponds to a set of route parameters. (Inherited from Control.)
Public method GetRouteUrl(String, Object) Gets the URL that corresponds to a set of route parameters and a route name. (Inherited from Control.)
Public method GetRouteUrl(String, RouteValueDictionary) Gets the URL that corresponds to a set of route parameters and a route name. (Inherited from Control.)
Public method GetType Gets the Type of the current instance. (Inherited from Object.)
Public method GetUniqueIDRelativeTo Returns the prefixed portion of the UniqueID property of the specified control. (Inherited from Control.)
Protected method GetView Gets the named data source view associated with the data source control.
Protected method GetViewNames Gets a collection of names, representing the list of DataSourceView objects associated with the DataSourceControl control.
Public method HasControls Determines if the server control contains any child controls. (Overrides Control.HasControls().)
Protected method HasEvents Returns a value indicating whether events are registered for the control or any child controls. (Inherited from Control.)
Protected method IsLiteralContent Infrastructure. Determines if the server control holds only literal content. (Inherited from Control.)
Protected method LoadControlState Restores control-state information from a previous page request that was saved by the SaveControlState method. (Inherited from Control.)
Protected method LoadViewState Restores view-state information from a previous page request that was saved by the SaveViewState method. (Inherited from Control.)
Protected method MapPathSecure Retrieves the physical path that a virtual path, either absolute or relative, maps to. (Inherited from Control.)
Protected method MemberwiseClone Creates a shallow copy of the current Object. (Inherited from Object.)
Protected method OnBubbleEvent Determines whether the event for the server control is passed up the page's UI server control hierarchy. (Inherited from Control.)
Protected method OnDataBinding Raises the DataBinding event. (Inherited from Control.)
Protected method OnInit Raises the Init event. (Inherited from Control.)
Protected method OnLoad Raises the Load event. (Inherited from Control.)
Protected method OnPreRender Raises the PreRender event. (Inherited from Control.)
Protected method OnUnload Raises the Unload event. (Inherited from Control.)
Protected method OpenFile Gets a Stream used to read a file. (Inherited from Control.)
Protected method RaiseBubbleEvent Assigns any sources of the event and its information to the control's parent. (Inherited from Control.)
Protected method RaiseDataSourceChangedEvent Raises the DataSourceChanged event.
Protected method RemovedControl Called after a child control is removed from the Controls collection of the Control object. (Inherited from Control.)
Protected method Render Sends server control content to a provided HtmlTextWriter object, which writes the content to be rendered on the client. (Inherited from Control.)
Protected method RenderChildren Outputs the content of a server control's children to a provided HtmlTextWriter object, which writes the content to be rendered on the client. (Inherited from Control.)
Public method RenderControl(HtmlTextWriter) Outputs server control content to a provided HtmlTextWriter object and stores tracing information about the control if tracing is enabled. (Overrides Control.RenderControl(HtmlTextWriter).)
Protected method RenderControl(HtmlTextWriter, ControlAdapter) Outputs server control content to a provided HtmlTextWriter object using a provided ControlAdapter object. (Inherited from Control.)
Protected method ResolveAdapter Gets the control adapter responsible for rendering the specified control. (Inherited from Control.)
Public method ResolveClientUrl Gets a URL that can be used by the browser. (Inherited from Control.)
Public method ResolveUrl Converts a URL into one that is usable on the requesting client. (Inherited from Control.)
Protected method SaveControlState Saves any server control state changes that have occurred since the time the page was posted back to the server. (Inherited from Control.)
Protected method SaveViewState Saves any server control view-state changes that have occurred since the time the page was posted back to the server. (Inherited from Control.)
Protected method SetDesignModeState Sets design-time data for a control. (Inherited from Control.)
Public method SetRenderMethodDelegate Infrastructure. Assigns an event handler delegate to render the server control and its content into its parent control. (Inherited from Control.)
Public method ToString Returns a string that represents the current object. (Inherited from Object.)
Protected method TrackViewState Causes tracking of view-state changes to the server control so they can be stored in the server control's StateBag object. This object is accessible through the Control.ViewState property. (Inherited from Control.)
Top
Events

  Name Description
Public event DataBinding Occurs when the server control binds to a data source. (Inherited from Control.)
Public event Disposed Occurs when a server control is released from memory, which is the last stage of the server control lifecycle when an ASP.NET page is requested. (Inherited from Control.)
Public event Init Occurs when the server control is initialized, which is the first step in its lifecycle. (Inherited from Control.)
Public event Load Occurs when the server control is loaded into the Page object. (Inherited from Control.)
Public event PreRender Occurs after the Control object is loaded but prior to rendering. (Inherited from Control.)
Public event Unload Occurs when the server control is unloaded from memory. (Inherited from Control.)
Top
Extension Methods

  Name Description
Public Extension Method FindDataSourceControl Returns the data source that is associated with the data control for the specified control. (Defined by DynamicDataExtensions.)
Public Extension Method FindFieldTemplate Returns the field template for the specified column in the specified control's naming container. (Defined by DynamicDataExtensions.)
Public Extension Method FindMetaTable Returns the metatable object for the containing data control. (Defined by DynamicDataExtensions.)
Public Extension Method GetDefaultValues Gets the collection of the default values for the specified data source. (Defined by DynamicDataExtensions.)
Public Extension Method GetMetaTable Gets the metadata for a table in the specified data source object. (Defined by DynamicDataExtensions.)
Public Extension Method TryGetMetaTable Determines whether table metadata is available. (Defined by DynamicDataExtensions.)
Top
Explicit Interface Implementations

  Name Description
Explicit interface implemetation Private property IControlBuilderAccessor.ControlBuilder For a description of this member, see IControlBuilderAccessor.ControlBuilder. (Inherited from Control.)
Explicit interface implemetation Private method IControlDesignerAccessor.GetDesignModeState For a description of this member, see IControlDesignerAccessor.GetDesignModeState. (Inherited from Control.)
Explicit interface implemetation Private method IControlDesignerAccessor.SetDesignModeState For a description of this member, see IControlDesignerAccessor.SetDesignModeState. (Inherited from Control.)
Explicit interface implemetation Private method IControlDesignerAccessor.SetOwnerControl Infrastructure. For a description of this member, see IControlDesignerAccessor.SetOwnerControl. (Inherited from Control.)
Explicit interface implemetation Private property IControlDesignerAccessor.UserData For a description of this member, see IControlDesignerAccessor.UserData. (Inherited from Control.)
Explicit interface implemetation Private property IDataBindingsAccessor.DataBindings For a description of this member, see IDataBindingsAccessor.DataBindings. (Inherited from Control.)
Explicit interface implemetation Private property IDataBindingsAccessor.HasDataBindings For a description of this member, see IDataBindingsAccessor.HasDataBindings. (Inherited from Control.)
Explicit interface implemetation Private event IDataSource.DataSourceChanged Infrastructure. Occurs when a data source control has changed in a way that affects data-bound controls.
Explicit interface implemetation Private method IDataSource.GetView Infrastructure. Gets the named DataSourceView object associated with the DataSourceControl control. Some data source controls support only one view, while others support more than one.
Explicit interface implemetation Private method IDataSource.GetViewNames Infrastructure. Gets a collection of names, representing the list of DataSourceView objects associated with the DataSourceControl control.
Explicit interface implemetation Private property IExpressionsAccessor.Expressions For a description of this member, see IExpressionsAccessor.Expressions. (Inherited from Control.)
Explicit interface implemetation Private property IExpressionsAccessor.HasExpressions For a description of this member, see IExpressionsAccessor.HasExpressions. (Inherited from Control.)
Explicit interface implemetation Private property IListSource.ContainsListCollection Infrastructure. Indicates whether the data source control is associated with one or more lists of data.
Explicit interface implemetation Private method IListSource.GetList Infrastructure. Gets a list of data source controls that can be used as sources of lists of data.
Explicit interface implemetation Private method IParserAccessor.AddParsedSubObject For a description of this member, see IParserAccessor.AddParsedSubObject. (Inherited from Control.)
Top
Remarks

ASP.NET supports a control data-binding architecture that enables Web server controls to bind to data in a consistent fashion. Web server controls that bind to data are referred to as data-bound controls, and the classes that facilitate that binding are called data source controls. Data source controls can represent any data source: a relational database, a file, a stream, a business object, and so on. Data source controls present data in a consistent way to data-bound controls, regardless of the source or format of the underlying data.

You use the data source controls that are provided with ASP.NET, including SqlDataSource, AccessDataSource, and XmlDataSource, to perform most Web development tasks. You use the base DataSourceControl class when you want to implement your own custom data source control.

While any class that implements the IDataSource interface is a data source control, most ASP.NET data source controls extend the abstract DataSourceControl class, which provides a base implementation of the IDataSource interface. The DataSourceControl class also provides an implementation of the IListSource interface, which enables you to programmatically assign the data source control to the DataSource property of a data-bound control and return data to the control as a basic list.

Any ASP.NET control that derives from the DataBoundControl class can bind to a data source control. When a DataBoundControl is bound to a data source control, data binding is performed automatically at run time. You can also use data source controls with ASP.NET controls that expose a DataSource or DataSourceID property and support basic data binding, but are not derived from DataBoundControl. When using these data-bound controls, you must explicitly call the DataBind method. For more information on data binding, see ASP.NET Data Access.

You can think of a data source control as the combination of the DataSourceControl object and its associated lists of data, called data source views. Each list of data is represented by a DataSourceView object. Because the underlying data storage contains one or more lists of data, a DataSourceControl is always associated with one or more named DataSourceView objects. The IDataSource interface defines the methods that all data source controls use to interact with data source views: the GetViewNames method is used to enumerate the data source views currently associated with the data source control, and the GetView method is used to retrieve a specific data source view instance by name.

You can also think of the data source control as two distinct interfaces that callers use to access data. The DataSourceControl class is the interface that page developers interact with directly when developing a Web Forms page, and the DataSourceView class is the interface that data-bound controls and data-bound control authors interact with. Because the DataSourceView object is available only at run time, any state persisted for the data source control or data source view must be exposed directly by the data source control.

There is no visual rendering of ASP.NET data source controls; they are implemented as controls so you can create them declaratively, and to optionally allow them to participate in state management. As a result, data source controls do not support visual features such as EnableTheming or SkinID.

Examples

The following code example demonstrates how a class can extend the DataSourceControl class. The CsvDataSource control represents comma-separated file data stored in a .csv file. The CsvDataSource class provides its own implementations of the GetView, GetViewNames, and other methods, because the base class implementations are not functional.

Visual Basic

Imports System
Imports System.Collections
Imports System.Data
Imports System.IO
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace Samples.AspNet.VB.Controls

' The CsvDataSource is a data source control that retrieves its
' data from a comma-separated value file.
<AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal)> _
Public Class CsvDataSource
   Inherits DataSourceControl

   Public Sub New()
   End Sub 'New

   ' The comma-separated value file to retrieve data from.
   Public Property FileName() As String
      Get
         Return CType(Me.GetView([String].Empty), CsvDataSourceView).SourceFile
      End Get
      Set
         ' Only set if it is different.
         If CType(Me.GetView([String].Empty), CsvDataSourceView).SourceFile <> value Then
            CType(Me.GetView([String].Empty), CsvDataSourceView).SourceFile = value
            RaiseDataSourceChangedEvent(EventArgs.Empty)
         End If
      End Set
   End Property

   ' Do not add the column names as a data row. Infer columns if the CSV file does
   ' not include column names.

   Public Property IncludesColumnNames() As Boolean
      Get
         Return CType(Me.GetView([String].Empty), CsvDataSourceView).IncludesColumnNames
      End Get
      Set
         ' Only set if it is different.
         If CType(Me.GetView([String].Empty), CsvDataSourceView).IncludesColumnNames <> value Then
            CType(Me.GetView([String].Empty), CsvDataSourceView).IncludesColumnNames = value
            RaiseDataSourceChangedEvent(EventArgs.Empty)
         End If
      End Set
   End Property


   ' Return a strongly typed view for the current data source control.
   Private view As CsvDataSourceView = Nothing

   Protected Overrides Function GetView(viewName As String) As DataSourceView
      If view Is Nothing Then
         view = New CsvDataSourceView(Me, String.Empty)
      End If
      Return view
   End Function 'GetView

   ' The ListSourceHelper class calls GetList, which
   ' calls the DataSourceControl.GetViewNames method.
   ' Override the original implementation to return
   ' a collection of one element, the default view name.
   Protected Overrides Function GetViewNames() As ICollection
      Dim al As New ArrayList(1)
      al.Add(CsvDataSourceView.DefaultViewName)
      Return CType(al, ICollection)
   End Function 'GetViewNames

End Class 'CsvDataSource


' The CsvDataSourceView class encapsulates the
' capabilities of the CsvDataSource data source control.

Public Class CsvDataSourceView
   Inherits DataSourceView

   Public Sub New(owner As IDataSource, name As String)
       MyBase.New(owner, DefaultViewName)
   End Sub 'New

   ' The data source view is named. However, the CsvDataSource
   ' only supports one view, so the name is ignored, and the
   ' default name used instead.
   Public Shared DefaultViewName As String = "CommaSeparatedView"

   ' The location of the .csv file.
   Private aSourceFile As String = [String].Empty

   Friend Property SourceFile() As String
      Get
         Return aSourceFile
      End Get
      Set
         ' Use MapPath when the SourceFile is set, so that files local to the
         ' current directory can be easily used.
         Dim mappedFileName As String
         mappedFileName = HttpContext.Current.Server.MapPath(value)
         aSourceFile = mappedFileName
      End Set
   End Property

   ' Do not add the column names as a data row. Infer columns if the CSV file does
   ' not include column names.
   Private columns As Boolean = False

   Friend Property IncludesColumnNames() As Boolean
      Get
         Return columns
      End Get
      Set
         columns = value
      End Set
   End Property

   ' Get data from the underlying data source.
   ' Build and return a DataView, regardless of mode.
   Protected Overrides Function ExecuteSelect(selectArgs As DataSourceSelectArguments) _
    As System.Collections.IEnumerable
      Dim dataList As IEnumerable = Nothing
      ' Open the .csv file.
      If File.Exists(Me.SourceFile) Then
         Dim data As New DataTable()

         ' Open the file to read from.
         Dim sr As StreamReader = File.OpenText(Me.SourceFile)

         Try
            ' Parse the line
            Dim dataValues() As String
            Dim col As DataColumn

            ' Do the following to add schema.
            dataValues = sr.ReadLine().Split(","c)
            ' For each token in the comma-delimited string, add a column
            ' to the DataTable schema.
            Dim token As String
            For Each token In dataValues
               col = New DataColumn(token, System.Type.GetType("System.String"))
               data.Columns.Add(col)
            Next token

            ' Do not add the first row as data if the CSV file includes column names.
            If Not IncludesColumnNames Then
               data.Rows.Add(CopyRowData(dataValues, data.NewRow()))
            End If

            ' Do the following to add data.
            Dim s As String
            Do
               s = sr.ReadLine()
               If Not s Is Nothing Then
                   dataValues = s.Split(","c)
                   data.Rows.Add(CopyRowData(dataValues, data.NewRow()))
               End If
            Loop Until s Is Nothing

         Finally
            sr.Close()
         End Try

         data.AcceptChanges()
         Dim dataView As New DataView(data)
         If Not selectArgs.SortExpression Is String.Empty Then
             dataView.Sort = selectArgs.SortExpression
         End If
         dataList = dataView
      Else
         Throw New System.Configuration.ConfigurationErrorsException("File not found, " + Me.SourceFile)
      End If

      If dataList is Nothing Then
         Throw New InvalidOperationException("No data loaded from data source.")
      End If

      Return dataList
   End Function 'ExecuteSelect


   Private Function CopyRowData([source]() As String, target As DataRow) As DataRow
      Try
         Dim i As Integer
         For i = 0 To [source].Length - 1
            target(i) = [source](i)
         Next i
      Catch iore As IndexOutOfRangeException
         ' There are more columns in this row than
         ' the original schema allows.  Stop copying
         ' and return the DataRow.
         Return target
      End Try
      Return target
   End Function 'CopyRowData

   ' The CsvDataSourceView does not currently
   ' permit deletion. You can modify or extend
   ' this sample to do so.
   Public Overrides ReadOnly Property CanDelete() As Boolean
      Get
         Return False
      End Get
   End Property

   Protected Overrides Function ExecuteDelete(keys As IDictionary, values As IDictionary) As Integer
      Throw New NotSupportedException()
   End Function 'ExecuteDelete

   ' The CsvDataSourceView does not currently
   ' permit insertion of a new record. You can
   ' modify or extend this sample to do so.
   Public Overrides ReadOnly Property CanInsert() As Boolean
      Get
         Return False
      End Get
   End Property

   Protected Overrides Function ExecuteInsert(values As IDictionary) As Integer
      Throw New NotSupportedException()
   End Function 'ExecuteInsert

   ' The CsvDataSourceView does not currently
   ' permit update operations. You can modify or
   ' extend this sample to do so.
   Public Overrides ReadOnly Property CanUpdate() As Boolean
      Get
         Return False
      End Get
   End Property

   Protected Overrides Function ExecuteUpdate(keys As IDictionary, _
                                              values As IDictionary, _
                                              oldValues As IDictionary) As Integer
      Throw New NotSupportedException()
   End Function 'ExecuteUpdate

End Class 'CsvDataSourceView
End Namespace


C#

using System;
using System.Collections;
using System.Data;
using System.IO;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

// The CsvDataSource is a data source control that retrieves its
// data from a comma-separated value file.
[AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)]
public class CsvDataSource : DataSourceControl
{
    public CsvDataSource() : base() {}

    // The comma-separated value file to retrieve data from.
    public string FileName {
        get {
            return ((CsvDataSourceView)this.GetView(String.Empty)).SourceFile;
        }
        set {
            // Only set if it is different.
            if ( ((CsvDataSourceView)this.GetView(String.Empty)).SourceFile != value) {
                ((CsvDataSourceView)this.GetView(String.Empty)).SourceFile = value;
                RaiseDataSourceChangedEvent(EventArgs.Empty);
            }
        }
    }

    // Do not add the column names as a data row. Infer columns if the CSV file does
    // not include column names.
    public bool IncludesColumnNames {
        get {
            return ((CsvDataSourceView)this.GetView(String.Empty)).IncludesColumnNames;
        }
        set {
            // Only set if it is different.
            if ( ((CsvDataSourceView)this.GetView(String.Empty)).IncludesColumnNames != value) {
                ((CsvDataSourceView)this.GetView(String.Empty)).IncludesColumnNames = value;
                RaiseDataSourceChangedEvent(EventArgs.Empty);
            }
        }
    }

    // Return a strongly typed view for the current data source control.
    private CsvDataSourceView view = null;
    protected override DataSourceView GetView(string viewName) {
        if (null == view) {
            view = new CsvDataSourceView(this, String.Empty);
        }
        return view;
    }
    // The ListSourceHelper class calls GetList, which
    // calls the DataSourceControl.GetViewNames method.
    // Override the original implementation to return
    // a collection of one element, the default view name.
    protected override ICollection GetViewNames() {
        ArrayList al = new ArrayList(1);
        al.Add(CsvDataSourceView.DefaultViewName);
        return al as ICollection;
    }
}

// The CsvDataSourceView class encapsulates the
// capabilities of the CsvDataSource data source control.
public class CsvDataSourceView : DataSourceView
{

    public CsvDataSourceView(IDataSource owner, string name) :base(owner, DefaultViewName) {

    }

    // The data source view is named. However, the CsvDataSource
    // only supports one view, so the name is ignored, and the
    // default name used instead.
    public static string DefaultViewName = "CommaSeparatedView";

    // The location of the .csv file.
    private string sourceFile = String.Empty;
    internal string SourceFile {
        get {
            return sourceFile;
        }
        set {
            // Use MapPath when the SourceFile is set, so that files local to the
            // current directory can be easily used.
            string mappedFileName = HttpContext.Current.Server.MapPath(value);
            sourceFile = mappedFileName;
        }
    }

    // Do not add the column names as a data row. Infer columns if the CSV file does
    // not include column names.
    private bool columns = false;
    internal bool IncludesColumnNames {
        get {
            return columns;
        }
        set {
            columns = value;
        }
    }

    // Get data from the underlying data source.
    // Build and return a DataView, regardless of mode.
    protected override IEnumerable ExecuteSelect(DataSourceSelectArguments selectArgs) {
        IEnumerable dataList = null;
        // Open the .csv file.
        if (File.Exists(this.SourceFile)) {
            DataTable data = new DataTable();

            // Open the file to read from.
            using (StreamReader sr = File.OpenText(this.SourceFile)) {
                // Parse the line
                string s = "";
                string[] dataValues;
                DataColumn col;

                // Do the following to add schema.
                dataValues = sr.ReadLine().Split(',');
                // For each token in the comma-delimited string, add a column
                // to the DataTable schema.
                foreach (string token in dataValues) {
                    col = new DataColumn(token,typeof(string));
                    data.Columns.Add(col);
                }

                // Do not add the first row as data if the CSV file includes column names.
                if (! IncludesColumnNames)
                    data.Rows.Add(CopyRowData(dataValues, data.NewRow()));

                // Do the following to add data.
                while ((s = sr.ReadLine()) != null) {
                    dataValues = s.Split(',');
                    data.Rows.Add(CopyRowData(dataValues, data.NewRow()));
                }
            }
            data.AcceptChanges();
            DataView dataView = new DataView(data);
            if (selectArgs.SortExpression != String.Empty) {
                dataView.Sort = selectArgs.SortExpression;
            }
            dataList = dataView;
        }
        else {
            throw new System.Configuration.ConfigurationErrorsException("File not found, " + this.SourceFile);
        }

        if (null == dataList) {
            throw new InvalidOperationException("No data loaded from data source.");
        }

        return dataList;
    }

    private DataRow CopyRowData(string[] source, DataRow target) {
        try {
            for (int i = 0;i < source.Length;i++) {
                target[i] = source[i];
            }
        }
        catch (System.IndexOutOfRangeException) {
            // There are more columns in this row than
            // the original schema allows.  Stop copying
            // and return the DataRow.
            return target;
        }
        return target;
    }
    // The CsvDataSourceView does not currently
    // permit deletion. You can modify or extend
    // this sample to do so.
    public override bool CanDelete {
        get {
            return false;
        }
    }
    protected override int ExecuteDelete(IDictionary keys, IDictionary values)
    {
        throw new NotSupportedException();
    }
    // The CsvDataSourceView does not currently
    // permit insertion of a new record. You can
    // modify or extend this sample to do so.
    public override bool CanInsert {
        get {
            return false;
        }
    }
    protected override int ExecuteInsert(IDictionary values)
    {
        throw new NotSupportedException();
    }
    // The CsvDataSourceView does not currently
    // permit update operations. You can modify or
    // extend this sample to do so.
    public override bool CanUpdate {
        get {
            return false;
        }
    }
    protected override int ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues)
    {
        throw new NotSupportedException();
    }
}


The following code example demonstrates how to use the CsvDataSource control in a Web form.

Visual Basic

<%@ Page Language="VB" %>
<%@ Register Tagprefix="aspSample"
             Namespace="Samples.AspNet.VB.Controls" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
        <form id="form1" runat="server">

            <asp:gridview
                id="GridView1"
                runat="server"
                allowsorting="True"
                datasourceid="CsvDataSource1" />

            <aspSample:CsvDataSource
                id = "CsvDataSource1"
                runat = "server"
                filename = "sample.csv"
                includescolumnnames="True" />

        </form>
    </body>
</html>


C#

<%@ Page Language="C#" %>
<%@ Register Tagprefix="aspSample"
             Namespace="Samples.AspNet.CS.Controls" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <asp:gridview
          id="GridView1"
          runat="server"
          allowsorting="True"
          datasourceid="CsvDataSource1" />

      <aspSample:CsvDataSource
          id = "CsvDataSource1"
          runat = "server"
          filename = "sample.csv"
          includescolumnnames="True" />

    </form>
  </body>
</html>


Version Information

.NET Framework

Supported in: 4, 3.5, 3.0, 2.0
Platforms

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
See Also

Reference