Partager via


IWebPartField Interface

Définition

Définit une interface de fournisseur pour connecter deux contrôles serveur à l'aide d'un seul champ de données.

public interface class IWebPartField
public interface IWebPartField
type IWebPartField = interface
Public Interface IWebPartField
Dérivé

Exemples

L’exemple de code suivant montre comment créer une connexion statique entre deux contrôles à l’aide de l’interface IWebPartField . L’exemple de code comporte trois parties :

  • Code source pour deux contrôles personnalisés WebPart qui peuvent former une connexion à l’aide de l’interface IWebPartField , un contrôle agissant en tant que fournisseur et l’autre en tant que consommateur.

  • Page web qui héberge les contrôles et déclare la connexion statique au format de persistance.

  • Description de ce qui se passe lorsque l’exemple de code s’exécute.

La première partie de l’exemple de code est le code source des deux contrôles personnalisés. Tout d’abord, le code du fournisseur, qui implémente l’interface IWebPartField . Par souci de simplicité dans l’exemple, le fournisseur crée une table avec des données plutôt que de se connecter à une base de données. La GetConnectionInterface méthode sert de point de connexion du fournisseur, la méthode de rappel qui retourne l’instance d’interface au consommateur. Quant au consommateur, il récupère l’instance d’interface du fournisseur dans sa méthode nommée SetConnectionInterface, qui est marquée avec un ConnectionConsumer attribut. Après avoir récupéré l’instance de l’interface, le consommateur, dans sa OnPreRender méthode, appelle l’implémentation de la GetFieldValue méthode dans le fournisseur, pour récupérer les données réelles.

Pour que l’exemple de code s’exécute, vous devez compiler ce code source. Vous pouvez le compiler explicitement et placer l’assembly résultant dans le dossier Bin de votre site web ou dans le global assembly cache. Vous pouvez également placer le code source dans le dossier App_Code de votre site, où il sera compilé dynamiquement au moment de l’exécution. Cet exemple de code utilise la compilation dynamique. Pour obtenir une procédure pas à pas qui montre comment compiler, consultez Procédure pas à pas : Développement et utilisation d’un contrôle de serveur web personnalisé.

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

La deuxième partie de l’exemple de code est la page Web qui déclare la connexion statique et héberge les contrôles. En haut de la page se trouve une Register directive qui déclare l’espace de noms du code source contenu dans le répertoire App_Code. La connexion est déclarée à l’aide d’un <asp:webpartconnection> élément. Les contrôles de consommateur et de fournisseur personnalisés sont déclarés dans un <zonetemplate> élément au sein d’un <asp:webpartzone> élément, ce qui est nécessaire pour qu’ils puissent se connecter (ils doivent résider dans une zone qui hérite de la WebPartZoneBase classe).

<%@ 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>

Chargez la page dans un navigateur. Le contrôle consommateur affiche les données fournies à partir du champ spécifié, que le fournisseur met à disposition via une instance de l’interface IWebPartField .

Remarques

Cette interface est conçue pour être utilisée avec les connexions de composants WebPart. Dans une connexion de composants WebPart, deux contrôles serveur qui résident dans une WebPartZoneBase zone établissent une connexion et partagent des données, un contrôle agissant en tant que consommateur et l’autre en tant que fournisseur. Le mécanisme de partage de données dans une connexion de composants WebPart est une instance d’interface, que le fournisseur sert au consommateur au moyen d’une méthode de rappel. Pour établir une connexion, le consommateur et le fournisseur doivent utiliser le même type d’interface pour le partage de données. Si le consommateur ne reconnaît pas le type d’interface envoyé par le fournisseur, il est toujours possible de connecter les contrôles au moyen d’un transformateur (objet WebPartTransformer ) qui traduit l’instance d’interface envoyée par le fournisseur en un type que le consommateur reconnaît. Pour plus d’informations sur les connexions, consultez WebPartConnectionvue d’ensemble des connexions de composants WebPart.

L’interface IWebPartField est une interface de fournisseur incluse avec l’ensemble de contrôles WebPart en tant qu’interface standard pour la création de connexions basées sur un champ de données. Vous pouvez également créer des interfaces personnalisées à utiliser avec des connexions de composants WebPart, mais dans de nombreuses applications web pilotées par les données, il est utile de créer des connexions basées sur une ligne commune (pour plus d’informations, voir l’interface IWebPartRow ), une table (pour plus d’informations, voir l’interface IWebPartTable ) ou un champ de la source de données, à l’aide de l’interface IWebPartField . Dans une connexion classique, un WebPart contrôle agissant en tant que fournisseur implémente l’interface IWebPartField et fournit une instance de l’interface aux consommateurs dans une méthode de rappel spéciale. Par exemple, le fournisseur peut implémenter une IWebPartField interface pour un champ de votre table d’informations utilisateur qui contient les données de code postal d’un utilisateur web. Un autre WebPart contrôle agissant en tant que consommateur définirait une méthode spéciale pour recevoir l’instance d’interface, puis pourrait extraire les données du code postal, puis rechercher et afficher des informations météorologiques basées sur le code postal.

L’interface IWebPartField a deux membres exposés. La Schema propriété retourne des informations de schéma sur le champ de données encapsulé dans un PropertyDescriptor objet. La GetFieldValue méthode déclare une méthode qu’un implémenteur (tel qu’un contrôle fournisseur) utilise pour récupérer les données de champ de l’instance d’interface lorsque la méthode de rappel est appelée.

Propriétés

Schema

Reçoit les informations de schéma pour un champ de données utilisé pour partager des données entre deux contrôles WebPart.

Méthodes

GetFieldValue(FieldCallback)

Retourne la valeur du champ utilisé par l'interface comme base d'une connexion entre deux contrôles WebPart.

S’applique à

Voir aussi