次の方法で共有


IWebPartField インターフェイス

定義

単一のデータ フィールドを使用して 2 つのサーバー コントロールを接続するためのプロバイダー インターフェイスを定義します。

public interface class IWebPartField
public interface IWebPartField
type IWebPartField = interface
Public Interface IWebPartField
派生

次のコード例では、 インターフェイスを使用して 2 つのコントロール間に静的な接続を作成する方法を IWebPartField 示します。 このコード例には、次の 3 つの部分があります。

  • インターフェイスを使用してIWebPartField接続を形成できる 2 つのカスタム WebPart コントロールのソース コード。1 つのコントロールがプロバイダーとして機能し、もう 1 つはコンシューマーとして機能します。

  • コントロールをホストし、永続化形式で静的接続を宣言する Web ページ。

  • コード例の実行時の動作の説明。

コード例の最初の部分は、2 つのカスタム コントロールのソース コードです。 1 つ目は、 インターフェイスを実装するプロバイダーの IWebPartField コードです。 この例ではわかりやすくするために、プロバイダーはデータベースに接続するのではなく、データを含むテーブルを作成します。 メソッドは GetConnectionInterface 、プロバイダーの接続ポイント (コンシューマーにインターフェイス インスタンスを返すコールバック メソッド) として機能します。 コンシューマーに関しては、 という名前 SetConnectionInterfaceのメソッドでプロバイダーからインターフェイス インスタンスを取得します。これは 属性で ConnectionConsumer マークされています。 インターフェイスのインスタンスを取得した後、コンシューマーは、その OnPreRender メソッドで プロバイダー内の メソッドの GetFieldValue 実装を呼び出して、実際のデータを取得します。

コード例を実行するには、このソース コードをコンパイルする必要があります。 明示的にコンパイルし、結果のアセンブリを 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 field data.
  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public sealed class FieldProviderWebPart : WebPart, IWebPartField
  {
    private DataTable _table;

    public FieldProviderWebPart() 
    {
        _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("FieldProvider")]
      public IWebPartField GetConnectionInterface()
    {
        return new FieldProviderWebPart();
    }

    public PropertyDescriptor Schema 
    {
        get 
        {
            /* The two parameters are row and field. Zero is the first record. 
                0,2 returns the zip code field value.   */ 
            return TypeDescriptor.GetProperties(_table.DefaultView[0])[2];
        }
    }

      void IWebPartField.GetFieldValue(FieldCallback callback) 
    {
        callback(Schema.GetValue(_table.DefaultView[0]));
    }
  } // end FieldProviderWebPart

  // This sample code creates a Web Parts control that acts as a consumer 
  // of an IWebPartField interface.
  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class FieldConsumerWebPart : WebPart
  {

    private IWebPartField _provider;
    private object _fieldValue;

    private void GetFieldValue(object fieldValue)
    {
      _fieldValue = fieldValue;
    }

    public bool ConnectionPointEnabled
    {
      get
      {
        object o = ViewState["ConnectionPointEnabled"];
        return (o != null) ? (bool)o : true;
      }
      set
      {
        ViewState["ConnectionPointEnabled"] = value;
      }
    }

    protected override void OnPreRender(EventArgs e)
    {
      if (_provider != null)
      {
        _provider.GetFieldValue(new FieldCallback(GetFieldValue));
      }
      base.OnPreRender(e);
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {

      if (_provider != null)
      {
        PropertyDescriptor prop = _provider.Schema;

        if (prop != null && _fieldValue != null)
        {
          writer.Write(prop.DisplayName + ": " + _fieldValue);
        }
        else
        {
          writer.Write("No data");
        }
      }
      else
      {
        writer.Write("Not connected");
      }
    }

    [ConnectionConsumer("FieldConsumer", "Connpoint1", 
      typeof(FieldConsumerConnectionPoint), AllowsMultipleConnections = true)]
    public void SetConnectionInterface(IWebPartField provider)
    {
      _provider = provider;
    }

    public class FieldConsumerConnectionPoint : ConsumerConnectionPoint
    {
      public FieldConsumerConnectionPoint(MethodInfo callbackMethod, 
        Type interfaceType, Type controlType, string name, string id, 
        bool allowsMultipleConnections)
        : base(
        callbackMethod, interfaceType, controlType,
        name, id, allowsMultipleConnections)
      {
      }

      public override bool GetEnabled(Control control)
      {
        return ((FieldConsumerWebPart)control).ConnectionPointEnabled;
      }
    } // end FieldConsumerConnectionPoint
  } // end FieldConsumerWebPart
} // end namespace 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 field data.
  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public NotInheritable Class FieldProviderWebPart
    Inherits WebPart
    Implements IWebPartField
    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("FieldProvider")> _
    Public Function GetConnectionInterface() As IWebPartField
      Return New FieldProviderWebPart()

    End Function


    Public ReadOnly Property Schema() As ComponentModel.PropertyDescriptor _
      Implements IWebPartField.Schema
      Get
        ' The two parameters are row and field. Zero is the first record. 
        ' 0,2 returns the zip code field value.   
        Return TypeDescriptor.GetProperties(_table.DefaultView(0))(2)
      End Get
    End Property


    Sub GetFieldValue(ByVal callback As FieldCallback) _
      Implements IWebPartField.GetFieldValue

      callback(Schema.GetValue(_table.DefaultView(0)))

    End Sub

  End Class


  ' This sample code creates a Web Parts control that acts as a 
  ' consumer of an IWebPartField interface.
  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class FieldConsumerWebPart
    Inherits WebPart

    Private _provider As IWebPartField
    Private _fieldValue As Object


    Private Sub GetFieldValue(ByVal fieldValue As Object)
      _fieldValue = fieldValue

    End Sub


    Public Property ConnectionPointEnabled() As Boolean
      Get
        Dim o As Object = ViewState("ConnectionPointEnabled")
        Return IIf(Not (o Is Nothing), CBool(o), True)
      End Get
      Set(ByVal value As Boolean)
        ViewState("ConnectionPointEnabled") = value
      End Set
    End Property


    Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
      If Not (_provider Is Nothing) Then
        _provider.GetFieldValue(New FieldCallback(AddressOf GetFieldValue))
      End If
      MyBase.OnPreRender(e)

    End Sub


    Protected Overrides Sub RenderContents(ByVal writer As _
      HtmlTextWriter)

      If Not (_provider Is Nothing) Then
        Dim prop As PropertyDescriptor = _provider.Schema

        If Not (prop Is Nothing) AndAlso Not (_fieldValue Is Nothing) Then
          writer.Write(prop.DisplayName & ": " & _fieldValue)
        Else
          writer.Write("No data")
        End If
      Else
        writer.Write("Not connected")
      End If

    End Sub

    <ConnectionConsumer("FieldConsumer", "Connpoint1", _
      GetType(FieldConsumerConnectionPoint), AllowsMultipleConnections:=True)> _
    Public Sub SetConnectionInterface(ByVal provider As IWebPartField)
      _provider = provider

    End Sub

  End Class

  Public Class FieldConsumerConnectionPoint
    Inherits ConsumerConnectionPoint

    Public Sub New(ByVal callbackMethod As MethodInfo, _
      ByVal interfaceType As Type, ByVal controlType As Type, _
      ByVal name As String, ByVal id As String, _
      ByVal allowsMultipleConnections As Boolean)
      MyBase.New(callbackMethod, interfaceType, controlType, _
        name, id, allowsMultipleConnections)

    End Sub


    Public Overrides Function GetEnabled(ByVal control As Control) _
      As Boolean

      Return CType(control, FieldConsumerWebPart).ConnectionPointEnabled

    End Function

  End Class

End Namespace  ' Samples.AspNet.VB.Controls

コード例の 2 番目の部分は、静的接続を宣言し、コントロールをホストする Web ページです。 ページの上部付近には、 Register App_Code ディレクトリに含まれるソース コードの名前空間を宣言する ディレクティブがあります。 接続は、 要素を <asp:webpartconnection> 使用して宣言されます。 カスタム コンシューマーコントロールとプロバイダー コントロールは、要素内<asp:webpartzone>の要素で<zonetemplate>宣言されます。これは、接続できるようにするために必要です (クラスからWebPartZoneBase継承するゾーン内に存在する必要があります)。

<%@ page language="C#" %>
<%@ Register tagprefix="IField" 
    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">

<!-- This code sample creates a page with two Web Parts controls 
and establishes a connection between the controls. -->
<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>IWebPartField Test Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:webpartmanager id="WebPartManager1" runat="server">
            <StaticConnections>
                <asp:WebPartConnection id="con1" ProviderID="provider1" 
                  ConsumerID="consumer1" 
                  ConsumerConnectionPointID="Connpoint1">
                </asp:WebPartConnection>
            </StaticConnections>
        </asp:webpartmanager>
        <asp:webpartzone id="WebPartZone1" runat="server">
            <zoneTemplate>
              <ifield:fieldproviderwebpart runat="Server" 
                ID="provider1" Title="Provider" />
              <ifield:fieldconsumerwebpart runat="Server" 
                ID="consumer1" Title="Consumer"/>
            </zoneTemplate>
        </asp:webpartzone>
    
    </div>
    </form>
</body>
</html>
<%@ page language="VB" debug="true" %>
<%@ Register tagprefix="IField" 
    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">

<!-- This code sample creates a page with two Web Parts controls 
and establishes a connection between the controls. -->
<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>IWebPartField Test Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:webpartmanager id="WebPartManager1" runat="server">
            <StaticConnections>
                <asp:WebPartConnection id="con1" ProviderID="provider1" 
                  ConsumerID="consumer1" 
                  ConsumerConnectionPointID="Connpoint1">
                </asp:WebPartConnection>
            </StaticConnections>
        </asp:webpartmanager>
        <asp:webpartzone id="WebPartZone1" runat="server">
            <zoneTemplate>
              <ifield:fieldproviderwebpart runat="Server" 
                ID="provider1" Title="Provider" />
              <ifield:fieldconsumerwebpart runat="Server" 
                ID="consumer1" Title="Consumer"/>
            </zoneTemplate>
        </asp:webpartzone>
    </div>
    </form>
</body>
</html>

ブラウザーでページを読み込みます。 コンシューマー コントロールには、指定したフィールドから提供されたデータが表示されます。このフィールドは、プロバイダーが インターフェイスの IWebPartField インスタンスを介して使用できるようにします。

注釈

このインターフェイスは、Web パーツ接続で使用するように設計されています。 Web パーツ接続では、ゾーン内に WebPartZoneBase 存在する 2 つのサーバー コントロールが接続を確立し、データを共有します。1 つのコントロールはコンシューマーとして機能し、もう 1 つのコントロールはプロバイダーとして機能します。 Web パーツ接続でデータを共有するメカニズムはインターフェイス インスタンスであり、プロバイダーはコールバック メソッドを使用してコンシューマーにサービスを提供します。 接続を確立するには、コンシューマーとプロバイダーの両方が同じインターフェイスの種類を使用してデータを共有する必要があります。 コンシューマーがプロバイダーから送信されたインターフェイス型を認識しない場合でも、プロバイダーから送信されたインターフェイス インスタンスをコンシューマーが認識する型に変換するトランスフォーマー ( WebPartTransformer オブジェクト) を使用してコントロールを接続できます。 接続の詳細については、「Web パーツ接続の概要」を参照してくださいWebPartConnection

インターフェイスは IWebPartField 、データ フィールドに基づいて接続を作成するための標準インターフェイスとして設定された Web パーツ コントロールに含まれるプロバイダー インターフェイスです。 Web パーツ接続で使用するカスタム インターフェイスを作成することもできますが、多くのデータ ドリブン Web アプリケーションでは、 インターフェイスを使用して、共通の行 (詳細についてはインターフェイスを参照)、テーブル (詳細についてはインターフェイスを参照IWebPartRowIWebPartTable)、またはデータ ソースのフィールドに基づいて接続をIWebPartField作成すると便利です。 一般的な接続では、 WebPart プロバイダーとして機能するコントロールは インターフェイスを IWebPartField 実装し、特殊なコールバック メソッドでコンシューマーにインターフェイスのインスタンスを提供します。 たとえば、プロバイダーは、Web ユーザーの郵便番号データを含むユーザー情報テーブルのフィールドのインターフェイスを実装 IWebPartField できます。 コンシューマーとして機能するもう 1 つの WebPart コントロールは、インターフェイス インスタンスを受け取る特別なメソッドを定義し、郵便番号データを抽出し、郵便番号に基づいて気象情報を検索して表示できます。

インターフェイスには IWebPartField 、2 つの公開メンバーがあります。 プロパティは Schema 、オブジェクトにカプセル化されたデータ フィールドに関するスキーマ情報を PropertyDescriptor 返します。 メソッドは GetFieldValue 、実装者 (プロバイダー コントロールなど) がコールバック メソッドの呼び出し時にインターフェイス インスタンスのフィールド データを取得するために使用するメソッドを宣言します。

プロパティ

Schema

2 つの WebPart コントロール間でデータを共有するために使用されるデータ フィールドのスキーマ情報を取得します。

メソッド

GetFieldValue(FieldCallback)

インターフェイスで 2 つの WebPart コントロール間の接続の基礎として使用されているフィールドの値を返します。

適用対象

こちらもご覧ください