ObjectDataSource でデータを表示する (VB)
このチュートリアルでは、ObjectDataSource コントロールを確認します。このコントロールを使用すると、前のチュートリアルで作成した BLL から取得したデータをバインドできます。コード行を記述する必要はありません。
はじめに
アプリケーション アーキテクチャと Web サイトのページ レイアウトが完成したので、さまざまな一般的なデータおよびレポート関連のタスクを実行する方法の検討を開始する準備ができました。 前のチュートリアルでは、DAL および BLL のデータを、ASP.NET ページのデータ Web コントロールにプログラムでバインドする方法について説明しました。 この構文では、データ Web コントロールの DataSource
プロパティをデータに割り当てて表示し、コントロールの DataBind()
メソッドを呼び出すことは、ASP.NET 1.x アプリケーションで使用されるパターンであり、2.0 アプリケーションで引き続き使用できます。 ただし、ASP.NET 2.0 の新しいデータ ソース管理では、宣言型の方法でデータを操作できます。 これらのコントロールを使用すると、コード行を記述しなくても、前のチュートリアルで作成した BLL から取得したデータをバインドできます。
ASP.NET 2.0 には、SqlDataSource、AccessDataSource、ObjectDataSource、XmlDataSource、SiteMapDataSource の 5 つの組み込みデータ ソース コントロールが付属していますが、必要に応じて独自のカスタム データ ソース 管理を構築できます。 チュートリアル アプリケーションのアーキテクチャを開発したので、BLL クラスに対して ObjectDataSource を使用します。
図 1: ASP.NET 2.0 には 5 つの Built-In データ ソース管理が含まれています
ObjectDataSource は、他のオブジェクトを操作するためのプロキシとして機能します。 ObjectDataSource を構成するには、この基になるオブジェクトと、そのメソッドを ObjectDataSource Select
の 、、Insert
Update
、および Delete
メソッドにマップする方法を指定します。 この基になるオブジェクトが指定され、そのメソッドが ObjectDataSource の にマップされたら、ObjectDataSource をデータ Web コントロールにバインドできます。 ASP.NET には、GridView、DetailsView、RadioButtonList、DropDownList など、多くのデータ Web コントロールが付属しています。 ページのライフサイクル中、データ Web コントロールは、バインド先のデータにアクセスする必要があります。これは、ObjectDataSource Select
のメソッドを呼び出すことによって実現されます。データ Web コントロールが挿入、更新、または削除をサポートしている場合は、その ObjectDataSource の Insert
、、 Update
または Delete
メソッドに対して呼び出しを行うことができます。 次の図に示すように、これらの呼び出しは ObjectDataSource によって適切な基になるオブジェクトのメソッドにルーティングされます。
図 2: ObjectDataSource はプロキシとして機能します (クリックするとフルサイズの画像が表示されます)
ObjectDataSource を使用して、データを挿入、更新、または削除するためのメソッドを呼び出すことができますが、データの返しだけに焦点を当ててみましょう。今後のチュートリアルでは、データを変更する ObjectDataSource コントロールとデータ Web コントロールの使用について説明します。
手順 1: ObjectDataSource コントロールの追加と構成
まず、フォルダー内のページをSimpleDisplay.aspx
BasicReporting
開き、デザイン ビューに切り替えてから、ObjectDataSource コントロールをツールボックスからページのデザイン画面にドラッグします。 ObjectDataSource は、マークアップを生成しないため、デザインサーフェイスに灰色のボックスとして表示されます。指定されたオブジェクトからメソッドを呼び出すことによって、単にデータにアクセスします。 ObjectDataSource によって返されるデータは、GridView、DetailsView、FormView などのデータ Web コントロールによって表示できます。
注意
または、最初にデータ Web コントロールをページに追加してから、スマート タグからドロップダウン リストから [新しいデータ ソース>] <オプションを選択することもできます。
ObjectDataSource の基になるオブジェクトとそのオブジェクトのメソッドを ObjectDataSource にマップする方法を指定するには、ObjectDataSource のスマート タグから [データ ソースの構成] リンクをクリックします。
図 3: スマート タグから [データの構成] Source Linkをクリックします (クリックするとフルサイズの画像が表示されます)
これにより、データ ソースの構成ウィザードが表示されます。 まず、ObjectDataSource が操作するオブジェクトを指定する必要があります。 [データ コンポーネントのみを表示する] チェック ボックスをオンにすると、この画面のドロップダウン リストには、 属性で DataObject
装飾されたオブジェクトのみが一覧表示されます。 現在、このリストには、Typed DataSet の TableAdapters と、前のチュートリアルで作成した BLL クラスが含まれています。 属性をビジネス ロジック レイヤー クラスに追加 DataObject
するのを忘れた場合、この一覧には表示されません。 その場合は、[データ コンポーネントのみを表示する] チェック ボックスをオフにして、BLL クラスを含める必要があるすべてのオブジェクトを表示します (Typed DataSet の他のクラスと共に DataTables、DataRows など)。
この最初の ProductsBLL
画面から、ドロップダウン リストからクラスを選択し、[次へ] をクリックします。
図 4: ObjectDataSource コントロールで使用するオブジェクトを指定します (クリックするとフルサイズの画像が表示されます)
ウィザードの次の画面で、ObjectDataSource が呼び出すメソッドを選択するように求められます。 ドロップダウンには、前の画面から選択したオブジェクトのデータを返すメソッドが一覧表示されます。 ここでは、、、GetProducts
GetProductsByCategoryID
、および が表示GetProductByProductID
されますGetProductsBySupplierID
。 ドロップダウン リストからメソッドをGetProducts
選択し、[完了] をクリックします (前のチュートリアルで示したように のメソッドに ProductBLL
を追加DataObjectMethodAttribute
した場合、このオプションは既定で選択されます)。
図 5: SELECT タブからデータを返す方法を選択します (クリックするとフルサイズの画像が表示されます)
ObjectDataSource を手動で構成する
ObjectDataSource のデータ ソースの構成ウィザードでは、使用するオブジェクトを簡単に指定し、呼び出されるオブジェクトのメソッドを関連付けることができます。 ただし、ObjectDataSource は、プロパティ ウィンドウを介して、またはそのプロパティを使用して構成することも、宣言型マークアップで直接構成することもできます。 プロパティを TypeName
使用する基になるオブジェクトの型に設定し SelectMethod
、データを取得するときに呼び出す メソッドに を設定するだけです。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>
データ ソースの構成ウィザードを使用する場合でも、開発者が作成したクラスのみがウィザードに一覧表示されるので、ObjectDataSource を手動で構成する必要がある場合があります。 ObjectDataSource を Membership クラスなどの.NET Framework内のクラスにバインドしてユーザー アカウント情報にアクセスする場合、またはファイル システム情報を操作するために Directory クラスをバインドする場合は、ObjectDataSource のプロパティを手動で設定する必要があります。
手順 2: Data Web コントロールを追加して ObjectDataSource にバインドする
ObjectDataSource がページに追加され、構成されたら、Data Web コントロールをページに追加して、ObjectDataSource Select
の メソッドによって返されるデータを表示する準備ができました。 任意のデータ Web コントロールを ObjectDataSource にバインドできます。では、ObjectDataSource のデータを GridView、DetailsView、および FormView に表示する方法を見てみましょう。
GridView を ObjectDataSource にバインドする
ツールボックスからのデザイン サーフェイスに GridView コントロールを SimpleDisplay.aspx
追加します。 GridView のスマート タグから、手順 1 で追加した ObjectDataSource コントロールを選択します。 これにより、ObjectDataSource Select
のメソッド (つまり Products DataTable によって定義されたプロパティ) からデータによって返される各プロパティに対して、GridView に BoundField が自動的に作成されます。
図 6: GridView がページに追加され、ObjectDataSource にバインドされている (フルサイズの画像を表示する をクリックします)
その後、スマート タグの [列の編集] オプションをクリックして、GridView の BoundFields をカスタマイズ、再配置、または削除できます。
図 7: [列の編集] ダイアログ ボックスを使用して GridView の BoundFields を管理する (フルサイズの画像を表示する をクリックします)
GridView の BoundFields を変更し、、QuantityPerUnit
SupplierID
CategoryID
UnitsInStock
UnitsOnOrder
、および ReorderLevel
BoundFields を削除ProductID
します。 左下の一覧から BoundField を選択し、削除ボタン (赤い X) をクリックするだけで削除できます。 次に、BoundFields と SupplierName
BoundFields を BoundField の前UnitPrice
に配置しCategoryName
、これらの BoundFields を選択して上矢印をクリックします。 HeaderText
残りの BoundFields のプロパティをそれぞれ Products
、、Category
Supplier
、および Price
に設定します。 次に、BoundField のPrice
プロパティを False に設定し、そのDataFormatString
プロパティを に設定して、BoundField HtmlEncode
を通貨として書式設定します{0:c}
。 最後に、 プロパティをPrice
使用してItemStyle
/HorizontalAlign
、 を右に揃え、Discontinued
チェック ボックスを中央に揃えます。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductName"
HeaderText="Product" SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName"
HeaderText="Category" ReadOnly="True"
SortExpression="CategoryName" />
<asp:BoundField DataField="SupplierName"
HeaderText="Supplier" ReadOnly="True"
SortExpression="SupplierName" />
<asp:BoundField DataField="UnitPrice"
DataFormatString="{0:c}" HeaderText="Price"
HtmlEncode="False" SortExpression="UnitPrice">
<ItemStyle HorizontalAlign="Right" />
</asp:BoundField>
<asp:CheckBoxField DataField="Discontinued"
HeaderText="Discontinued" SortExpression="Discontinued">
<ItemStyle HorizontalAlign="Center" />
</asp:CheckBoxField>
</Columns>
</asp:GridView>
図 8: GridView の BoundFields がカスタマイズされました (フルサイズの画像を表示する をクリックします)
テーマを使用した一貫性のある外観
これらのチュートリアルでは、可能な限り外部ファイルで定義されているカスケード スタイル シートを使用する代わりに、コントロール レベルのスタイル設定を削除するように努めています。 ファイルStyles.css
には、RowStyle
DataWebControlStyle
HeaderStyle
および AlternatingRowStyle
これらのチュートリアルで使用されるデータ Web コントロールの外観を決定するために使用する必要がある CSS クラスが含まれています。 これを実現するために、GridView の CssClass
プロパティを にDataWebControlStyle
設定し、それに応じて 、、RowStyle
HeaderStyle
および AlternatingRowStyle
プロパティのCssClass
プロパティを設定できます。
Web コントロールでこれらの CssClass
プロパティを設定する場合は、チュートリアルに追加されたすべてのデータ Web コントロールに対して、これらのプロパティ値を明示的に設定する必要があります。 より管理しやすい方法は、テーマを使用して GridView、DetailsView、および FormView コントロールの既定の CSS 関連プロパティを定義することです。 Theme は、コントロール レベルのプロパティ設定、イメージ、および CSS クラスのコレクションであり、サイト全体のページに適用して、一般的な外観を適用できます。
テーマには画像や CSS ファイルは含まれません (スタイル シート Styles.css
はそのまま残し、Web アプリケーションのルート フォルダーで定義します)、2 つのスキンが含まれます。 スキンは、Web コントロールの既定のプロパティを定義するファイルです。 具体的には、GridView コントロールと DetailsView コントロールのスキン ファイルがあり、既定 CssClass
の関連プロパティを示します。
まず、ソリューション エクスプローラーでプロジェクト名を右クリックし、[新しい項目の追加] を選択して、 という名前GridView.skin
の新しいスキン ファイルをプロジェクトに追加します。
図 9: 名前付きの GridView.skin
スキン ファイルを追加する (クリックするとフルサイズの画像が表示されます)
スキン ファイルは、フォルダーにあるテーマに配置する App_Themes
必要があります。 このようなフォルダーはまだないため、Visual Studio では最初のスキンを追加するときに作成することをお勧めします。 [はい] をクリックしてフォルダーを App_Theme
作成し、そこに新しい GridView.skin
ファイルを配置します。
図 10: Visual Studio でフォルダーを App_Theme
作成できるようにする (クリックするとフルサイズの画像が表示されます)
これにより、GridView という名前のフォルダーに App_Themes
、スキン ファイル GridView.skin
を使用して新しいテーマが作成されます。
図 11: GridView テーマがフォルダーに App_Theme
追加されました
GridView テーマの名前を DataWebControls に変更します (フォルダー内 App_Theme
の GridView フォルダーを右クリックし、[名前の変更] を選択します)。 次に、ファイルに次のマークアップを GridView.skin
入力します。
<asp:GridView runat="server" CssClass="DataWebControlStyle">
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
<RowStyle CssClass="RowStyle" />
<HeaderStyle CssClass="HeaderStyle" />
</asp:GridView>
これにより、DataWebControls テーマを CssClass
使用するすべてのページの GridView の関連プロパティの既定のプロパティが定義されます。 次に使用するデータ Web コントロールである DetailsView に別のスキンを追加してみましょう。 という名前 DetailsView.skin
の DataWebControls テーマに新しいスキンを追加し、次のマークアップを追加します。
<asp:DetailsView runat="server" CssClass="DataWebControlStyle">
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
<RowStyle CssClass="RowStyle" />
<FieldHeaderStyle CssClass="HeaderStyle" />
</asp:DetailsView>
[テーマ] を定義した状態で、最後の手順は [テーマ] を [ASP.NET] ページに適用することです。 テーマは、ページ単位で適用することも、Web サイト内のすべてのページに適用することもできます。 このテーマは、Web サイト内のすべてのページで使用してみましょう。 これを実現するには、次のマークアップを の <system.web>
セクションにWeb.config
追加します。
<pages styleSheetTheme="DataWebControls" />
これですべて完了です。 この設定は styleSheetTheme
、Theme で指定されたプロパティが、コントロール レベルで指定されたプロパティをオーバーライド しないことを 示します。 テーマ設定でコントロール設定を切り捨てる必要があることを指定するには、 の代わりに styleSheetTheme
属性をtheme
使用します。残念ながら、テーマ設定は Visual Studio デザイン ビューには表示されません。 テーマとスキンの詳細については、「 ASP.NET テーマとスキンの概要 」および 「テーマを使用したサーバー側スタイル 」を参照してください。テーマを使用するようにページを構成する方法の詳細については、「 方法: ASP.NET テーマを適用する」を参照してください。
図 12: GridView には、製品の名前、カテゴリ、仕入先、価格、および廃止された情報が表示されます (フルサイズの画像を表示する をクリックします)。
DetailsView で一度に 1 つのレコードを表示する
GridView には、バインド先のデータ ソース コントロールによって返されるレコードごとに 1 行が表示されます。 ただし、単独のレコードまたは一度に 1 つのレコードのみを表示したい場合があります。 DetailsView コントロールは、この機能を提供し、コントロールにバインドされた列またはプロパティごとに 2 つの列と 1 行の HTML <table>
としてレンダリングします。 DetailsView は、1 つのレコードが 90 度回転した GridView と考えることができます。
まず、 の GridView の 上 に DetailsView SimpleDisplay.aspx
コントロールを追加します。 次に、GridView と同じ ObjectDataSource コントロールにバインドします。 GridView と同様に、ObjectDataSource のメソッドによって返されるオブジェクトの各プロパティの DetailsView に BoundField Select
が追加されます。 唯一の違いは、DetailsView の BoundFields が垂直方向ではなく水平方向にレイアウトされていることです。
図 13: DetailsView をページに追加し、それを ObjectDataSource にバインドする (フルサイズの画像を表示する をクリックします)
GridView と同様に、DetailsView の BoundFields を調整して、ObjectDataSource によって返されるデータをよりカスタマイズした表示にすることができます。 図 14 は、GridView の例に似た外観になるように BoundFields プロパティと CssClass
プロパティが構成された後の DetailsView を示しています。
図 14: DetailsView には 1 つのレコードが表示されます (クリックするとフルサイズの画像が表示されます)
DetailsView には、データ ソースによって返される最初のレコードのみが表示されることに注意してください。 ユーザーがすべてのレコードを一度に 1 つずつステップ実行できるようにするには、DetailsView のページングを有効にする必要があります。 これを行うには、Visual Studio に戻り、DetailsView のスマート タグの [ページングを有効にする] チェック ボックスをチェックします。
図 15: DetailsView コントロールでページングを有効にする (フルサイズの画像を表示する をクリックします)
図 16: ページングが有効になっている場合、DetailsView を使用すると、ユーザーは任意の製品を表示できます (クリックするとフルサイズの画像が表示されます)
今後のチュートリアルでは、ページングの詳細について説明します。
一度に 1 つのレコードを表示するためのより柔軟なレイアウト
DetailsView は、ObjectDataSource から返される各レコードの表示方法に非常に厳密です。 データのより柔軟なビューが必要な場合があります。 たとえば、製品の名前、カテゴリ、サプライヤー、価格、および廃止された情報をそれぞれ別々の行に表示するのではなく、見出しに製品名と価格 <h4>
を表示し、カテゴリとサプライヤーの情報が名前と価格の下に小さなフォント サイズで表示されるようにすることができます。 また、プロパティ名 (Product、Category など) を値の横に表示してもかまいません。
FormView コントロールは、このレベルのカスタマイズを提供します。 フィールド (GridView や DetailsView など) を使用する代わりに、FormView はテンプレートを使用します。これにより、Web コントロール、静的 HTML、およびデータバインド構文を組み合わせることができます。 ASP.NET 1.x の Repeater コントロールに慣れている場合は、FormView を 1 つのレコードを表示するための Repeater と考えることができます。
ページのデザイン画面に FormView コントロールを SimpleDisplay.aspx
追加します。 最初に FormView は灰色のブロックとして表示され、少なくともコントロールの ItemTemplate
を提供する必要があることを通知します。
図 17: FormView には を ItemTemplate
含める必要があります (フルサイズの画像を表示する場合はクリックします)
FormView のスマート タグを使用して FormView をデータ ソース コントロールに直接バインドできます。これにより、既定ItemTemplate
が自動的に作成されます (ObjectDataSource コントロールの InsertMethod
プロパティと プロパティが設定されている場合は、 と UpdateMethod
と共EditItemTemplate
InsertItemTemplate
に)。 ただし、この例では、データを FormView にバインドし、そのデータを手動で指定 ItemTemplate
してみましょう。 まず、FormView DataSourceID
の プロパティを ID
ObjectDataSource コントロール ObjectDataSource1
の の に設定します。 次に、 を ItemTemplate
作成して、製品の名前と価格を <h4>
要素に表示し、その下のカテゴリと荷送人の名前を小さなフォント サイズで表示します。
<asp:FormView ID="FormView1" runat="server"
DataSourceID="ObjectDataSource1" EnableViewState="False">
<ItemTemplate>
<h4><%# Eval("ProductName") %>
(<%# Eval("UnitPrice", "{0:c}") %>)</h4>
Category: <%# Eval("CategoryName") %>;
Supplier: <%# Eval("SupplierName") %>
</ItemTemplate>
</asp:FormView>
図 18: 最初の製品 (Chai) がカスタム形式で表示される (フルサイズの画像を表示する をクリックします)
<%# Eval(propertyName) %>
はデータバインド構文です。 メソッドは Eval
、FormView コントロールにバインドされている現在のオブジェクトの指定したプロパティの値を返します。 データバインドのインとアウトの詳細については、Alex Homer の記事「ASP.NET 2.0 の簡略化および拡張データ バインディング構文」を参照してください。
DetailsView と同様に、FormView には ObjectDataSource から返された最初のレコードのみが表示されます。 FormView でページングを有効にすると、訪問者は製品を一度に 1 つずつステップ実行できます。
まとめ
ビジネス ロジック レイヤーからのデータへのアクセスと表示は、2.0 の ObjectDataSource コントロールのおかげでコード行 ASP.NET 記述しなくても実現できます。 ObjectDataSource は、クラスの指定されたメソッドを呼び出し、結果を返します。 これらの結果は、ObjectDataSource にバインドされたデータ Web コントロールに表示できます。 このチュートリアルでは、GridView、DetailsView、および FormView コントロールを ObjectDataSource にバインドする方法について説明しました。
ここまでは、ObjectDataSource を使用してパラメーターのないメソッドを呼び出す方法のみを見てきましたが、クラスの など、入力パラメーターを必要とするメソッドを ProductBLL
呼び出す場合はどう GetProductsByCategoryID(categoryID)
なりますか? 1 つ以上のパラメーターを必要とするメソッドを呼び出すには、これらのパラメーターの値を指定するように ObjectDataSource を構成する必要があります。 これを実現する方法については、 次のチュートリアルで説明します。
幸せなプログラミング!
もっと読む
このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。
- 独自のデータ ソース コントロールを作成する
- ASP.NET 2.0 の GridView の例
- ASP.NET 2.0 のテーマ
- テーマを使用したサーバー側のスタイル
- 方法: プログラムによって ASP.NET テーマを適用する
著者について
7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 にアクセスmitchell@4GuysFromRolla.comすることも、ブログを介して アクセスすることもできます。これは でhttp://ScottOnWriting.NET確認できます。
特別な感謝
このチュートリアル シリーズは、多くの役立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、ヒルトン ギセナウでした。 今後の MSDN 記事の確認に関心がありますか? その場合は、 に行mitchell@4GuysFromRolla.comをドロップしてください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示