IDataSource IDataSource IDataSource IDataSource Interface

定義

表示資料繫結控制項繫結的抽象資料來源。Represents an abstract data source that data-bound controls bind to.

public interface class IDataSource
public interface IDataSource
type IDataSource = interface
Public Interface IDataSource
衍生

範例

下列程式碼範例會示範類別如何執行IDataSource介面所定義的方法, 以提供資料給資料繫結控制項。The following code example demonstrates how a class can implement the methods defined by the IDataSource interface to provide data to data-bound controls. 此範例中的資料來源控制項會做為逗號分隔值檔案上的資料來源, 並可供任何資料繫結控制項用來顯示逗點分隔的檔案資料。The data source control in this example acts as a data source on a comma-separated value file, and can be used by any data-bound control to display comma-separated file data. 這個程式碼範例是針對DataSourceControl類別提供之較大範例的一部分。This code example is part of a larger example provided for the DataSourceControl class.

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 (!string.IsNullOrEmpty(selectArgs.SortExpression)) {
                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();
    }
}
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

   ' 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


' 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

   ' 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
End Namespace

備註

ASP.NET 支援控制項資料系結架構, 可讓 Web 服務器控制項以一致的方式系結至資料。ASP.NET supports a control data-binding architecture that enables Web server controls to bind to data in a consistent fashion. 系結至資料的 Web 服務器控制項稱為資料繫結控制項, 而協助該系結的類別稱為資料來源控制項。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.

當您想IDataSource要執行自己的自訂 ASP.NET 資料來源控制項時, 會執行介面。You implement the IDataSource interface when you want to implement your own custom ASP.NET data source control.

任何實作為IDataSource介面的類別都是資料來源控制項。Any class that implements the IDataSource interface is a data source control. 介面可作為所有 ASP.NET 資料來源控制項的基礎, 並使用其兩種方法來定義其中一個基本資料系結架構概念GetView : 方法和GetViewNames方法。 IDataSourceThe IDataSource interface serves as the foundation for all ASP.NET data source controls and defines one of the fundamental data-binding architecture concepts with its two methods: the GetView method and the GetViewNames method. 這個概念是所有資料來源控制項都支援其資料的一個或多個命名視圖。This concept is that all data source controls support one or more named views on their data. 資料來源 view 物件類似于DataView System.Data命名空間中的抽象概念: 資料可系結、自訂的資料檢視, 用於排序、篩選及 view 所定義的其他資料作業。The data source view object is similar to the DataView abstraction in the System.Data namespace: a data-bindable, customized view of data for sorting, filtering, and other data operations that the view defines. 就核心而言, 資料來源控制項不會執行任何資料的抓取。At its core, a data source control does nothing more than retrieve views on data.

資料來源控制項可以有一或多個相關聯的資料來源 view 物件。A data source control can have one or more associated data source view objects. 某些資料來源控制項 (包括表示關係資料庫 (例如SqlDataSourceAccessDataSource)) 只支援一個 view。Some data source controls, including those that represent relational databases such as SqlDataSource and AccessDataSource, support only one view. 其他資料來源控制項, 包括階層式資料來源控制項 ( SiteMapDataSource例如), 則支援許多視圖。Other data source controls, including hierarchical data source controls such as SiteMapDataSource, support many views. [資料來源] 視圖會定義資料來源的功能, 以及它所支援的作業。The data source view defines the capabilities of a data source and the operations that it supports.

總而言之, 資料來源控制項會實作為IDataSource介面, 對它們所代表的資料支援一個或多個名為的視圖, 而且一律支援從它們所代表的資料來源進行資料抓取。In summary, data source controls implement the IDataSource interface, support one or more named views on the data they represent, and always support data retrieval from the data source they represent. 資料來源控制項一律視需要取得資料, 例如在資料DataBind繫結控制項上呼叫時。Data source controls always retrieve data on demand, such as when DataBind is called on a data bound control.

方法

GetView(String) GetView(String) GetView(String) GetView(String)

取得與資料來源控制項關聯的具名資料來源檢視。Gets the named data source view associated with the data source control.

GetViewNames() GetViewNames() GetViewNames() GetViewNames()

取得名稱集合,表示與 IDataSource 介面關聯的檢視物件清單。Gets a collection of names representing the list of view objects associated with the IDataSource interface.

事件

DataSourceChanged DataSourceChanged DataSourceChanged DataSourceChanged

當資料來源控制項變更而影響資料繫結控制項時發生。Occurs when a data source control has changed in some way that affects data-bound controls.

擴充方法

GetDefaultValues(IDataSource) GetDefaultValues(IDataSource) GetDefaultValues(IDataSource) GetDefaultValues(IDataSource)

取得所指定資料來源的預設值集合。Gets the collection of the default values for the specified data source.

GetMetaTable(IDataSource) GetMetaTable(IDataSource) GetMetaTable(IDataSource) GetMetaTable(IDataSource)

取得所指定資料來源物件中的資料表中繼資料。Gets the metadata for a table in the specified data source object.

TryGetMetaTable(IDataSource, MetaTable) TryGetMetaTable(IDataSource, MetaTable) TryGetMetaTable(IDataSource, MetaTable) TryGetMetaTable(IDataSource, MetaTable)

判斷資料表中繼資料是否可供使用。Determines whether table metadata is available.

適用於

另請參閱