次の方法で共有


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

更新 : 2007 年 11 月

このチュートリアルは、バインドできるデータ ソースを公開する単純なデータ バインド サーバー コントロールの作成方法について説明します。

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

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

このチュートリアルで説明するコントロールは、ASP.NET Version 1.1 と互換性があります。ASP.NET Version 2.0 用にカスタム データ バインド Web コントロールを作成する方法の詳細については、「ASP.NET 2.0 用カスタム データ バインド Web サーバー コントロールの開発」を参照してください。

ASP.NET 1.1 データ バインド サーバー コントロールは、次の型にバインドできます。

このチュートリアルでは、IEnumerable インターフェイスを実装する任意のオブジェクトにバインドできるデータ バインド コントロールを作成します。

このチュートリアルでは、以下のタスクを行います。

  • カスタム データ バインド コントロールをテストする Web サイトの作成

  • データ バインド コントロール クラスの作成クラスで IListSource 型または IEnumerable 型のプロパティを公開する必要があります。これによって、ページ開発者はバインドするデータの場所を指定できるようになります。また、基本クラスの DataBind メソッドと CreateChildControls メソッドもオーバーライドします。

  • Web.config ファイルにコントロールを登録します。

  • ASP.NET Web ページのコントロールをテストします。

  • バイナリ コードとして配布できるように、コントロールをコンパイルします。

  • コンパイルしたカスタム データ バインド サーバー コントロールをテストします。

コントロールをテストする Web サイトの作成

ASP.NET の動的コンパイルを使用すると、コントロールをアセンブリにコンパイルせずにページのコントロールをテストできます。ASP.NET は、Web サイトのルートの App_Code ディレクトリに格納されているコードを動的にコンパイルします。App_Code のソース ファイルにあるクラスには、手動でアセンブリにコンパイルせずにページからアクセスできます。

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

App_Code ディレクトリは、ASP.NET 1.0 および 1.1 では使用できなかった新しい機能です。コントロールの初期テストに App_Code ディレクトリを使用するかどうかは任意です。「コントロールのアセンブリへのコンパイル」で説明されているように、サーバー コントロールのビルドの主な手順は以前のバージョンと同じです。

カスタム データ バインド コントロールをテストする Web サイトを作成するには

  1. ServerControlsTest という Web サイトを作成します。

    このサイトは、IIS で ServerControlsTest という仮想ディレクトリとして作成できます。IIS の仮想ディレクトリの作成と構成の詳細については、「方法 : IIS 5.0 および 6.0 内で仮想ディレクトリを作成および構成する」を参照してください。

  2. Web サイトのルート ディレクトリに App_Code ディレクトリを作成します。

SimpleDataBoundControl クラスの作成

次に、コントロール クラスを作成します。

SimpleDataBoundControl クラスを作成するには

  1. 前の手順で作成した App_Code フォルダに、使用しているプログラミング言語に応じて SimpleDataBoundControl.cs または SimpleDataBoundControl.vb というクラスを作成します。

  2. クラス ファイルに次のコードを追加します。

    Imports System
    Imports System.Collections
    Imports System.ComponentModel
    Imports System.Web
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    
    Namespace Samples.ASPNet.VB.Controls
        <DefaultProperty("DataSource")> _
            Public Class SimpleDataBoundControl
            Inherits WebControl
    
            Private _dataSource As IEnumerable
            Private _label As Label
            Private _button As Button
            Private _table As Table
    
            <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
    
            Protected Overridable Function GetDataSource() As IEnumerable
                If _dataSource Is Nothing Then
                    Return Nothing
                End If
    
                Dim resolvedDataSource As IEnumerable
                resolvedDataSource = _dataSource
    
                Return resolvedDataSource
    
            End Function 'GetDataSource
    
            Protected Overridable Sub CreateMyControlHeirarchy(ByVal useViewState As Boolean)
                Dim resolvedDataSource As IEnumerable = Nothing
                If useViewState Then
                    If Not (ViewState("RowCount") Is Nothing) Then
                        resolvedDataSource = New Object(Fix(ViewState("RowCount"))) {}
                    Else
                        Throw New Exception("Unable to retrieve expected data from ViewState")
                    End If
                Else
                    resolvedDataSource = GetDataSource()
                End If
    
                If Not (resolvedDataSource Is Nothing) Then
                    ' Create a label that will indicate form which source the data has been provided.
                    Dim s As String
                    If useViewState Then
                        s = "Data collection retrieved from ViewState:"
                    Else
                        s = "Data collection retrieved from bound data source:"
                    End If
                    _label = New Label()
                    Me.Controls.Add(Me._label)
                    _label.Text = s
    
                    _button = New Button()
                    Me.Controls.Add(Me._button)
                    _button.Text = "Test re-binding of ViewState"
    
                    _table = New Table()
                    Me.Controls.Add(Me._table)
    
                    Dim dataItem As Object
                    For Each dataItem In resolvedDataSource
                        Dim row As New TableRow()
                        _table.Rows.Add(row)
                        Dim cell As New TableCell()
                        If Not useViewState Then
                            cell.Text = dataItem.ToString()
                        End If
                        row.Cells.Add(cell)
                    Next dataItem
    
                    ViewState("RowCount") = _table.Rows.Count
                End If
    
            End Sub 'CreateMyControlHeirarchy
    
            Protected Overrides Sub CreateChildControls()
                Controls.Clear()
    
                If Not (ViewState("RowCount") Is Nothing) Then
                    Dim useViewState As Boolean = True
                    CreateMyControlHeirarchy(useViewState)
                End If
    
            End Sub 'CreateChildControls
    
            Public Overrides Sub DataBind()
                MyBase.OnDataBinding(EventArgs.Empty)
    
                Controls.Clear()
                ClearChildViewState()
                TrackViewState()
    
                Dim useViewState As Boolean = False
                CreateMyControlHeirarchy(useViewState)
    
                ChildControlsCreated = True
            End Sub 'DataBind
    
            Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)
                Me._label.RenderControl(writer)
                Me._table.RenderControl(writer)
                Me._button.RenderControl(writer)
            End Sub 'RenderContents
        End Class 'SimpleDataBoundControl
    End Namespace
    
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace Samples.AspNet.CS.Controls
    {
        [
            DefaultProperty("DataSource")
        ]
        public class SimpleDataBoundControl : WebControl
        {
            private IEnumerable _dataSource;
            private Label _label;
            private Button _button;
            private Table _table;
    
            [
            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();
                    }
                }
            }
    
            protected virtual IEnumerable GetDataSource()
            {
                if (_dataSource == null)
                {
                    return null;
                }
    
                IEnumerable resolvedDataSource;
                resolvedDataSource = _dataSource as IEnumerable;
    
                return resolvedDataSource;
            }
    
            protected virtual void CreateMyControlHeirarchy(bool useViewState)
            {
                IEnumerable resolvedDataSource = null;
                if (useViewState)
                {
                    if (ViewState["RowCount"] != null)
                    {
                        resolvedDataSource = new object[(int)ViewState["RowCount"]];
                    }
                    else
                    {
                        throw new Exception("Unable to retrieve expected data from ViewState");
                    }
                }
                else
                {
                    resolvedDataSource = GetDataSource();
                }
    
                if (resolvedDataSource != null)
                {
                    // Create a label that will indicate form which source the data has been provided.
                    String s;
                    if (useViewState)
                    {
                        s = "Data collection retrieved from ViewState:";
                    }
                    else
                    {
                        s = "Data collection retrieved from bound data source:";
                    }
                    _label = new Label();
                    this.Controls.Add(this._label);
                    _label.Text = s;
    
                    _button = new Button();
                    this.Controls.Add(this._button);
                    _button.Text = "Test re-binding of ViewState";
    
                    _table = new Table();
                    this.Controls.Add(this._table);
    
                    foreach (object dataItem in resolvedDataSource)
                    {
                        TableRow row = new TableRow();
                        _table.Rows.Add(row);
                        TableCell cell = new TableCell();
                        if (!useViewState)
                        {
                            cell.Text = dataItem.ToString();
                        }
                        row.Cells.Add(cell);
                    }
    
                    ViewState["RowCount"] = _table.Rows.Count;
                }
            }
    
            protected override void CreateChildControls()
            {
                Controls.Clear();
    
                if (ViewState["RowCount"] != null)
                {
                    bool useViewState = true;
                    CreateMyControlHeirarchy(useViewState);
                }
            }
    
            public override void DataBind()
            {
                base.OnDataBinding(EventArgs.Empty);
    
                Controls.Clear();
    
                ClearChildViewState();
    
                TrackViewState();
    
                bool useViewState = false;
                CreateMyControlHeirarchy(useViewState);
    
                ChildControlsCreated = true;
            }
    
            protected override void RenderContents(HtmlTextWriter writer)
            {
                this._label.RenderControl(writer);
                this._table.RenderControl(writer);
                this._button.RenderControl(writer);
            }
        }
    }
    

コードの説明

SimpleDataBoundControl クラスは、DataSource プロパティで指定したデータ収集に基づいて、HTML テーブルを描画します。ASP.NET 1.1 のデータ バインド Web サーバー コントロールでは、バインドできる DataSource プロパティを公開する必要があります。このプロパティは、IEnumerable 型または IListSource 型に設定できます。

このコード例の DataSource プロパティの set アクセサでは、設定値が null か IEnumerable 型のオブジェクトかを検証します。そのため、この例では、ページの開発時に任意の IEnumerable 型 (ArrayArrayListHashtable の各オブジェクトなど) にバインドできます。また、最初は DataSource を既定の null 値のままにして、コードでプロパティを設定することもできます。

メタデータ属性 Category、DefaultValue、および Description は、デザイン ツール、ASP.NET ページ パーサー、および共通言語ランタイムで使用する情報を提供します。

CreateMyControlHeirarchy ヘルパー メソッドは、1 つの共通コード パスにあるコントロールの子コントロールの階層構造の作成を維持します。このメソッドは、オーバーライドした DataBind メソッドとオーバーライドした CreateChildControls メソッドの両方から呼び出されます。オーバーライドした DataBind メソッドが必要です。このメソッドは、関連付けられたデータ ソースのオブジェクトを列挙し、子コントロールを作成します。オーバーライドした CreateChildControls メソッドが必要です。このメソッドは、ビューステートに保存されているデータに基づいて、子コントロールの階層構造を再作成します。

このコントロールは、継承された RenderContents メソッドをオーバーライドしてレンダリングします。こうすることで、コントロールを独自のタグ内にレンダリングできます。RenderContents メソッドに渡されるパラメータは HtmlTextWriter 型のオブジェクトで、タグおよびその他の HTML (および HTML バリアント) のマークアップのレンダリングのためのメソッドを含むユーティリティ クラスです。

データ バインド Web サーバー コントロールに必要な実装の詳細については、「ASP.NET 1.1 用カスタム データ バインド Web サーバー コントロールの開発」を参照してください。

タグ プリフィックスの作成

タグ プリフィックスは、コントロールを宣言によってページに作成する場合にコントロールの型名の前に記述される <asp:Table /> の "asp" のようなプリフィックスです。ASP.NET ページでコントロールを宣言によって使用できるようにするには、コントロールの名前空間にマップされるタグ プリフィックスが必要です。タグ プリフィックス/名前空間のマッピングを提供するには、次の例のように、カスタム コントロールを使用する各ページに @ Register ディレクティブを追加します。

<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.CS.Controls"%>
<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.VB.Controls"%>
ms366541.alert_note(ja-jp,VS.90).gifメモ :

ASP.NET 2.0 の @ Register ディレクティブは、ASP.NET 1.0 および ASP.NET 1.1 と同じです。ASP.NET の以前のバージョンの @ Register ディレクティブに慣れているユーザーは、以前の @ Register ディレクティブにあったコントロールのアセンブリの名前を指定する assembly 属性がないことに注意します。assembly 属性がないと、ASP.NET はアセンブリが App_Code ディレクトリのソース ファイルから動的にコンパイルされると見なします。

タグ プリフィックス/名前空間のマッピングは、.aspx の各ページで @ Register ディレクティブを使用して指定する代わりに、Web.config ファイルで指定することもできます。この方法は、Web アプリケーションの複数のページでカスタム コントロールを使用する場合に便利です。

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

構成ファイルのタグ プリフィックスのエントリは、ASP.NET 2.0 の新しい機能です。ASP.NET 1.0 および 1.1 におけるタグ プリフィックスのマッピングは、カスタム コントロールを使用する各ページの @ Register ディレクティブで指定していました。

マップするタグ プリフィックスを Web.config ファイルで指定する方法については、次の手順で説明します。

Web.config ファイルにタグ プリフィックスのマッピングを追加するには

  1. Web サイトに Web.config というテキスト ファイルがない場合は、Web サイトのルート フォルダに作成します。

  2. Web.config ファイルを新規作成する場合は、空のファイルに次の XML マークアップをコピーしてから保存します。サイトに Web.config ファイルが既にある場合、次の強調表示された要素を追加します。

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

    タグ プレフィックス エントリは、<system.web> の <pages> セクション以下の <controls> の子要素である必要があります。

    <?xml version="1.0"?>
    <configuration>
      <system.web>    
       <pages>
         <controls>
           <add tagPrefix="aspSample"            namespace="Samples.AspNet.CS.Controls">       </add>
         </controls>
       </pages>
      </system.web>
    </configuration>
    
    <?xml version="1.0"?>
    <configuration>
      <system.web>    
       <pages>
         <controls>
           <add tagPrefix="aspSample"            namespace="Samples.AspNet.VB.Controls">       </add>
         </controls>
       </pages>
      </system.web>
    </configuration>
    

    強調表示されている部分は、"aspSample" というタグ プリフィックスを Samples.AspNet.CS.Controls または Samples.AspNet.VB.Controls という名前空間にマップするタグ プリフィックスのエントリを示します。

構成ファイルでタグ プリフィックスのマッピングを指定すると、Web サイトの任意のページで SimpleDataBoundControl コントロールを <aspSample:SimpleDataBoundControl /> と宣言して使用できます。

カスタム データ バインド コントロールを使用するページの作成

チュートリアルのこのセクションでは、カスタム データ バインド コントロールをテストできるページのマークアップを作成します。

カスタム データ バインド コントロールを使用するページを作成するには

  1. Web サイトに TestSimpleDataBoundControl.aspx というファイルを作成します。

  2. 次のマークアップを TestSimpleDataBoundControl.aspx ファイルにコピーし、ファイルを保存します。

    <%@ 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">
    <script runat="server">
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
            If Not IsPostBack Then
                Dim a As New ArrayList()
                a.Add("One")
                a.Add("Two")
                a.Add("Three")
                a.Add("Four")
    
                simpleDataBoundControl1.DataSource = a
                simpleDataBoundControl1.DataBind()
            End If
        End Sub 'Page_Load
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title>SimpleDataBoundControl test page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <aspSample:SimpleDataBoundControl runat="server" id="simpleDataBoundControl1" BorderStyle="Solid" ></aspSample:SimpleDataBoundControl>
        </div>
        </form>
    </body>
    </html>
    
    <%@ Page Language="C#" Trace="true" EnableViewState="true" %>
    <%@ 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">
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ArrayList a = new ArrayList();
                a.Add("One");
                a.Add("Two");
                a.Add("Three");
                a.Add("Four");
    
                simpleDataBoundControl1.DataSource = a;
                simpleDataBoundControl1.DataBind();
            }
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>SimpleDataBoundControl test page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <aspSample:SimpleDataBoundControl runat="server" id="simpleDataBoundControl1" BorderStyle="Solid" ></aspSample:SimpleDataBoundControl>
        </div>
        </form>
    </body>
    </html>
    
  3. TestSimpleDataBoundControl.aspx ページを実行します。

  4. カスタム コントロールのソース コードを変更します。たとえば、RenderContents メソッドの最後に次のコード行を追加して、追加の文字列を記述します。

    writer.Write("<br />Testing how the App_Code directory works.");
    
    writer.Write("<br />Testing how the App_Code directory works.")
    
  5. ブラウザで TestSimpleDataBoundControl.aspx ページを再表示します。

    コントロールをコンパイルしていませんが、コントロールに加えた変更がページに反映されているのがわかります。

コントロールのアセンブリへのコンパイル

App_Code ディレクトリによって、コンパイルせずにコントロールをテストできますが、他の開発者にオブジェクト コードとしてコントロールを配布する場合はコンパイルする必要があります。また、コンパイルしてアセンブリを生成しなければ、コントロールをビジュアル デザイナのツールボックスに追加することはできません。

コントロールをアセンブリにコンパイルするには

  1. 次の手順を実行して、コンピュータの Windows の PATH 環境変数に .NET Framework のインストール パスを含めます。

    1. Windows で、[マイ コンピュータ] アイコンを右クリックし、[プロパティ] をクリックします。次に、[詳細設定] タブで、[環境変数] をクリックします。

    2. [システム環境変数] の一覧の Path 変数をダブルクリックします。

    3. [変数値] ボックスで、既存の値の最後にセミコロン (;) を追加し、各自の .NET Framework のインストール パスを入力します。通常の場合、.NET Framework は Windows のインストール ディレクトリ (\Microsoft.NET\Framework\versionNumber) にインストールされます。

    4. [OK] をクリックしてダイアログ ボックスを閉じます。

  2. このチュートリアルの前の手順で作成したソース ファイルが保存されている App_Code ディレクトリから、次のコマンドを実行します。

    App_Code ディレクトリに Samples.AspNet.CS.Controls.dll または Samples.AspNet.VB.Controls.dll というアセンブリが生成されます。

    csc /t:library /out:Samples.AspNet.CS.Controls.dll /r:System.dll /r:System.Web.dll *.cs
    
    vbc /t:library /out:Samples.AspNet.VB.Controls.dll /r:System.dll /r:System.Web.dll *.vb
    

    /t:library コンパイラ オプションを指定すると、実行可能なアセンブリではなくライブラリが作成されます。/out オプションにはアセンブリの名前を指定し、/r オプションにはこのアセンブリにリンクするアセンブリを列挙します。

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

    この例が独立して動作できるように、このチュートリアルではコントロールを 1 つだけ使用してアセンブリを作成しています。.NET Framework の一般的な設計ガイドラインでは、数個のクラスしか含まないアセンブリは作成しないことをお勧めします。簡単に配置できるように、作成するアセンブリの数を少なくする必要があります。

TagPrefixAttribute によるタグ プリフィックス/名前空間のマッピング

ページまたは Web.config ファイルにタグ プレフィックスを指定する方法については前述しました。コントロールをコンパイルするときに、コントロールにアセンブリ レベルの System.Web.UI.TagPrefixAttribute 属性を含めて、ビジュアル デザイナが既定で使用するタグ プリフィックスを指定することもできます。TagPrefixAttribute 属性は、ビジュアル デザイナが Web.config ファイルまたはページの @ Register ディレクティブにタグ プリフィックスのマッピングを見つけることができない場合に使用するタグ プリフィックスを提供できるため便利です。タグ プリフィックスは、ツールボックスでコントロールを最初にダブルクリックするか、ツールボックスからページにドラッグする際にページに登録されます。

TagPrefixAttribute 属性を使用する場合は、コントロールと共にコンパイルする別のファイルに指定します。名前付け規則によって、ファイル名は AssemblyInfo.cs または AssembyInfo.vb などのように、AssemblyInfo.languageExtension となります。次の手順では、TagPrefixAttribute メタデータを指定する方法を説明します。

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

コントロールのアセンブリで TagPrefixAttribute を指定しない場合、またはページ開発者がページまたは Web.config ファイルでタグ プリフィックス/名前空間のマッピングを指定しない場合、ビジュアル デザイナは既定のタグ プリフィックスを作成することがあります。たとえば Visual Studio 2005 は、コントロールをツールボックスからドラッグする際に、cc1 などの独自のタグを作成します。

TagPrefixAttribute を使用してタグ プリフィックスのマッピングを追加するには

  1. ソース コードのディレクトリに AssemblyInfo.cs または AssemblyInfo.vb というファイルを作成し、次のコードをファイルに追加します。

    using System;
    using System.Web.UI;
    [assembly: TagPrefix("Samples.AspNet.CS.Controls", "aspSample")]
    
    Imports System
    Imports System.Web.UI
    <Assembly: TagPrefix("Samples.AspNet.VB.Controls", "aspSample")> 
    

    このタグ プリフィックスの属性は、Samples.AspNet.CS.Controls 名前空間または Samples.AspNet.VB.Controls 名前空間と aspSample プリフィックスの間のマッピングを作成します。

  2. 以前に使用したコンパイル コマンドを使用して、埋め込みリソースを含めるか、または含めずに、すべてのソース ファイルを再コンパイルします。

ASP.NET ページでのコンパイルされたカスタム データ バインド サーバー コントロールの使用

カスタム コントロールのコンパイル済みバージョンをテストするには、コントロールのアセンブリを Web サイトでページから使用できるようにする必要があります。

コントロールのアセンブリを Web サイトから使用できるようにするには

  1. Web サイトのルートに Bin ディレクトリがない場合は作成します。

  2. コントロール アセンブリ (Samples.AspNet.CS.Controls.dll または Samples.AspNet.VB.Controls.dll) を App_Code ディレクトリから Bin ディレクトリにドラッグ (移動) します。

  3. コントロールのソース ファイルを App_Code ディレクトリから Web サイトの別のディレクトリに移動します。

    ソース ファイルを App_Code ディレクトリ以外に移動しないと、コントロールの型はコンパイルしたアセンブリと、ASP.NET で動的に生成されたアセンブリの両方に存在することになります。その結果、コントロールを読み込むときにあいまいな参照が発生し、そのコントロールを使用しているページでコンパイラ エラーが生成されます。

このチュートリアルで作成したアセンブリは、Web サイトのページでコントロールを使用するために ASP.NET Web サイトの Bin ディレクトリに格納する必要があるためプライベート アセンブリです。他のアプリケーションは、アセンブリのコピーをインストールしない限り、このアセンブリにアクセスすることはできません。共有された Web ホスト アプリケーションのためのコントロールを作成する場合は、一般にプライベート アセンブリに各自のコントロールをパッケージします。ただし、専用のホスト環境で使用するコントロールを作成する場合、または ISP がすべての顧客に提供する一連のコントロールを作成する場合は、グローバル アセンブリ キャッシュにインストールする厳密な名前が付けられた共有のアセンブリでコントロールをパッケージする必要があります。詳細については、「アセンブリとグローバル アセンブリ キャッシュの使用」を参照してください。

次に、Web.config ファイルに作成したタグ プリフィックスのマッピングを変更してコントロールのアセンブリ名を指定する必要があります。

Web.config ファイルにタグ プリフィックスのマッピングを変更するには

  • Web.config ファイルを編集し、<add tagPrefix=name> 要素に assembly 属性を追加します。

    <controls>
      <add tagPrefix="aspSample"
        namespace="Samples.AspNet.CS.Controls" 
        assembly="Samples.AspNet.CS.Controls">
      </add>
    </controls>
    
    <controls>
      <add tagPrefix="aspSample"   
        namespace="Samples.AspNet.VB.Controls" 
        assembly="Samples.AspNet.VB.Controls">
      </add>
    </controls>
    

assembly 属性に、コントロールが含まれるアセンブリ名を指定します。<add tagPrefix=name> 要素は、タグ プレフィックスを名前空間とアセンブリの組み合わせに対応付けます。ASP.NET が App_Code ディレクトリのソース ファイルからアセンブリを動的に生成する場合、アセンブリ属性は必要ありません。アセンブリ属性が使用されない場合、ASP.NET は App_Code ディレクトリから動的に生成されるアセンブリからコントロールの型を読み込みます。

コントロールをページに表示してテストできるようになりました。

カスタム コントロールを使用するページを表示するには

  • 次の URL をアドレス バーに入力して TestSimpleDataBoundControl.aspx ページを表示します。

    https://localhost/ServerControlsTest/TestSimpleDataBoundControl.aspx
    

Visual Studio 2005 などのビジュアル デザイナでコントロールを使用する場合は、ツールボックスにコントロールを追加し、ツールボックスからデザイン サーフェイスにドラッグし、プロパティ ブラウザでプロパティとイベントにアクセスできます。さらに、Visual Studio 2005 では、コントロールはページ デザイナの [ソース] ビューとコード エディタで IntelliSense を完全にサポートします。

次の手順

この単純なカスタム データ バインド サーバー コントロールは、カスタム コントロールを作成するときに使用する基本的な手順を説明するものです。このカスタム コントロールを使用すると、標準的な方法で、外部データ ソースにバインドできます。このコントロールを参照して、Visual Studio で高度なカスタム サーバー コントロールを作成できます。次に行う作業の例を示します。

参照

処理手順

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

概念

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

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

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

参照

HierarchicalDataBoundControlDesigner

その他の技術情報

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