Esporta (0) Stampa
Espandi tutto

Classe DataSourceControl

Aggiornamento: novembre 2007

Funge da classe base per controlli che rappresentano origini dati di controlli con associazione a dati.

Spazio dei nomi:  System.Web.UI
Assembly:  System.Web (in System.Web.dll)

[BindableAttribute(false)]
[AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public abstract class DataSourceControl : Control, 
	IDataSource, IListSource
/** @attribute BindableAttribute(false) */
/** @attribute AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal) */
/** @attribute AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal) */
public abstract class DataSourceControl extends Control implements IDataSource, 
	IListSource
public abstract class DataSourceControl extends Control implements IDataSource, IListSource
<asp:DataSourceControl />

ASP.NET supporta un'architettura di associazione dati per i controlli che consente a controlli server Web di stabilire un'associazione a dati in modo coerente. I controlli server Web che stabiliscono un'associazione a dati vengono definiti controlli con associazione a dati e le classi che semplificano questo tipo di associazione vengono definite controlli origine dati. I controlli origine dati possono rappresentare qualsiasi origine dati: un database relazionale, un file, un flusso, un oggetto business e così via. I controlli origine dati presentano i dati in modo coerente ai controlli con associazione a dati, indipendentemente dall'origine o dal formato dei dati sottostanti.

È possibile utilizzare i controlli origine dati forniti con ASP.NET, inclusi gli oggetti SqlDataSource, AccessDataSource e XmlDataSource, per eseguire la maggior parte delle attività di sviluppo Web. Per implementare un controllo origine dati personalizzato, utilizzare la classe base DataSourceControl.

Nonostante qualsiasi classe che implementa l'interfaccia IDataSource sia un controllo origine dati, la maggior parte dei controlli origine dati ASP.NET estende la classe DataSourceControl astratta, che fornisce un'implementazione di base dell'interfaccia IDataSource. La classe DataSourceControl fornisce inoltre un'implementazione dell'interfaccia IListSource, che consente di assegnare a livello di codice il controllo origine dati alla proprietà DataSource di un controllo con associazione a dati e di restituire dati a questo controllo sotto forma di un elenco semplice.

Qualsiasi controllo ASP.NET che deriva dalla classe DataBoundControl può stabilire un'associazione a un controllo origine dati. Quando un controllo DataBoundControl è associato a un controllo origine dati, l'associazione dati viene eseguita in modo automatico in fase di esecuzione. È inoltre possibile utilizzare controlli origine dati con controlli ASP.NET che espongono una proprietà DataSource o DataSourceID e supportano l'associazione dati di base ma non vengono derivati da DataBoundControl. Quando si utilizzano questi controlli con associazione a dati, è necessario chiamare in modo esplicito il metodo DataBind. Per ulteriori informazioni sull'associazione dati, vedere Accesso ai dati tramite ASP.NET.

Un controllo origine dati può essere considerato come una combinazione dell'oggetto DataSourceControl e degli elenchi di dati associati, denominati viste origine dati. Ogni elenco di dati è rappresentato da un oggetto DataSourceView. Poiché l'archivio dati sottostante contiene uno o più elenchi di dati, un controllo DataSourceControl è sempre associato a uno o più oggetti DataSourceView denominati. L'interfaccia IDataSource definisce i metodi utilizzati da tutti i controlli origine dati per interagire con le viste origine dati: il metodo GetViewNames viene utilizzato per enumerare le viste origine dati attualmente associate al controllo origine dati, mentre il metodo GetView viene utilizzato per recuperare un'istanza di vista origine dati specifica in base al nome.

Il controllo origine dati può anche essere considerato come due interfacce distinte utilizzate dai chiamanti per l'accesso ai dati. La classe DataSourceControl è l'interfaccia con la quale interagiscono direttamente gli sviluppatori di pagine durante lo sviluppo di una pagina Web Form, mentre la classe DataSourceView è l'interfaccia con la quale interagiscono i controlli con associazione a dati e gli autori di tali controlli. Poiché l'oggetto DataSourceView è disponibile solo in fase di esecuzione, qualsiasi stato persistente del controllo origine dati o della vista origine dati deve essere esposto direttamente dal controllo origine dati.

Per i controlli origine dati ASP.NET non è disponibile il rendering visivo. Vengono implementati come controlli, pertanto possono essere creati in modo dichiarativo e possono anche essere impostati in modo da prendere parte alla gestione dello stato. Di conseguenza, i controlli origine dati non supportano funzionalità visive, ad esempio EnableTheming o SkinID.

Nell'esempio di codice riportato di seguito viene illustrato come la classe DataSourceControl può essere estesa da un'altra classe. Il controllo CsvDataSource rappresenta dati archiviati in un file delimitato da virgole con estensione csv. La classe CsvDataSource fornisce proprie implementazioni di GetView, GetViewNames e altri metodi perché le implementazioni della classe base non sono funzionali.

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();
    }
}


Nell'esempio di codice riportato di seguito viene illustrato come utilizzare il controllo CsvDataSource in un Web Form.

<%@ 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>


Qualsiasi membro static (Shared in Visual Basic) pubblico di questo tipo è thread-safe. I membri di istanza non sono garantiti come thread-safe.

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition , Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework e .NET Compact Framework non supportano tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

.NET Framework

Supportato in: 3.5, 3.0, 2.0

Aggiunte alla community

AGGIUNGI
Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione degli utenti in merito al sito Web di MSDN. Se si sceglie di partecipare, quando si lascia il sito Web di MSDN verrà visualizzato il sondaggio in linea.

Si desidera partecipare?
Mostra:
© 2014 Microsoft