ASP.NET 1.1 用カスタム データ バインド Web サーバー コントロールの開発

更新 : 2007 年 11 月

ASP.NET データ バインド Web サーバー コントロールには、レコードまたはアイテムのコレクションを表すデータ ソースのユーザー インターフェイス (UI: User Interface) があります。データ バインド Web サーバー コントロールの例として、GridView Web サーバー コントロールの概要DataList Web サーバー コントロールの概要Repeater Web サーバー コントロールの概要 が挙げられます。ASP.NET に付属するデータ バインド コントロールの詳細については、「ASP.NET のデータ バインド Web サーバー コントロールの概要」を参照してください。

このトピックでは、ASP.NET Version 1.1 に互換性のあるカスタム データ バインド サーバー コントロールの最小バージョンを実装するために必要な手順について説明します。ASP.NET Version 2.0 でカスタム データ バインド コントロールを作成する方法の詳細については、「ASP.NET 2.0 用カスタム データ バインド Web サーバー コントロールの開発」を参照してください。カスタム コントロールの全般的なアーキテクチャや実装方法の詳細については、「ASP.NET カスタム サーバー コントロールの開発」および「チュートリアル : カスタム サーバー コントロールの開発と使用」を参照してください。

カスタム データ バインド コントロールを作成する場合

カスタム データ バインド コントロールを作成する前に、ASP.NET に付属するデータ バインド コントロールの機能を確認します。既存のコントロールで要件に合う場合や、必要な機能の多くを備えた既存のコントロールを拡張してカスタム コントロールを作成できる場合があります。ASP.NET のデータ バインド コントロールの詳細については、「ASP.NET のデータ バインド Web サーバー コントロールの概要」を参照してください。

カスタム データ バインド コントロールを作成する理由について、いくつか例を挙げて説明します。

  • 既存のデータ バインド コントロールでは使用できない、カスタムの UI、カスタムのデータ並べ替え機能、カスタムのデータ編集機能などが必要な場合。

  • コンパイル済みで再頒布可能なカスタム データ バインド コントロールを作成する場合。

  • ASP.NET に付属するデータ バインド コントロールの機能を拡張する場合。

  • カスタム デザイナで特定の要件に適合するデータ バインド コントロールを作成する場合。

カスタム データ バインド コントロールの基本機能

カスタム データ バインド コントロールは、Control クラスまたは WebControl クラスから派生することで、次のような多数の組み込み機能を自動的に継承します。

  • データ バインド式をサポートする明示的なデータ バインド モデル。ASP.NET の明示的な データ バインド モデルでは、ポストバックごとではなく、必要な場合にのみデータ バインディングを実行します。ページで最初のデータ バインディング要求を実行すると、以降の要求ではビューステートからデータの取得を試みます。これによって、要求ごとにデータ ソースに再接続する必要はなくなるため、パフォーマンスが向上します。

  • データ バインディング式をサポートします。そのため、ページを開発するときに、公開されているコントロールのマークされたプロパティと、データ ソースとの間にバインディングを作成できます。データ バインド式の詳細については、「データ バインド式の概要」を参照してください。

デザイン時に使用できる機能の利用

カスタム データ バインド コントロールを作成するときに、すべての Web サーバー コントロールで使用できるデザイン時の機能があります。カスタム コントロール用のデザイナ クラスとコントロール テンプレートを作成できます。このような機能は、Visual Studio のデザイン ビューなど、ビジュアル デザイン サーフェイスで作業するときに呼び出されます。

コントロール デザイナを作成して、ページ開発者がコントロール プロパティをカスタマイズできるデザイン時のインターフェイスを提供することで、デザイン時のカスタム コントロールの使用性を大幅に向上できます。ASP.NET のコントロール デザイナの概要については、「ASP.NET コントロール デザイナの概要」を参照してください。例については、「HierarchicalDataBoundControlDesigner」および「チュートリアル : Web サーバー コントロール用の基本的なコントロール デザイナの作成」を参照してください。

テンプレート コントロールを作成することで、ページ開発者は、コントロールのユーザー インターフェイスを定義するコントロールとマークアップを柔軟に指定できるようになります。カスタム テンプレート コントロールの例については、「テンプレート サーバー コントロールの例」を参照してください。

ASP.NET でのカスタム データ バインド コントロールの実装

次の表に、ASP.NET 1.1 でデータ バインド サーバー コントロールを実装する場合に固有の要件をまとめます。表の下に、各実装要件の詳細情報について説明します。

必要条件

説明

DataSource プロパティを公開します。

ページ開発者が、コントロールを使用してバインド対象のデータ ソースを指定できます。

DataBind メソッドをオーバーライドし、関連するデータ ソースのオブジェクトを列挙するロジックを作成します。

このメソッドのロジックの場合

  • サーバー コントロールの OnDataBinding メソッドを呼び出して DataBind イベントを発生させます。これによって、データ バインド サーバー コントロールと関連付けたデータ バインディング式を評価できるようになります。

  • このデータ ソースのオブジェクトを列挙するには、すべてのロジックを作成する必要があります。

  • すべての子コントロールを作成して、データ ソースをビジュアル表現します。

CreateChildControls メソッドをオーバーライドすることで子コントロールの階層構造を作成します。

ポストバックでは、子コントロールを再作成し、以前の DataBind 呼び出しでビューステートに格納されたデータにバインドします。

ms366538.alert_note(ja-jp,VS.90).gifメモ :

DataBind メソッドと CreateChildControls メソッドから呼び出して 1 つのヘルパー メソッドを作成し、子コントロールの階層構造を作成するとします。たとえば、子コントロールの階層構造を作成するヘルパー メソッドでは、バインドされたソースまたはビューステートのデータである Boolean 値を受け入れることができます。このパターンは、1 つの共通コード パスにあるコントロールの子コントロールの階層構造の作成を維持します。このパターンの例については、「チュートリアル : ASP.NET 1.1 用カスタム データ バインド ASP.NET Web コントロールの作成」を参照してください。

DataSource プロパティの公開

ページ開発時に、サーバー コントロールのバインド対象であるデータ収集を選択できるようにするには、Control または WebControl から派生した ASP.NET 1.1 データ バインド コントロールで DataSource プロパティを公開する必要があります。データ バインド コントロールは、実行時、DataSource プロパティに割り当てられたデータ収集を表す UI 要素を作成してバインドする際に、そのデータ収集のデータを列挙します。

データ バインド サーバー コントロールは、次のような種類のデータをバインドできます。

データ バインド コントロールの DataSource プロパティを公開する方法のコード例を次に示します。DataSource 型は IEnumerable 型と宣言されます。

<Category("Data"), DefaultValue(""), Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")> _
Public Overridable Property DataSource() As IEnumerable
    Get
        Return _dataSource
    End Get
    Set(ByVal value As IEnumerable)
        If TypeOf value Is IEnumerable OrElse value Is Nothing Then
            _dataSource = value
        Else
            Throw New ArgumentException()
        End If
    End Set
End Property
[
Category("Data"),
DefaultValue(""),
Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")
]
public virtual IEnumerable DataSource
{
    get
    {
        return _dataSource;
    }
    set
    {
        if ((value is IEnumerable) || (value == null))
        {
            _dataSource = value;
        }
        else
        {
            throw new ArgumentException();
        }
    }
}

この例は、[Category]、[DefaultValue] 、[Description] などのメタデータ属性で始まります。この属性は、デザイン ツール、ASP.NET ページ パーサー、ASP.NET ランタイム、および共通言語ランタイム (CLR) で使用する情報を提供します。BindableAttribute はビジュアル デザイナに対して、コントロールに連結できるプロパティをプロパティ ブラウザのダイアログ ボックスに表示することを通知します。たとえば Visual Studio では、連結できるプロパティは [データ連結] ダイアログ ボックスに表示されます。CategoryAttribute は、ビジュアル デザイナのプロパティ ブラウザでプロパティを分類する方法を指定します。この例で使用するメタデータ属性など、メタデータ属性の詳細については、「カスタム サーバー コントロールのメタデータ属性」を参照してください。

DataSource プロパティの set アクセサは set の値が null か IEnumerable 型かを検証します。そのため、この例では、ページの開発時にデータを任意の IEnumerable 型 (ArrayArrayListHashtable など) にバインドできます。または、適切な IEnumerable 型のデータ ソースが使用できるようになるまで、DataSource を null に設定できます。

ms366538.alert_note(ja-jp,VS.90).gifメモ :

カスタム データ バインド サーバー コントロールが、IEnumerable または IListSource の各データ型のどちらかにバインドできる場合、DataSource プロパティを Object ジェネリック型で宣言できます。この場合、DataSource プロパティを公開する set アクセサでは、渡されるオブジェクトの型を検証し、IEnumerable または IListSource を実装する必要があります。

DataBind メソッドのオーバーライドと関連付けられたデータ ソースの列挙

カスタム コントロールにある基本の DataBind メソッドにオーバーライドを指定し、2 つのタスクを実行できるようにします。バインドされたデータ収集内を列挙するタスクと、そのデータを表す子コントロールの階層構造を作成するタスクです。次の一覧に、オーバーライドした DataBind メソッド内で実行する必要のあるタスクをまとめます。

  • カスタム コントロールの基本の OnDataBinding メソッドを呼び出します。

  • 既存の子コントロールをクリアします。

  • すべての子コントロールのビューステートをクリアします。

  • データ バインディング時の変更がビューステートで維持されるように、状態を追跡します。

  • 子コントロールの階層構造を作成します。

  • ChildControlsCreated プロパティを true に設定します。

まず、コントロールにあるオーバーライドした DataBind メソッド内から、コントロールの基本の OnDataBinding メソッドを呼び出します。コントロールの基本の OnDataBinding メソッドを呼び出すと、コントロールのすべてのデータ バインディング式が評価されます。次のコード例は、オーバーライドした DataBind メソッド内で最初のタスクとして、データ バインド サーバー コントロールの OnDataBinding メソッドを呼び出す方法です。

public override void DataBind()
{
    base.OnDataBinding(EventArgs.Empty);
}
Public Overrides Sub DataBind()
    MyBase.OnDataBinding(EventArgs.Empty)
End Sub

次に、既存の子コントロールをクリアします。子コントロールの階層構造は、バインドするデータに基づいて各ポストバックで再作成する必要があるため、既存の子コントロールは、コントロールの継承した Clear メソッドを呼び出してクリアする必要があります。このコード例を次に示します。

public override void DataBind()
{
    base.OnDataBinding(EventArgs.Empty);
    Controls.Clear();
}
Public Overrides Sub DataBind()
    MyBase.OnDataBinding(EventArgs.Empty)
    Controls.Clear()
End Sub

既存の子コントロールのビューステートを破棄するために、新しくバインドされたデータを表す新しい子コントロールを作成します。コントロールの継承した ClearChildViewState メソッドを呼び出して、すべての子コントロールのビューステートをクリアします。

すべての既存の子コントロールの状態をクリアしてから、コントロールの継承した TrackViewState (ビューステートを追跡します) を呼び出して、コントロールのビューステート追跡を開始します。コントロールのビューステート追跡は、子コントロールの階層構造を作成する前に開始します。これは、データ バインディング時に行われた子コントロールの変更が、ビューステートの間、維持されるようにするためです。ページを開発する際、ページの PreInit イベント時に DataBind を呼び出すことができるため、ページのライフ サイクルでその段階後に発生するビューステートを、コントロールの基本クラスで追跡すると想定することはできません。この場合、コントロールのビューステートの追跡は、プロセスの必要なタイミングよりも後で発生します。

次のコード例は、データ バインド サーバー コントロールが TrackViewState メソッドを呼び出す方法を示します。

public override void DataBind() 
{
    TrackViewState();
}
Public Overrides Sub DataBind()
    TrackViewState()
End Sub

次に、子コントロールの階層構造を作成します。子コントロールの階層構造は、カスタム データ バインド コントロールをバインドするデータ ソースをビジュアル表現したもので、カスタム コントロールのオーバーライドした DataBind メソッドまたは CreateChildControls メソッドをコントロールの基本クラスから呼び出すときに作成されます。コントロールのオーバーライドした DataBind をコントロールの基本クラスから呼び出すと、バインドされたデータ ソースに基づいてコントロールの子階層が作成されます。コントロールのオーバーライドした CreateChildControls メソッドを基本クラスから呼び出すと、ビューステートに保存されたデータに基づいて子コントロールの階層構造が作成されます。

子コントロールの階層構造は、コントロールの DataBind メソッドを呼び出すことで作成されます。この子コントロールは、公開された DataSource プロパティが提供するデータを列挙し、各データ項目を表す新しい子コントロールをインスタンス化します。たとえば、データ ソースが、Button コントロールの Text プロパティにバインドされる文字列の配列である場合、配列を反復処理し、新しい Button コントロールを作成します。このコントロールでは、Text プロパティを文字列で表される反復データ項目に割り当てます。

子コントロールの階層構造を作成した後は、ChildControlsCreated プロパティを true に設定し、CreateChildControls メソッドが基本クラスから呼び出されないように指定します。

次のコード例は、データ バインド サーバー コントロールが ChildControlsCreated プロパティを true に設定する方法を示します。

public override void DataBind()
{
     ChildControlsCreated = true;
} 
Public Overrides Sub DataBind()
    ChildControlsCreated = True
End Sub

カスタム データ バインド コントロール クラスには、オーバーライドした CreateChildControls メソッドがあります。このメソッドでは、コントロールが子コントロールの階層構造を再作成し、保存したビューステートを適用できます (保存されたビューステートは、コントロールの DataBind メソッドに対する最近の呼び出し時に追跡されます)。

次の一覧に、オーバーライドした CreateChildControls メソッド内で実行する必要があるタスクをまとめます。

  • 既存の子コントロールをクリアします。

  • ビューステートが使用できる場合、子コントロールの階層構造を作成します。

子コントロールの階層構造を再作成する前に、既存の子コントロール オブジェクトをクリアします。この処理は、コントロールの Clear メソッドを呼び出すことで実行されます。

次のコード例は、データ バインド サーバー コントロールが Clear メソッドを呼び出す方法を示します。

public override void CreateChildControls()
{
    Controls.Clear();
}

最後の手順として、子コントロールの階層構造を作成します。ビューステートを使用できる場合、CreateChildControls メソッドで子コントロールの階層構造を再作成します。同じ階層にある子コントロールの数と型が同じであれば、保存されたビューステートは自動的に子コントロールに適用されます。数、型、階層が同じ子コントロールを再作成するために必要な情報は、コントロールの ViewState プロパティに保存できます。コントロールのビューステートの保存方法の詳細については、「ViewState」を参照してください。カスタム データ バインド コントロールに子コントロールの階層構造を作成する詳細なコード例については、「チュートリアル : ASP.NET 1.1 用カスタム データ バインド ASP.NET Web コントロールの作成」を参照してください。

カスタム サーバー コントロールのビルド

カスタム データ バインド Web サーバー コントロールをビルドする方法と Web ページで使用する方法の詳細については、「カスタム サーバー コントロールの例のビルド」を参照してください。

ms366538.alert_note(ja-jp,VS.90).gifメモ :

コンパイルに含めるには、System.Design アセンブリへの参照を追加する必要があります。

参照

処理手順

チュートリアル : ASP.NET 1.1 用カスタム データ バインド ASP.NET Web コントロールの作成

チュートリアル : カスタム サーバー コントロールの開発と使用

概念

ASP.NET のデータ バインド Web サーバー コントロールの概要

カスタム サーバー コントロールのメタデータ属性

ASP.NET コントロール デザイナの概要

参照

HierarchicalDataBoundControlDesigner

その他の技術情報

ASP.NET カスタム サーバー コントロールの開発