次の方法で共有


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

更新 : 2007 年 11 月

このチュートリアルでは、単純なデータ バインド Web サーバー コントロールを ASP.NET Version 2.0 で作成する方法について説明します。ASP.NET 2.0 では、データ ソース モデルを使用して、データ バインド コントロールをデータ ソース コントロールにバインドできます。そのため、ページング、並べ替え、削除などの一般的なデータ操作をデータ バインド コントロールそのものから分離できます。このデータ モデルは、ページを開発するときに、より柔軟なデータ バインド コントロールを生成し、再利用性のレベルを向上できます。ASP.NET 2.0 のデータ ソース モデルは、データ収集オブジェクトへの直接のバインディングもサポートしています。ASP.NET 2.0 のデータ モデルでカスタム データ バインド コントロールを開発する方法の詳細については、「ASP.NET 2.0 用カスタム データ バインド Web サーバー コントロールの開発」を参照してください。

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

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

  • 動的なコンパイルでカスタム データ バインド コントロールをテストする Web サイトを作成します。

  • DataBoundControl 基本クラスを拡張するデータ バインド コントロール クラスを作成します。このクラスは、バインドされたデータを表す表の列を表示します。データ バインド コントロール クラスに必要な機能の概要を次に示します。

    • 基本のデータ バインド コントロール クラスの PerformSelect メソッドのオーバーライド。このメソッド内から、データ取得を開始するタスクを実行します。

    • IEnumerable 型のパラメータが 1 つある、戻り値を受け取るメソッド。必要なデータ処理はこのメソッド内で実行されます。最後の手順として、PerformDataBinding メソッドを呼び出してデータ バインディングを開始します。

    • PerformDataBinding メソッドのオーバーライド。このメソッド内から、取得したデータを列挙し、子コントロールを追加してデータを表します。

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

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

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

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

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

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

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

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

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

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

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

  2. Web サイトのルート ディレクトリ (Web アプリケーションのルート) の直下に App_Code ディレクトリを作成します。

SimpleDataBoundColumn クラスの作成

ここでは、DataBoundControl クラスを拡張するデータ バインド コントロール クラスを作成します。この新しいコントロールには、バインドされたデータが 1 列のテーブルとして表示されます。

SimpleDataBoundColumn クラスを作成するには

  1. App_Code ディレクトリに、SimpleDataBoundColumn.cs または SimpleDataBoundColumn.vb という名前のクラスを作成します。

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

    Imports System
    Imports System.Collections
    Imports System.ComponentModel
    Imports System.Security.Permissions
    Imports System.Web
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    
    Namespace Samples.AspNet.Controls.VB
    
        <AspNetHostingPermission(SecurityAction.Demand, _
            Level:=AspNetHostingPermissionLevel.Minimal), _
            AspNetHostingPermission(SecurityAction.InheritanceDemand, _
            Level:=AspNetHostingPermissionLevel.Minimal)> _
        Public Class SimpleDataBoundColumn
            Inherits DataBoundControl
    
            Public Property DataTextField() As String
                Get
                    Dim o As Object = ViewState("DataTextField")
                    If o Is Nothing Then
                        Return String.Empty
                    Else
                        Return CStr(o)
                    End If
                End Get
                Set(ByVal value As String)
                    ViewState("DataTextField") = value
                    If (Initialized) Then
                        OnDataPropertyChanged()
                    End If
                End Set
            End Property
    
            Protected Overrides Sub PerformSelect()
                ' Call OnDataBinding here if bound to a data source using the
                ' DataSource property (instead of a DataSourceID), because the
                ' databinding statement is evaluated before the call to GetData.       
                If Not IsBoundUsingDataSourceID Then
                    OnDataBinding(EventArgs.Empty)
                End If
    
                ' The GetData method retrieves the DataSourceView object from  
                ' the IDataSource associated with the data-bound control.            
                GetData().Select(CreateDataSourceSelectArguments(), _
                    AddressOf OnDataSourceViewSelectCallback)
    
                ' The PerformDataBinding method has completed.
                RequiresDataBinding = False
                MarkAsDataBound()
    
                ' Raise the DataBound event.
                OnDataBound(EventArgs.Empty)
    
            End Sub
    
            Private Sub OnDataSourceViewSelectCallback(ByVal retrievedData As IEnumerable)
                ' Call OnDataBinding only if it has not already been 
                ' called in the PerformSelect method.
                If IsBoundUsingDataSourceID Then
                    OnDataBinding(EventArgs.Empty)
                End If
                ' The PerformDataBinding method binds the data in the  
                ' retrievedData collection to elements of the data-bound control.
                PerformDataBinding(retrievedData)
    
            End Sub
    
            Protected Overrides Sub PerformDataBinding(ByVal retrievedData As IEnumerable)
                MyBase.PerformDataBinding(retrievedData)
    
                ' Verify data exists.
                If Not (retrievedData Is Nothing) Then
                    Dim tbl As New Table()
                    Dim row As TableRow
                    Dim cell As TableCell
                    Dim dataStr As String = String.Empty
    
                    Dim dataItem As Object
                    For Each dataItem In retrievedData
                        ' If the DataTextField was specified get the data
                        ' from that field, otherwise get the data from the first field. 
                        If DataTextField.Length > 0 Then
                            dataStr = DataBinder.GetPropertyValue(dataItem, DataTextField, Nothing)
                        Else
                            Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(dataItem)
                            If props.Count >= 1 Then
                                If Nothing <> props(0).GetValue(dataItem) Then
                                    dataStr = props(0).GetValue(dataItem).ToString()
                                End If
                            End If
                        End If
    
                        row = New TableRow()
                        tbl.Rows.Add(row)
                        cell = New TableCell()
                        cell.Text = dataStr
                        row.Cells.Add(cell)
                    Next dataItem
    
                    Controls.Add(tbl)
                End If
    
            End Sub
        End Class
    End Namespace
    
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Security.Permissions;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace Samples.AspNet.Controls.CS
    {
        [AspNetHostingPermission(SecurityAction.Demand,
           Level = AspNetHostingPermissionLevel.Minimal)]
        [AspNetHostingPermission(SecurityAction.InheritanceDemand,
            Level = AspNetHostingPermissionLevel.Minimal)]
        public class SimpleDataBoundColumn : DataBoundControl
        {
            public string DataTextField
            {
                get
                {
                    object o = ViewState["DataTextField"];
                    return ((o == null) ? string.Empty : (string)o);
                }
                set
                {
                    ViewState["DataTextField"] = value;
                    if (Initialized)
                    {
                        OnDataPropertyChanged();
                    }
                }
            }
    
            protected override void PerformSelect()
            {
                // Call OnDataBinding here if bound to a data source using the
                // DataSource property (instead of a DataSourceID), because the
                // databinding statement is evaluated before the call to GetData.       
                if (!IsBoundUsingDataSourceID)
                {
                    this.OnDataBinding(EventArgs.Empty);
                }
    
                // The GetData method retrieves the DataSourceView object from  
                // the IDataSource associated with the data-bound control.            
                GetData().Select(CreateDataSourceSelectArguments(),
                    this.OnDataSourceViewSelectCallback);
    
                // The PerformDataBinding method has completed.
                RequiresDataBinding = false;
                MarkAsDataBound();
    
                // Raise the DataBound event.
                OnDataBound(EventArgs.Empty);
            }
    
            private void OnDataSourceViewSelectCallback(IEnumerable retrievedData)
            {
                // Call OnDataBinding only if it has not already been 
                // called in the PerformSelect method.
                if (IsBoundUsingDataSourceID)
                {
                    OnDataBinding(EventArgs.Empty);
                }
                // The PerformDataBinding method binds the data in the  
                // retrievedData collection to elements of the data-bound control.
                PerformDataBinding(retrievedData);
            }
    
            protected override void PerformDataBinding(IEnumerable retrievedData)
            {
                base.PerformDataBinding(retrievedData);
    
                // Verify data exists.
                if (retrievedData != null)
                {
                    Table tbl = new Table();
                    TableRow row;
                    TableCell cell;
                    string dataStr = String.Empty;
    
                    foreach (object dataItem in retrievedData)
                    {
                        // If the DataTextField was specified get the data
                        // from that field, otherwise get the data from the first field. 
                        if (DataTextField.Length > 0)
                        {
                            dataStr = DataBinder.GetPropertyValue(dataItem,
                                DataTextField, null);
                        }
                        else
                        {
                            PropertyDescriptorCollection props =
                                    TypeDescriptor.GetProperties(dataItem);
                            if (props.Count >= 1)
                            {
                                if (null != props[0].GetValue(dataItem))
                                {
                                    dataStr = props[0].GetValue(dataItem).ToString();
                                }
                            }
                        }
    
                        row = new TableRow();
                        tbl.Rows.Add(row);
                        cell = new TableCell();
                        cell.Text = dataStr;
                        row.Cells.Add(cell);
                    }
    
                    this.Controls.Add(tbl); 
                }
            }
        }
    }
    

コードの説明

SimpleDataBoundColumn クラスは、DataBoundControl 基本データ バインド クラスから派生します。この基本クラスから派生した場合、公開済みの DataSourceIDDataSource、および DataMember のデータ バインディング プロパティがあります。この公開済みプロパティを使用すると、データ ソースと特定のデータ メンバを指定し、そのカスタム コントロールにバインドできます。

新規のカスタム データ バインド プロパティを追加する方法がわかるように、DataTextField プロパティを SimpleDataBoundColumn クラスに追加しました。DataTextField プロパティを設定すると、新しい値はビューステートに格納されます。また、コントロールが初期化済みの場合、OnDataPropertyChanged メソッドも呼び出します。こうすることで、コントロールが新しいデータ バインディング プロパティ設定を使用できるように、データ バインド コントロールが強制的にデータに再バインドされます。

オーバーライドした DataBind メソッドが必要です。また、そのメソッドで、関連するデータ ソースのオブジェクトを列挙し、子コントロールを作成するロジックを記述します。SimpleDataBoundColumn クラスで示すように、ASP.NET 2.0 のデータ バインド コントロールでは、オーバーライドした DataBind メソッドで次のタスクを実行する必要があります。

  • データ ソースが DataSource プロパティに指定されているかどうかを判断するために、IsBoundUsingDataSourceID プロパティの false 値が確認されます。

  • バインドするデータが DataSource プロパティに指定されている場合、OnDataBinding メソッドが呼び出され、DataSource プロパティに指定されたデータ メンバがバインドされます。

  • GetData メソッドを呼び出して、データ バインド コントロールに関連付けられた DataSourceView オブジェクトを取得します。

  • 取得した DataSourceView オブジェクトの Select メソッドを呼び出してデータの取得を開始し、取得したデータを処理する OnDataSourceViewSelectCallback コールバック メソッドを指定します。

  • PerformSelect メソッドのデータ取得タスクが完了したことを示すには、RequiresDataBinding プロパティを false に設定し、MarkAsDataBound メソッドを呼び出します。

  • OnDataBound イベントが発生します。

OnDataSourceViewSelectCallback コールバック メソッドで取得したデータを受け取ります。このコールバック メソッドは、IEnumerable 型の 1 つのパラメータを受け入れる必要があります。カスタム コントロールに必要なデータ処理があれば、ここで実行されます。このカスタム コントロールでは、データをそのまま使用します。このため、この例では追加のデータ処理はありません。最後の手順として、PerformDataBinding メソッドを呼び出してデータ バインディング処理を開始します。

オーバーライドした PerformDataBinding メソッドで、データを表す、すべての子コントロールを作成します。データ収集を列挙し、各データ項目用の新しい TableCell オブジェクトを作成します。DataTextField プロパティが設定されている場合は、このプロパティを使用して、どのデータ フィールドがセルの Text プロパティにバインドされているかを判断します。それ以外の場合は、最初のフィールドが使用されます。

親コントロールの Table をカスタムの SimpleDataBoundColumn コントロールの Controls コレクションに追加します。そのコントロールの Controls コレクションに追加されたコントロールは、継承した Render メソッドの実行時に自動的に表示されます。

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

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

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

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

@ Register ディレクティブには、コントロール アセンブリの名前を指定する assembly 属性はありません。assembly 属性がないと、ASP.NET はアセンブリが App_Code ディレクトリのソース ファイルから動的にコンパイルされると見なします。

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

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

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

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

    ms366540.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.Controls.CS" />
          </controls>
        </pages>
      </system.web>
    </configuration>
    
    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <pages>
          <controls>
            <add tagPrefix="aspSample" namespace="Samples.AspNet.Controls.VB" />
          </controls>
        </pages>
      </system.web>
    </configuration>
    

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

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

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

ASP.NET 1.0 および 1.1 におけるタグ プレフィックスのマッピングは、カスタム コントロールを使用する各ページの @ Register ディレクティブで指定します。

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

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

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

  1. Web サイトで、TestSimpleDataBoundColumn.aspx という名前のファイルを作成します。

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

    <%@ Page Language="VB" Trace="true"%>
    <%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.Controls.VB" %>
    <%@ Import Namespace="System.Data" %>
    
    <!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">
    <script runat="server">
             Function CreateDataSource() As ICollection 
    
             ' Create sample data for the DataList control.
             Dim dt As DataTable = New DataTable()
             dim dr As DataRow
    
             ' Define the columns of the table.
             dt.Columns.Add(New DataColumn("IntegerValue", GetType(Int32)))
             dt.Columns.Add(New DataColumn("StringValue", GetType(String)))
             dt.Columns.Add(New DataColumn("CurrencyValue", GetType(Double)))
             dt.Columns.Add(New DataColumn("ImageValue", GetType(String)))
    
             ' Populate the table with sample values.
             Dim i As Integer
    
             For i = 0 To 8 
    
                dr = dt.NewRow()
    
                dr(0) = i
                dr(1) = "Description for item " & i.ToString()
                dr(2) = 1.23 * (i + 1)
                dr(3) = "Image" & i.ToString() & ".jpg"
    
                dt.Rows.Add(dr)
    
             Next i
    
             Dim dv As DataView = New DataView(dt)
             Return dv
    
          End Function
    
          Sub Page_Load(sender As Object, e As EventArgs) 
    
             ' Load sample data only once, when the page is first loaded.
             If Not IsPostBack Then 
    
                simpleDataBoundColumn1.DataSource = CreateDataSource()
                simpleDataBoundColumn1.DataBind()
    
             End If
    
          End Sub
    
    </script>
    
    <head runat="server">
        <title>SimpleDataBoundColumn test page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <aspSample:SimpleDataBoundColumn runat="server" id="simpleDataBoundColumn1" DataTextField="CurrencyValue" BorderStyle="Solid"></aspSample:SimpleDataBoundColumn>
        </div>
        </form>
    </body>
    </html>
    
    <%@ Page Language="C#" Trace="true"%>
    <%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.Controls.CS" %>
    <%@ Import Namespace="System.Data" %>
    
    <!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">
    <script runat="server">
    
          ICollection CreateDataSource() 
          {
             DataTable dt = new DataTable();
             DataRow dr;
    
             dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
             dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
             dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
    
             for (int i = 0; i < 9; i++) 
             {
                dr = dt.NewRow();
    
                dr[0] = i;
                dr[1] = "Item " + i.ToString();
                dr[2] = 1.23 * (i + 1);
    
                dt.Rows.Add(dr);
             }
    
             DataView dv = new DataView(dt);
             return dv;
          }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                simpleDataBoundColumn1.DataSource = CreateDataSource();
                simpleDataBoundColumn1.DataBind();
            }
        }
    </script>
    
    <head runat="server">
        <title>SimpleDataBoundColumn test page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <aspSample:SimpleDataBoundColumn runat="server" id="simpleDataBoundColumn1" DataTextField="CurrencyValue" BorderStyle="Solid"></aspSample:SimpleDataBoundColumn>
        </div>
        </form>
    </body>
    </html>
    
  3. SimpleDataBoundColumnTest.aspx ページを実行します。

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

    writer.Write("<br />Testing how the App_Code directory works.");
    
    writer.Write("<br />Testing how the App_Code directory works.")
    
  5. ブラウザで SimpleDataBoundColumnTest.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.Controls.CS.dll または Samples.AspNet.Controls.VB.dll という名前のアセンブリが生成されます。

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

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

    ms366540.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 メタデータを指定する方法を説明します。

ms366540.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.Controls.CS", "aspSample")]
    
    Imports System
    Imports System.Web.UI
    <Assembly: TagPrefix("Samples.AspNet.Controls.VB", "aspSample")> 
    

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

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

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

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

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

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

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

  3. App_Code ディレクトリからコントロールのソース ファイルを削除します。

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

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

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

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

  • Web.config ファイルを編集し、addtagPrefix 要素に assembly 属性を追加します。

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

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

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

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

    https://localhost/ServerControlsTest/SimpleDataBoundColumnTest.aspx
    

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

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

多くのビジュアル デザイナでは、カスタム コントロールをデザイナのツールボックスに追加できます。詳細については、各デザイナのドキュメントを参照してください。

次の手順

この単純なカスタム データ バインド サーバー コントロールは、カスタム コントロールを作成するときに使用する基本的な手順を説明するものです。このカスタム コントロールを使用すると、標準的、効率的、かつ柔軟な方法で、外部データ ソースにバインドできます。このコントロールを基にして、Visual Studio のフレームワークを参照し、高度なカスタム サーバー コントロールを作成できます。次に行う操作で、知識を深めることをお勧めします。

参照

処理手順

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

概念

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

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

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

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

参照

HierarchicalDataBoundControlDesigner

その他の技術情報

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