チュートリアル : 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 のソース ファイルにあるクラスには、手動でアセンブリにコンパイルせずにページからアクセスできます。
メモ : |
---|
App_Code ディレクトリは、ASP.NET 1.0 および 1.1 では使用できません。コントロールの初期テストに App_Code ディレクトリを使用するかどうかは任意です。次の「コントロールのアセンブリへのコンパイル」セクションで説明されているように、サーバー コントロールのビルドの主な手順は以前のバージョンの ASP.NET と同じです。 |
カスタム データ バインド コントロールをテストする Web サイトを作成するには
ServerControlsTest という Web サイトを作成します。
このサイトは、IIS で ServerControlsTest という仮想ディレクトリとして作成できます。IIS の仮想ディレクトリの作成方法と構成方法の詳細については、「方法 : IIS 5.0 および 6.0 内で仮想ディレクトリを作成および構成する」を参照してください。
Web サイトのルート ディレクトリ (Web アプリケーションのルート) の直下に App_Code ディレクトリを作成します。
SimpleDataBoundColumn クラスの作成
ここでは、DataBoundControl クラスを拡張するデータ バインド コントロール クラスを作成します。この新しいコントロールには、バインドされたデータが 1 列のテーブルとして表示されます。
SimpleDataBoundColumn クラスを作成するには
App_Code ディレクトリに、SimpleDataBoundColumn.cs または SimpleDataBoundColumn.vb という名前のクラスを作成します。
クラス ファイルに次のコードを追加します。
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 基本データ バインド クラスから派生します。この基本クラスから派生した場合、公開済みの DataSourceID、DataSource、および 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"%>
メモ : |
---|
@ Register ディレクティブには、コントロール アセンブリの名前を指定する assembly 属性はありません。assembly 属性がないと、ASP.NET はアセンブリが App_Code ディレクトリのソース ファイルから動的にコンパイルされると見なします。 |
タグ プリフィックスと名前空間のマッピングは、.aspx の各ページで @ Register ディレクティブを使用して指定する代わりに、Web.config ファイルで指定することもできます。この方法は、Web アプリケーションの複数のページでカスタム コントロールを使用する場合に便利です。マップするタグ プリフィックスを Web.config ファイルで指定する方法については、次の手順で説明します。
Web.config ファイルにタグ プリフィックスのマッピングを追加するには
Web サイトに Web.config というテキスト ファイルがない場合は、Web サイトのルート フォルダに作成します。
Web.config ファイルを新規作成する場合は、空のファイルに次の XML マークアップをコピーしてから保存します。サイトに Web.config ファイルが既にある場合、次の強調表示された要素を追加します。
メモ : タグ プリフィックスのエントリは、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 /> として宣言して使用できます。
メモ : |
---|
ASP.NET 1.0 および 1.1 におけるタグ プレフィックスのマッピングは、カスタム コントロールを使用する各ページの @ Register ディレクティブで指定します。 |
カスタム データ バインド コントロールを使用するページの作成
チュートリアルのこのセクションでは、カスタム データ バインド コントロールをテストするためのページのマークアップを作成します。
カスタム データ バインド コントロールを使用するページを作成するには
Web サイトで、TestSimpleDataBoundColumn.aspx という名前のファイルを作成します。
次のマークアップを 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>
SimpleDataBoundColumnTest.aspx ページを実行します。
カスタム コントロールのソース コードを変更します。たとえば、RenderContents メソッドの最後に次のコード行を追加して、追加の文字列を記述します。
writer.Write("<br />Testing how the App_Code directory works.");
writer.Write("<br />Testing how the App_Code directory works.")
ブラウザで SimpleDataBoundColumnTest.aspx ページを再表示します。
コントロールをコンパイルしていませんが、コントロールに加えた変更がページに反映されているのがわかります。
コントロールのアセンブリへのコンパイル
App_Code ディレクトリを使用すると、コンパイルせずにコントロールをテストできます。ただし、他の開発者にオブジェクト コードとしてコントロールを配布する場合は、コンパイルする必要があります。また、コンパイルしてアセンブリを生成しなければ、コントロールをビジュアル デザイナのツールボックスに追加することはできません。
コントロールをアセンブリにコンパイルするには
次の手順を実行して、コンピュータの Windows の PATH 環境変数に .NET Framework のインストール パスを含めます。
Windows で、[マイ コンピュータ] アイコンを右クリックし、[プロパティ] をクリックします。次に、[詳細設定] タブで、[環境変数] をクリックします。
[システム環境変数] の一覧の Path 変数をダブルクリックします。
[変数値] ボックスで、既存の値の最後にセミコロン (;) を追加し、各自の .NET Framework のインストール パスを入力します。通常の場合、.NET Framework は Windows のインストール ディレクトリ (\Microsoft.NET\Framework\versionNumber) にインストールされます。
[OK] をクリックしてダイアログ ボックスを閉じます。
このチュートリアルの前の手順で作成したソース ファイルが保存されている 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 オプションにはこのアセンブリにリンクするアセンブリを列挙します。
メモ : この例が独立して動作できるように、このチュートリアルではコントロールを 1 つだけ使用してアセンブリを作成しています。.NET Framework の一般的な設計ガイドラインでは、数個のクラスしか含まないアセンブリは作成しないことをお勧めします。簡単に配置できるように、作成するアセンブリの数を少なくする必要があります。
TagPrefixAttribute によるタグ プリフィックス/名前空間のマッピング
ページまたは Web.config ファイルにタグ プレフィックスを指定する方法については前述しました。コントロールをコンパイルするときに、コントロールにアセンブリ レベルの System.Web.UI.TagPrefixAttribute 属性を含めて、ビジュアル デザイナが既定で使用するタグ プリフィックスを指定することもできます。TagPrefixAttribute 属性は、ビジュアル デザイナが Web.config ファイルまたはページの @ Register ディレクティブにタグ プリフィックスのマッピングを見つけることができない場合に使用するタグ プリフィックスを提供できるため便利です。タグ プリフィックスは、ツールボックスでコントロールを最初にダブルクリックするか、ツールボックスからページにドラッグする際にページに登録されます。
TagPrefixAttribute 属性を使用する場合は、コントロールと共にコンパイルする別のファイルに指定します。名前付け規則によって、ファイル名は AssemblyInfo.cs または AssembyInfo.vb などのように、AssemblyInfo.languageExtension となります。次の手順では、TagPrefixAttribute メタデータを指定する方法を説明します。
メモ : |
---|
コントロールのアセンブリで TagPrefixAttribute を指定しない場合、またはページ開発者がページまたは Web.config ファイルでタグ プリフィックス/名前空間のマッピングを指定しない場合、ビジュアル デザイナは既定のタグ プリフィックスを作成することがあります。たとえば Visual Studio 2005 は、コントロールをツールボックスからドラッグする際に、cc1 などの独自のタグを作成します。 |
TagPrefixAttribute を使用してタグ プリフィックスのマッピングを追加するには
ソース コードのディレクトリに 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 プリフィックスの間のマッピングを作成します。
以前に使用したコンパイル コマンドを使用して、埋め込みリソースを含めるか、または含めずに、すべてのソース ファイルを再コンパイルします。
ASP.NET ページでのコンパイルされたカスタム データ バインド サーバー コントロールの使用
カスタム コントロールのコンパイル済みバージョンをテストするには、コントロールのアセンブリを Web サイトでページからアクセスできるようにする必要があります。
コントロールのアセンブリを Web サイトからアクセスできるようにするには
Web サイトのルートに Bin ディレクトリを作成します。
コントロール アセンブリ (Samples.AspNet.Controls.CS.dll または Samples.AspNet.Controls.VB.dll) を App_Code ディレクトリから Bin ディレクトリにドラッグします。
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 ブロックにおけるステートメントの補完およびコントロールのタグをクリックする際のプロパティ ブラウザのサポートが含まれます。
メモ : |
---|
多くのビジュアル デザイナでは、カスタム コントロールをデザイナのツールボックスに追加できます。詳細については、各デザイナのドキュメントを参照してください。 |
次の手順
この単純なカスタム データ バインド サーバー コントロールは、カスタム コントロールを作成するときに使用する基本的な手順を説明するものです。このカスタム コントロールを使用すると、標準的、効率的、かつ柔軟な方法で、外部データ ソースにバインドできます。このコントロールを基にして、Visual Studio のフレームワークを参照し、高度なカスタム サーバー コントロールを作成できます。次に行う操作で、知識を深めることをお勧めします。
カスタム データ バインド サーバー コントロールを開発する際に固有の、全般的なアーキテクチャと実装の説明を確認します。詳細については、「ASP.NET 2.0 用カスタム データ バインド Web サーバー コントロールの開発」を参照してください。
拡張およびカスタマイズできる既存のデータ バインド サーバー コントロール クラスを調べます。使用できるデータ バインド Web サーバー コントロールの概要については、「ASP.NET のデータ バインド Web サーバー コントロールの概要」を参照してください。データ バインド Web サーバー コントロール クラスについては、GridView、DetailsView、FormView、Repeater、および DataList の関連トピックを参照してください。
描画、プロパティの定義、状態の維持、カスタムの複合コントロールの実装についてさらに習得します。詳細については、「ASP.NET カスタム サーバー コントロールの開発」、「コントロールの状態とビューステートの例」、および「サーバー コントロールのカスタム状態管理」を参照してください。
デザイン ツールで使用する情報を提供するために、カスタム データ バインド サーバー コントロールとそのメンバに適用できるメタデータ属性についてさらに習得します。詳細については、「カスタム サーバー コントロールのメタデータ属性」を参照してください。
デザイン時の機能、テンプレート、またはスタイルを追加するための、コントロール デザイナを作成します。カスタム データ バインド コントロール デザイナの例については、「HierarchicalDataBoundControlDesigner」および「チュートリアル : Web サーバー コントロール用の基本的なコントロール デザイナの作成」を参照してください。ASP.NET のコントロール デザイナの概要については、「ASP.NET コントロール デザイナの概要」を参照してください。
カスタム データ バインド コントロール デザイナの例を使用して作業します。詳細については、HierarchicalDataBoundControlDesigner クラスを参照してください。
適切なデザイン時の属性を定義し、Visual Studio ツールボックスで使用できるカスタム サーバー コントロールを作成する方法を調べます。詳細については、「方法 : Visual Studio でカスタム ASP.NET サーバー コントロールを使用する」を参照してください。
参照
処理手順
チュートリアル : カスタム サーバー コントロールの開発と使用
概念
ASP.NET 2.0 用カスタム データ バインド Web サーバー コントロールの開発
ASP.NET のデータ バインド Web サーバー コントロールの概要
参照
HierarchicalDataBoundControlDesigner