IWebPartRow インターフェイス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
単一のデータ フィールドを使用して 2 つのサーバー コントロールを接続するためのプロバイダー インターフェイスを定義します。
public interface class IWebPartRow
public interface IWebPartRow
type IWebPartRow = interface
Public Interface IWebPartRow
例
次のコード例では、 インターフェイスを使用して 2 つのコントロール間に静的な接続を作成する方法を IWebPartRow 示します。 このコード例には、次の 3 つの部分があります。
インターフェイスを使用して接続を形成できる 2 つのカスタム WebPart コントロールの IWebPartRow ソース コード。一方のコントロールはプロバイダーとして機能し、もう 1 つはコンシューマーとして機能します。
コントロールをホストし、永続化形式で静的接続を宣言する Web ページ。
コード例の実行時の動作の説明。
コード例の最初の部分は、2 つのカスタム コントロールのソース コードです。 1 つ目は、インターフェイスを実装するプロバイダーの IWebPartRow コードです。 この例ではわかりやすくするために、プロバイダーはデータベースに接続するのではなく、何らかのデータを含むテーブルを作成します。 メソッドは GetConnectionInterface
、プロバイダーの接続ポイントとして機能します。これは、インターフェイス インスタンスをコンシューマーに返すコールバック メソッドです。 コンシューマーに関しては、 という名前 SetConnectionInterface
のメソッドでプロバイダーからインターフェイス インスタンスを取得します。これは 属性で ConnectionConsumer
マークされています。 インターフェイスのインスタンスを取得した後、コンシューマーはその OnPreRender
メソッドで、プロバイダー内の メソッドの GetRowData 実装を呼び出して、実際のデータを取得してページに書き込みます。
コード例を実行するには、このソース コードをコンパイルする必要があります。 明示的にコンパイルし、結果のアセンブリを Web サイトの Bin フォルダーまたはグローバル アセンブリ キャッシュに配置できます。 または、ソース コードをサイトの App_Code フォルダーに配置して、実行時に動的にコンパイルすることもできます。 このコード例では、動的コンパイルを使用します。 コンパイル方法を示すチュートリアルについては、「 チュートリアル: カスタム Web サーバー コントロールの開発と使用」を参照してください。
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Reflection;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
namespace Samples.AspNet.CS.Controls
{
// This sample code creates a Web Parts control that acts as a provider
// of row data.
[AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal)]
public sealed class RowProviderWebPart : WebPart, IWebPartRow
{
private DataTable _table;
public RowProviderWebPart()
{
_table = new DataTable();
DataColumn col = new DataColumn();
col.DataType = typeof(string);
col.ColumnName = "Name";
_table.Columns.Add(col);
col = new DataColumn();
col.DataType = typeof(string);
col.ColumnName = "Address";
_table.Columns.Add(col);
col = new DataColumn();
col.DataType = typeof(int);
col.ColumnName = "ZIP Code";
_table.Columns.Add(col);
DataRow row = _table.NewRow();
row["Name"] = "John Q. Public";
row["Address"] = "123 Main Street";
row["ZIP Code"] = 98000;
_table.Rows.Add(row);
}
[ConnectionProvider("Row")]
public IWebPartRow GetConnectionInterface()
{
return new RowProviderWebPart();
}
public PropertyDescriptorCollection Schema
{
get
{
return TypeDescriptor.GetProperties(_table.DefaultView[0]);
}
}
public void GetRowData(RowCallback callback)
{
callback(_table.Rows);
}
} // RowProviderWebPart
// This sample code creates a Web Parts control that acts as a consumer
// of row data.
[AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal)]
public sealed class RowConsumerWebPart : WebPart
{
private IWebPartRow _provider;
private ICollection _tableData;
private void GetRowData(object rowData)
{
_tableData = (ICollection)rowData;
}
protected override void OnPreRender(EventArgs e)
{
if (_provider != null)
{
_provider.GetRowData(new RowCallback(GetRowData));
}
}
protected override void RenderContents(HtmlTextWriter writer)
{
if (_provider != null)
{
PropertyDescriptorCollection props = _provider.Schema;
int count = 0;
if (props != null && props.Count > 0 && _tableData != null)
{
foreach (PropertyDescriptor prop in props)
{
foreach (DataRow o in _tableData)
{
writer.Write(prop.DisplayName + ": " + o[count]);
writer.WriteBreak();
writer.WriteLine();
count = count + 1;
}
}
}
else
{
writer.Write("No data");
}
}
else
{
writer.Write("Not connected");
}
}
[ConnectionConsumer("Row")]
public void SetConnectionInterface(IWebPartRow provider)
{
_provider = provider;
}
} // RowConsumerWebPart
} // Samples.AspNet.CS.Controls
Imports System.Collections
Imports System.ComponentModel
Imports System.Data
Imports System.Reflection
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Namespace Samples.AspNet.VB.Controls
' This sample code creates a Web Parts control that acts as a provider
' of row data.
<AspNetHostingPermission(SecurityAction.Demand, _
Level:=AspNetHostingPermissionLevel.Minimal)> _
<AspNetHostingPermission(SecurityAction.InheritanceDemand, _
Level:=AspNetHostingPermissionLevel.Minimal)> _
Public NotInheritable Class RowProviderWebPart
Inherits WebPart
Implements IWebPartRow
Private _table As DataTable
Public Sub New()
_table = New DataTable()
Dim col As New DataColumn()
col.DataType = GetType(String)
col.ColumnName = "Name"
_table.Columns.Add(col)
col = New DataColumn()
col.DataType = GetType(String)
col.ColumnName = "Address"
_table.Columns.Add(col)
col = New DataColumn()
col.DataType = GetType(Integer)
col.ColumnName = "ZIP Code"
_table.Columns.Add(col)
Dim row As DataRow = _table.NewRow()
row("Name") = "John Q. Public"
row("Address") = "123 Main Street"
row("ZIP Code") = 98000
_table.Rows.Add(row)
End Sub
<ConnectionProvider("Row")> _
Public Function GetConnectionInterface() As IWebPartRow
Return New RowProviderWebPart()
End Function 'GetConnectionInterface
Public ReadOnly Property Schema() As _
ComponentModel.PropertyDescriptorCollection Implements IWebPartRow.Schema
Get
Return TypeDescriptor.GetProperties(_table.DefaultView(0))
End Get
End Property
Public Sub GetRowData(ByVal callback As RowCallback) _
Implements IWebPartRow.GetRowData
callback(_table.Rows)
End Sub
End Class
' This sample code creates a Web Parts control that acts as a consumer
' of row data.
<AspNetHostingPermission(SecurityAction.Demand, _
Level:=AspNetHostingPermissionLevel.Minimal)> _
<AspNetHostingPermission(SecurityAction.InheritanceDemand, _
Level:=AspNetHostingPermissionLevel.Minimal)> _
Public NotInheritable Class RowConsumerWebPart
Inherits WebPart
Private _provider As IWebPartRow
Private _tableData As ICollection
Private Sub GetRowData(ByVal rowData As Object)
_tableData = CType(rowData, ICollection)
End Sub
Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
If Not (_provider Is Nothing) Then
_provider.GetRowData(New RowCallback(AddressOf GetRowData))
End If
End Sub
Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)
If Not (_provider Is Nothing) Then
Dim props As PropertyDescriptorCollection = _provider.Schema
Dim count As Integer = 0
If Not (props Is Nothing) AndAlso props.Count > 0 _
AndAlso Not (_tableData Is Nothing) Then
Dim prop As PropertyDescriptor
For Each prop In props
Dim o As DataRow
For Each o In _tableData
writer.Write(prop.DisplayName & ": " & o(count))
writer.WriteBreak()
writer.WriteLine()
count = count + 1
Next o
Next prop
Else
writer.Write("No data")
End If
Else
writer.Write("Not connected")
End If
End Sub
<ConnectionConsumer("Row")> _
Public Sub SetConnectionInterface(ByVal provider As IWebPartRow)
_provider = provider
End Sub
End Class
End Namespace ' Samples.AspNet.VB.Controls
コード例の 2 番目の部分は、静的接続を宣言し、コントロールをホストする Web ページです。 ページの上部付近には、 Register
App_Code ディレクトリに含まれるソース コードの名前空間を宣言する ディレクティブがあります。 接続は 要素を <asp:webpartconnection>
使用して宣言されます。 カスタム コンシューマーコントロールとプロバイダー コントロールは、要素内<asp:webpartzone>
の要素で<zonetemplate>
宣言されます。これは、接続できるようにするために必要です (クラスをWebPartZoneBase継承するゾーン内に存在する必要があります)。
<%@ page language="C#" %>
<%@ Register tagprefix="IRow"
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">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>IRow Test Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:webpartmanager ID="WebPartManager1" runat="server">
<staticconnections>
<asp:webpartconnection ID="wp1" ProviderID="provider1"
ConsumerID="consumer1">
</asp:webpartconnection>
</staticconnections>
</asp:webpartmanager>
<asp:webpartzone ID="WebPartZone1" runat="server">
<ZoneTemplate>
<irow:RowProviderWebPart ID="provider1" runat="server"
Title="Row Provider Control" />
<irow:RowConsumerWebPart ID="consumer1" runat="server"
Title="Row Consumer Control" />
</ZoneTemplate>
</asp:webpartzone>
</div>
</form>
</body>
</html>
<%@ page language="VB" %>
<%@ Register tagprefix="IRow"
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">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>IRow Test Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:webpartmanager ID="WebPartManager1" runat="server">
<staticconnections>
<asp:webpartconnection ID="wp1" ProviderID="provider1"
ConsumerID="consumer1">
</asp:webpartconnection>
</staticconnections>
</asp:webpartmanager>
<asp:webpartzone ID="WebPartZone1" runat="server">
<ZoneTemplate>
<irow:RowProviderWebPart ID="provider1" runat="server"
Title="Row Provider Control" />
<irow:RowConsumerWebPart ID="consumer1" runat="server"
Title="Row Consumer Control" />
</ZoneTemplate>
</asp:webpartzone>
</div>
</form>
</body>
</html>
ブラウザーにページを読み込みます。 コンシューマー コントロールには、指定された行から提供されたデータが表示されます。このデータは、プロバイダーが インターフェイスの IWebPartRow インスタンスを介して使用できるようにします。
注釈
このインターフェイスは、Web パーツ接続で使用するように設計されています。 Web パーツ接続では、ゾーン内に WebPartZoneBase 存在する 2 つのサーバー コントロールが接続を確立し、データを共有します。1 つのコントロールはコンシューマーとして機能し、もう 1 つのコントロールはプロバイダーとして機能します。 Web パーツ接続でデータを共有するメカニズムはインターフェイス インスタンスであり、プロバイダーはコールバック メソッドを使用してコンシューマーにサービスを提供します。 接続を確立するには、コンシューマーとプロバイダーの両方が同じインターフェイスの種類でデータを共有する必要があります。 コンシューマーがプロバイダーから送信されたインターフェイスの種類を認識しない場合でも、プロバイダーによって送信されたインターフェイス インスタンスをコンシューマーが認識する型に変換するトランスフォーマー ( WebPartTransformer オブジェクト) を使用してコントロールを接続できます。 接続の詳細については、「Web パーツ接続の概要」を参照してくださいWebPartConnection。
インターフェイスは IWebPartRow 、データ行に基づいて接続を作成するための標準インターフェイスとして設定された Web パーツ コントロールに含まれるプロバイダー インターフェイスです。 Web パーツ接続で使用するカスタム インターフェイスを作成することもできますが、多くのデータ ドリブン Web アプリケーションでは、共通フィールド (詳細についてはインターフェイスを参照)、テーブル (詳細についてはインターフェイスを参照IWebPartFieldIWebPartTable)、またはデータ ソースの行に基づいて接続を作成すると便利です。 一般的な接続では、 WebPart プロバイダーとして機能するコントロールは インターフェイスを IWebPartRow 実装し、特別なコールバック メソッドでコンシューマーにインターフェイスのインスタンスを提供します。 たとえば、プロバイダーは、ユーザー情報テーブルのユーザーに対応する行のインターフェイスを実装 IWebPartRow する場合があります。 コンシューマーとして機能する別 WebPart のコントロールは、インターフェイス インスタンスを受け取る特別なメソッドを定義し、ユーザー データを抽出し、それを使用してそのユーザーのアカウントに関する追加情報を検索し、そのユーザーに関連するすべての情報をページに表示します。
インターフェイスには IWebPartRow 、2 つの公開メンバーがあります。 プロパティは Schema 、オブジェクトにカプセル化されたデータ行に関するスキーマ情報を PropertyDescriptorCollection 返します。 メソッドは GetRowData 、実装者 (プロバイダー コントロールなど) がコールバック メソッドの呼び出し時にインターフェイス インスタンスの行データを取得するために使用するメソッドを宣言します。
プロパティ
Schema |
2 つの WebPart コントロール間でデータを共有するために使用するデータ行に関するスキーマ情報を取得します。 |
メソッド
GetRowData(RowCallback) |
2 つの WebPart コントロール間の接続の基礎として、インターフェイスで使用される行のデータを返します。 |
適用対象
こちらもご覧ください
.NET