次の方法で共有


IWebPartRow インターフェイス

定義

単一のデータ フィールドを使用して 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 コントロール間の接続の基礎として、インターフェイスで使用される行のデータを返します。

適用対象

こちらもご覧ください