ConsumerConnectionPoint Classe

Definição

Define um objeto de ponto de ligação que permite a um controlo de servidor, atuando como consumidor, formar uma ligação com um fornecedor.

public ref class ConsumerConnectionPoint : System::Web::UI::WebControls::WebParts::ConnectionPoint
public class ConsumerConnectionPoint : System.Web.UI.WebControls.WebParts.ConnectionPoint
type ConsumerConnectionPoint = class
    inherit ConnectionPoint
Public Class ConsumerConnectionPoint
Inherits ConnectionPoint
Herança
ConsumerConnectionPoint

Exemplos

O exemplo de código seguinte mostra formas simples de criar uma ligação de forma declarativa, programática ou através da interface, em cada caso utilizando um ponto de ligação do consumidor.

O exemplo tem quatro partes:

  • Um controlo de utilizador que permite alterar o modo de exibição das Web Parts numa página.

  • Código-fonte para uma interface e dois WebPart controlos que atuam como fornecedor e consumidor para uma ligação.

  • Uma página Web para alojar todos os controlos e executar o exemplo de código.

  • Uma explicação de como executar a página de exemplo.

A primeira parte deste exemplo de código é o controlo do utilizador que permite aos utilizadores alterar modos de visualização numa página Web. Guarde o seguinte código-fonte num ficheiro .ascx, atribuindo-lhe o nome do ficheiro atribuído ao Src atributo da Register diretiva para este controlo de utilizador, que está perto do topo da página web de alojamento. Para detalhes sobre modos de visualização e uma descrição do código-fonte neste controlo, consulte Walkthrough: Changing Display Modes on a Web Parts Page.

<%@ control language="C#" classname="DisplayModeMenuCS"%>
<script runat="server">
  
 // Use a field to reference the current WebPartManager.
  WebPartManager _manager;

  void Page_Init(object sender, EventArgs e)
  {
    Page.InitComplete += new EventHandler(InitComplete);
  }  

  void InitComplete(object sender, System.EventArgs e)
  {
    _manager = WebPartManager.GetCurrentWebPartManager(Page);

    String browseModeName = WebPartManager.BrowseDisplayMode.Name;

    // Fill the dropdown with the names of supported display modes.
    foreach (WebPartDisplayMode mode in _manager.SupportedDisplayModes)
    {
      String modeName = mode.Name;
      // Make sure a mode is enabled before adding it.
      if (mode.IsEnabled(_manager))
      {
        ListItem item = new ListItem(modeName, modeName);
        DisplayModeDropdown.Items.Add(item);
      }
    }

    // If shared scope is allowed for this user, display the scope-switching
    // UI and select the appropriate radio button for the current user scope.
    if (_manager.Personalization.CanEnterSharedScope)
    {
      Panel2.Visible = true;
      if (_manager.Personalization.Scope == PersonalizationScope.User)
        RadioButton1.Checked = true;
      else
        RadioButton2.Checked = true;
    }
    
  }
 
  // Change the page to the selected display mode.
  void DisplayModeDropdown_SelectedIndexChanged(object sender, EventArgs e)
  {
    String selectedMode = DisplayModeDropdown.SelectedValue;

    WebPartDisplayMode mode = _manager.SupportedDisplayModes[selectedMode];
    if (mode != null)
      _manager.DisplayMode = mode;
  }

  // Set the selected item equal to the current display mode.
  void Page_PreRender(object sender, EventArgs e)
  {
    ListItemCollection items = DisplayModeDropdown.Items;
    int selectedIndex = 
      items.IndexOf(items.FindByText(_manager.DisplayMode.Name));
    DisplayModeDropdown.SelectedIndex = selectedIndex;
  }

  // Reset all of a user's personalization data for the page.
  protected void LinkButton1_Click(object sender, EventArgs e)
  {
    _manager.Personalization.ResetPersonalizationState();
  }

  // If not in User personalization scope, toggle into it.
  protected void RadioButton1_CheckedChanged(object sender, EventArgs e)
  {
    if (_manager.Personalization.Scope == PersonalizationScope.Shared)
      _manager.Personalization.ToggleScope();
  }

  // If not in Shared scope, and if user is allowed, toggle the scope.
  protected void RadioButton2_CheckedChanged(object sender, EventArgs e)
  {
    if (_manager.Personalization.CanEnterSharedScope && 
        _manager.Personalization.Scope == PersonalizationScope.User)
      _manager.Personalization.ToggleScope();
  }
</script>
<div>
  <asp:Panel ID="Panel1" runat="server" 
    Borderwidth="1" 
    Width="230" 
    BackColor="lightgray"
    Font-Names="Verdana, Arial, Sans Serif" >
    <asp:Label ID="Label1" runat="server" 
      Text=" Display Mode" 
      Font-Bold="true"
      Font-Size="8"
      Width="120" 
      AssociatedControlID="DisplayModeDropdown"/>
    <asp:DropDownList ID="DisplayModeDropdown" runat="server"  
      AutoPostBack="true" 
      Width="120"
      OnSelectedIndexChanged="DisplayModeDropdown_SelectedIndexChanged" />
    <asp:LinkButton ID="LinkButton1" runat="server"
      Text="Reset User State" 
      ToolTip="Reset the current user's personalization data for the page."
      Font-Size="8" 
      OnClick="LinkButton1_Click" />
    <asp:Panel ID="Panel2" runat="server" 
      GroupingText="Personalization Scope"
      Font-Bold="true"
      Font-Size="8" 
      Visible="false" >
      <asp:RadioButton ID="RadioButton1" runat="server" 
        Text="User" 
        AutoPostBack="true"
        GroupName="Scope" OnCheckedChanged="RadioButton1_CheckedChanged" />
      <asp:RadioButton ID="RadioButton2" runat="server" 
        Text="Shared" 
        AutoPostBack="true"
        GroupName="Scope" 
        OnCheckedChanged="RadioButton2_CheckedChanged" />
    </asp:Panel>
  </asp:Panel>
</div>
<%@ control language="vb" classname="DisplayModeMenuVB"%>
<script runat="server">
  ' Use a field to reference the current WebPartManager.
  Dim _manager As WebPartManager

  Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs)
    AddHandler Page.InitComplete, AddressOf InitComplete
  End Sub

  Sub InitComplete(ByVal sender As Object, ByVal e As System.EventArgs)
    _manager = WebPartManager.GetCurrentWebPartManager(Page)
      
    Dim browseModeName As String = WebPartManager.BrowseDisplayMode.Name
      
    ' Fill the dropdown with the names of supported display modes.
    Dim mode As WebPartDisplayMode
    For Each mode In _manager.SupportedDisplayModes
      Dim modeName As String = mode.Name
      ' Make sure a mode is enabled before adding it.
      If mode.IsEnabled(_manager) Then
        Dim item As New ListItem(modeName, modeName)
        DisplayModeDropdown.Items.Add(item)
      End If
    Next mode
      
    ' If shared scope is allowed for this user, display the scope-switching
    ' UI and select the appropriate radio button for the current user scope.
    If _manager.Personalization.CanEnterSharedScope Then
      Panel2.Visible = True
      If _manager.Personalization.Scope = PersonalizationScope.User Then
        RadioButton1.Checked = True
      Else
        RadioButton2.Checked = True
      End If
    End If
   
  End Sub

  ' Change the page to the selected display mode.
  Sub DisplayModeDropdown_SelectedIndexChanged(ByVal sender As Object, _
    ByVal e As EventArgs)
    
    Dim selectedMode As String = DisplayModeDropdown.SelectedValue   
    Dim mode As WebPartDisplayMode = _
      _manager.SupportedDisplayModes(selectedMode)
    If Not (mode Is Nothing) Then
      _manager.DisplayMode = mode
    End If

  End Sub
   
  ' Set the selected item equal to the current display mode.
  Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs)
    Dim items As ListItemCollection = DisplayModeDropdown.Items
    Dim selectedIndex As Integer = _
      items.IndexOf(items.FindByText(_manager.DisplayMode.Name))
    DisplayModeDropdown.SelectedIndex = selectedIndex

  End Sub

  ' Reset all of a user's personalization data for the page.
  Protected Sub LinkButton1_Click(ByVal sender As Object, _
    ByVal e As EventArgs)
    
    _manager.Personalization.ResetPersonalizationState()
    
  End Sub

  ' If not in User personalization scope, toggle into it.
  Protected Sub RadioButton1_CheckedChanged(ByVal sender As Object, _
    ByVal e As EventArgs)
    
    If _manager.Personalization.Scope = PersonalizationScope.Shared Then
      _manager.Personalization.ToggleScope()
    End If

  End Sub
   
  ' If not in Shared scope, and if user is allowed, toggle the scope.
  Protected Sub RadioButton2_CheckedChanged(ByVal sender As Object, _
    ByVal e As EventArgs)
    
    If _manager.Personalization.CanEnterSharedScope AndAlso _
      _manager.Personalization.Scope = PersonalizationScope.User Then
      _manager.Personalization.ToggleScope()
    End If

  End Sub

</script>
<div>
  <asp:Panel ID="Panel1" runat="server" 
    Borderwidth="1" 
    Width="230" 
    BackColor="lightgray"
    Font-Names="Verdana, Arial, Sans Serif" >
    <asp:Label ID="Label1" runat="server" 
      Text=" Display Mode" 
      Font-Bold="true"
      Font-Size="8"
      Width="120" 
      AssociatedControlID="DisplayModeDropdown"/>
    <asp:DropDownList ID="DisplayModeDropdown" runat="server"  
      AutoPostBack="true" 
      Width="120"
      OnSelectedIndexChanged="DisplayModeDropdown_SelectedIndexChanged" />
    <asp:LinkButton ID="LinkButton1" runat="server"
      Text="Reset User State" 
      ToolTip="Reset the current user's personalization data for the page."
      Font-Size="8" 
      OnClick="LinkButton1_Click" />
    <asp:Panel ID="Panel2" runat="server" 
      GroupingText="Personalization Scope"
      Font-Bold="true"
      Font-Size="8" 
      Visible="false" >
      <asp:RadioButton ID="RadioButton1" runat="server" 
        Text="User" 
        AutoPostBack="true"
        GroupName="Scope" OnCheckedChanged="RadioButton1_CheckedChanged" />
      <asp:RadioButton ID="RadioButton2" runat="server" 
        Text="Shared" 
        AutoPostBack="true"
        GroupName="Scope" 
        OnCheckedChanged="RadioButton2_CheckedChanged" />
    </asp:Panel>
  </asp:Panel>
</div>

A segunda parte do exemplo do código é o código-fonte da interface e dos controlos. O ficheiro fonte contém uma interface simples chamada IZipCode. Existe também uma WebPart classe chamada ZipCodeWebPart que implementa a interface e atua como controlo do fornecedor. A outra WebPart classe chama-se WeatherWebPart, e atua como consumidor para a ligação. Esta classe tem um método chamado GetZipCode que obtém uma instância da IZipCode interface do controlo do fornecedor. Note que este método está marcado como o método do ponto de ligação do consumidor com um ConnectionConsumer atributo nos seus metadados. Este é o mecanismo para identificar o método do ponto de ligação no controlo do consumidor.

Para que o exemplo de código seja executado, tens de compilar este código-fonte. Pode compilar explicitamente e colocar o assembly resultante na pasta Bin do seu site ou na cache global assembly. Alternativamente, pode colocar o código-fonte na pasta App_Code do seu site, onde será compilado dinamicamente em tempo de execução. Este exemplo de código utiliza compilação dinâmica. Para um guia que demonstra como compilar, consulte Guia: Desenvolvimento e Utilização de um Controlo de Servidor Web Personalizado.

namespace Samples.AspNet.CS.Controls
{
  using System;
  using System.Web;
  using System.Web.Security;
  using System.Security.Permissions;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.Web.UI.WebControls.WebParts;

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public interface IZipCode
  {
    string ZipCode { get; set;}
  }

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class ZipCodeWebPart : WebPart, IZipCode
  {
    string zipCodeText = String.Empty;
    TextBox input;
    Button send;

    public ZipCodeWebPart()
    {
    }

    // Make the implemented property personalizable to save 
    // the Zip Code between browser sessions.
    [Personalizable()]
    public virtual string ZipCode
    {
      get { return zipCodeText; }
      set { zipCodeText = value; }
    }

    // This is the callback method that returns the provider.
    [ConnectionProvider("Zip Code Provider", "ZipCodeProvider")]
    public IZipCode ProvideIZipCode()
    {
      return this;
    }

    protected override void CreateChildControls()
    {
      Controls.Clear();
      input = new TextBox();
      this.Controls.Add(input);
      send = new Button();
      send.Text = "Enter 5-digit Zip Code";
      send.Click += new EventHandler(this.submit_Click);
      this.Controls.Add(send);
    }

    private void submit_Click(object sender, EventArgs e)
    {
      if (!string.IsNullOrEmpty(input.Text))
      {
        zipCodeText = Page.Server.HtmlEncode(input.Text);
        input.Text = String.Empty;
      }
    }
  }

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class WeatherWebPart : WebPart
  {
    private IZipCode _provider;
    string _zipSearch;
    Label DisplayContent;

    // This method is identified by the ConnectionConsumer 
    // attribute, and is the mechanism for connecting with 
    // the provider. 
    [ConnectionConsumer("Zip Code Consumer", "ZipCodeConsumer")]
    public void GetIZipCode(IZipCode Provider)
    {
      _provider = Provider;
    }
    
    protected override void OnPreRender(EventArgs e)
    {
      EnsureChildControls();

      if (this._provider != null)
      {
        _zipSearch = _provider.ZipCode.Trim();
        DisplayContent.Text = "My Zip Code is:  " + _zipSearch;
      }
    }

    protected override void CreateChildControls()
    {
      Controls.Clear();
      DisplayContent = new Label();
      this.Controls.Add(DisplayContent);
    }
  }
}
Imports System.Web
Imports System.Web.Security
Imports System.Security.Permissions
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts

Namespace Samples.AspNet.VB.Controls

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Interface IZipCode

    Property ZipCode() As String

  End Interface

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class ZipCodeWebPart
    Inherits WebPart
    Implements IZipCode
    Private zipCodeText As String = String.Empty
    Private input As TextBox
    Private send As Button

    Public Sub New()
    End Sub

    ' Make the implemented property personalizable to save 
    ' the Zip Code between browser sessions.
    <Personalizable()> _
    Public Property ZipCode() As String _
      Implements IZipCode.ZipCode

      Get
        Return zipCodeText
      End Get
      Set(ByVal value As String)
        zipCodeText = value
      End Set
    End Property

    ' This is the callback method that returns the provider.
    <ConnectionProvider("Zip Code Provider", "ZipCodeProvider")> _
    Public Function ProvideIZipCode() As IZipCode
      Return Me
    End Function


    Protected Overrides Sub CreateChildControls()
      Controls.Clear()
      input = New TextBox()
      Me.Controls.Add(input)
      send = New Button()
      send.Text = "Enter 5-digit Zip Code"
      AddHandler send.Click, AddressOf Me.submit_Click
      Me.Controls.Add(send)

    End Sub


    Private Sub submit_Click(ByVal sender As Object, _
      ByVal e As EventArgs)

      If input.Text <> String.Empty Then
        zipCodeText = Page.Server.HtmlEncode(input.Text)
        input.Text = String.Empty
      End If

    End Sub

  End Class

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class WeatherWebPart
    Inherits WebPart
    Private _provider As IZipCode
    Private _zipSearch As String
    Private DisplayContent As Label

    ' This method is identified by the ConnectionConsumer 
    ' attribute, and is the mechanism for connecting with 
    ' the provider. 
    <ConnectionConsumer("Zip Code Consumer", "ZipCodeConsumer")> _
    Public Sub GetIZipCode(ByVal Provider As IZipCode)
      _provider = Provider
    End Sub


    Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
      EnsureChildControls()

      If Not (Me._provider Is Nothing) Then
        _zipSearch = _provider.ZipCode.Trim()
                DisplayContent.Text = "My Zip Code is:  " + _zipSearch
      End If

    End Sub

    Protected Overrides Sub CreateChildControls()
      Controls.Clear()
      DisplayContent = New Label()
      Me.Controls.Add(DisplayContent)

    End Sub

  End Class

End Namespace

A terceira parte do exemplo do código é a página Web. Perto do topo estão Register as diretivas para registar os controlos personalizados que formam a ligação e o controlo do utilizador que permite aos utilizadores alterar os modos de visualização na página. A própria ligação é criada de forma declarativa dentro do <staticconnections> elemento na página. Isto demonstra uma forma de criar uma ligação — note-se o ConsumerConnectionPointID atributo no <asp:webpartconnection> elemento. Também pode criar a ligação programaticamente; O código para isso está no Button1_Click método. Neste caso, um ConsumerConnectionPoint objeto é criado e depois passado para um método que cria a ligação real. Quer a ligação seja criada declarativamente ou programaticamente, os pontos de ligação devem ser sempre especificados tanto para o fornecedor como para o consumidor. O Button2_Click método acede aos ConnectionPoint objetos tanto do fornecedor como do consumidor, e escreve alguns dos seus valores de propriedade numa etiqueta na página.

<%@ Page Language="C#" %>
<%@ register tagprefix="uc1" 
    tagname="DisplayModeMenuCS"
    src="~/displaymodemenucs.ascx" %>
<%@ Register TagPrefix="aspSample" 
    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">

<script runat="server">

  protected void Button1_Click(object sender, EventArgs e)
  {
    ProviderConnectionPoint provPoint =
      mgr.GetProviderConnectionPoints(zip1)["ZipCodeProvider"];
    ConsumerConnectionPoint connPoint =
      mgr.GetConsumerConnectionPoints(weather1)["ZipCodeConsumer"];
      
    if(mgr.CanConnectWebParts(zip1, provPoint, weather1, connPoint))
      mgr.ConnectWebParts(zip1, provPoint, weather1, connPoint);
  
  }  
  protected void Button2_Click(object sender, EventArgs e)
  {
    WebPartConnection conn = mgr.Connections[0];
    
    lblConn.Text = "<h2>Connection Point Details</h2>" + 
       "<h3>Provider Connection Point</h3>" + 
       "  Display name: " + conn.ProviderConnectionPoint.DisplayName + 
       "<br />" + 
       "  ID: " + conn.ProviderConnectionPoint.ID + 
       "<br />" + 
       "  Interface type: " + 
        conn.ProviderConnectionPoint.InterfaceType.ToString() + 
       "<br />" + 
       "  Control type: " + conn.ProviderConnectionPoint.ControlType.ToString() + 
       "<br />" + 
       "  Allows multiple connections: " + 
          conn.ProviderConnectionPoint.AllowsMultipleConnections.ToString() + 
       "<br />" + 
       "  Enabled: " + conn.ProviderConnectionPoint.GetEnabled(zip1).ToString() + 
       "<hr />" + 
       "<h3>Consumer Connection Point</h3>" + 
       "  Display name: " + conn.ConsumerConnectionPoint.DisplayName + 
       "<br />" + 
       "  ID: " + conn.ConsumerConnectionPoint.ID + 
       "<br />" + 
       "  Interface type: " + conn.ConsumerConnectionPoint.InterfaceType.ToString() + 
       "<br />" + 
       "  Control type: " + conn.ConsumerConnectionPoint.ControlType.ToString() + 
       "<br />" + 
       "  Allows multiple connections: " + 
          conn.ConsumerConnectionPoint.AllowsMultipleConnections.ToString() + 
       "<br />" + 
       "  Enabled: " + conn.ConsumerConnectionPoint.GetEnabled(zip1).ToString();
  }

  protected void Page_Load(object sender, EventArgs e)
  {
    lblConn.Text = String.Empty;
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:WebPartManager ID="mgr" runat="server" >
        <StaticConnections>
          <asp:WebPartConnection ID="conn1"
            ConsumerConnectionPointID="ZipCodeConsumer"
            ConsumerID="weather1" 
            ProviderConnectionPointID="ZipCodeProvider" 
            ProviderID="zip1" />
        </StaticConnections>      
      </asp:WebPartManager>
      <uc1:displaymodemenucs id="menu1" runat="server" />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <aspSample:ZipCodeWebPart ID="zip1" runat="server"
            Title="Zip Code Provider"  />
          <aspSample:WeatherWebPart ID="weather1" runat="server" 
            Title="Zip Code Consumer" />
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:ConnectionsZone ID="ConnectionsZone1" runat="server">
      </asp:ConnectionsZone>
      <asp:Button ID="Button1" runat="server" 
        Text="Dynamic Connection" 
        OnClick="Button1_Click" />      
      <br />
      <asp:Button ID="Button2" runat="server" 
        Text="Connection Point Details" 
        OnClick="Button2_Click" />
      <br />
      <asp:Label ID="lblConn" runat="server" />
    </div>
    </form>
</body>
</html>
<%@ Page Language="VB" %>
<%@ register tagprefix="uc1" 
    tagname="DisplayModeMenuVB"
    src="~/displaymodemenuvb.ascx" %>
<%@ Register TagPrefix="aspSample" 
    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">

<script runat="server">

  Protected Sub Button1_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs)

    Dim provPoint As ProviderConnectionPoint = _
      mgr.GetProviderConnectionPoints(zip1)("ZipCodeProvider")
    Dim connPoint As ConsumerConnectionPoint = _
      mgr.GetConsumerConnectionPoints(weather1)("ZipCodeConsumer")

    If mgr.CanConnectWebParts(zip1, provPoint, weather1, connPoint) Then
      mgr.ConnectWebParts(zip1, provPoint, weather1, connPoint)
    End If
    
  End Sub
  
  Protected Sub Button2_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs)
    
    Dim conn As WebPartConnection = mgr.Connections(0)

    lblConn.Text = "<h2>Connection Point Details</h2>" & _
      "<h3>Provider Connection Point</h3>" & _
      "  Display name: " & conn.ProviderConnectionPoint.DisplayName & _
      "<br />" & _
      "  ID: " & conn.ProviderConnectionPoint.ID & _
      "<br />" & _
      "  Interface type: " & conn.ProviderConnectionPoint.InterfaceType.ToString() & _
      "<br />" & _
      "  Control type: " & conn.ProviderConnectionPoint.ControlType.ToString() & _
      "<br />" & _
      "  Allows multiple connections: " & _
        conn.ProviderConnectionPoint.AllowsMultipleConnections.ToString() & _
      "<br />" & _
      "  Enabled: " & conn.ProviderConnectionPoint.GetEnabled(zip1).ToString() & _
      "<hr />" & _
      "<h3>Consumer Connection Point</h3>" & _
      "  Display name: " & conn.ConsumerConnectionPoint.DisplayName & _
      "<br />" & _
      "  ID: " & conn.ConsumerConnectionPoint.ID & _
      "<br />" & _
      "  Interface type: " & conn.ConsumerConnectionPoint.InterfaceType.ToString() & _
      "<br />" & _
      "  Control type: " & conn.ConsumerConnectionPoint.ControlType.ToString() & _
      "<br />" & _
      "  Allows multiple connections: " & _
        conn.ConsumerConnectionPoint.AllowsMultipleConnections.ToString() & _
      "<br />" & _
      "  Enabled: " & conn.ConsumerConnectionPoint.GetEnabled(zip1).ToString()
          
  End Sub

  Protected Sub Page_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs)
    lblConn.Text = String.Empty
  End Sub
  
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:WebPartManager ID="mgr" runat="server" >
        <StaticConnections>
          <asp:WebPartConnection ID="conn1"
            ConsumerConnectionPointID="ZipCodeConsumer"
            ConsumerID="weather1" 
            ProviderConnectionPointID="ZipCodeProvider" 
            ProviderID="zip1" />
        </StaticConnections>      
      </asp:WebPartManager>
      <uc1:displaymodemenuvb id="menu1" runat="server" />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <aspSample:ZipCodeWebPart ID="zip1" runat="server"
            Title="Zip Code Provider"  />
          <aspSample:WeatherWebPart ID="weather1" runat="server" 
            Title="Zip Code Consumer" />
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:ConnectionsZone ID="ConnectionsZone1" runat="server">
      </asp:ConnectionsZone>
      <asp:Button ID="Button1" runat="server" 
        Text="Dynamic Connection" 
        OnClick="Button1_Click" />      
      <br />
      <asp:Button ID="Button2" runat="server" 
        Text="Connection Point Details" 
        OnClick="Button2_Click" />
      <br />
      <asp:Label ID="lblConn" runat="server" />
    </div>
    </form>
</body>
</html>

Depois de carregar a página num navegador, clique no botão Detalhes do Ponto de Ligação . Aparecem informações sobre o fornecedor e os pontos de ligação do consumidor estabelecidos na ligação declarativa. De seguida, use o controlo suspenso do Modo de Exibição para mudar a página para o modo de ligar. No menu verbs do controlo ZIP Code ProviderWebPart (representado por uma seta para baixo na barra de título), clique no verbo conectar. A interface de ligação aparece, criada automaticamente pelo <asp:connectionszone> controlo declarado na página. Esta é outra forma de criar uma ligação (através da interface), juntamente com os métodos declarativos e programáticos discutidos anteriormente. Clique no botão Desligar para terminar a ligação estática existente. Clique no link Criar uma Ligação a um Consumidor . A interface apresenta agora um controlo suspenso que indica o nome de exibição do ponto de ligação do consumidor. Selecione o ponto de ligação na lista suspensa e depois clique em Ligar para completar a ligação. De seguida, clique novamente em Desligar . Clique no botão Conexão Dinâmica para criar uma ligação programaticamente. Use o controlo do Modo de Exibição para devolver a página ao modo de navegação. Clique novamente no botão Detalhes do Ponto de Ligação para indicar os detalhes sobre o objeto ponto de ligação do consumidor mais uma vez.

O exemplo demonstrou estabelecer uma ligação e usar um ponto de ligação de consumidor de três formas: uma ligação estática declarada na marcação da página Web; uma ligação criada em código que usava um ConsumerConnectionPoint objeto; e uma ligação criada por um utilizador através da interface de ligação.

Observações

Em cada ligação Web Parts entre dois controlos de servidor, cada controlo deve ter (entre outros requisitos) um objeto de ponto de ligação associado que lhe permita ligar-se ao outro controlo e fornecer ou consumir dados, dependendo se o controlo é designado como fornecedor ou consumidor da ligação. Um objeto, em geral, contém os detalhes de como um controlo pode ligar-se a outro controlo e o tipo de dados que ConnectionPoint pode partilhar. Para um controlo atuar como consumidor numa ligação, o seu ponto de ligação deve ser um ConsumerConnectionPoint objeto. Para detalhes sobre ligações e pontos de ligação das Web Parts, leia os tópicos listados na secção Ver Também abaixo.

Para criar um ConsumerConnectionPoint objeto, são necessários vários passos:

  1. Permita que um controlo de consumidor faça referência a uma instância de interface. Um WebPart ou outro controlo de servidor (qualquer tipo de controlo de servidor que será adicionado a uma WebPartZoneBase zona pode ser utilizado) deve ser capaz de consumir dados de uma instância de interface específica. O controlo não precisa de implementar a interface; apenas o prestador deve implementá-la. O consumidor pode trabalhar com o tipo de interface exato fornecido por um fornecedor ou, se não o fizer, um WebPartTransformer objeto pode ser usado para transformar dados do tipo de interface de um fornecedor para um tipo compreendido pelo consumidor. Uma forma típica de ativar um consumidor é declarar um campo privado para conter uma referência ao tipo de interface desejado.

  2. Identifique um método de retorno de chamada. Um método no consumidor deve ser identificado como método de callback para estabelecer uma ligação com o fornecedor. Este método recupera uma instância da interface que o fornecedor implementa e atribui-a (por exemplo) ao campo privado criado na primeira etapa. A abordagem Web Parts para identificar um método de callback no consumidor é adicionar um ConnectionConsumer atributo de metadados (definido pela ConnectionConsumerAttribute classe) ao método que recebe a instância da interface. Quando o atributo é adicionado, o único parâmetro necessário é um nome de exibição para usar como ponto de ligação do consumidor. Também podem ser adicionados parâmetros opcionais, como um ID.

  3. Processe e produza os dados da instância da interface. Realize qualquer processamento interno conforme necessário nos dados e, normalmente, um controlo do consumidor irá renderizar os dados na página. Uma forma comum de o fazer é sobrepor o método do OnPreRender controlo.

    Note

    Durante um pedido síncrono, o consumidor deve solicitar os dados diretamente ao fornecedor durante ou imediatamente após o PreRender evento. Durante um pedido assíncrono, se o método de callback do fornecedor não for chamado em nenhum momento durante a renderização, o programador pode assumir que nenhum dado foi enviado ao consumidor.

Depois de um controlo ter sido equipado para atuar como consumidor, o controlo pode participar em ligações (assumindo que um controlo do fornecedor também está equipado e disponível). Para criar uma ligação estática e declarativa na marcação de uma página Web, os programadores podem usar o <asp:webpartconnection> elemento. Se o ConnectionConsumer atributo no código-fonte do consumidor que identifica o método de callback especificar um ID para o ponto de ligação, então esse valor deve ser atribuído ao ConsumerConnectionPointID atributo no <asp:webpartconnection> elemento numa página. Uma razão pela qual um programador pode especificar um ID para um ponto de ligação do consumidor é se existirem múltiplos pontos de ligação definidos no controlo do consumidor. Se não for especificado um ID para o ponto de ligação do consumidor no controlo do consumidor, também não é necessário atribuir valor ao ConsumerConnectionPointID atributo na página, pois a ligação será criada usando um valor padrão obtido do DefaultID campo.

Para criar uma ligação em código, os programadores devem criar um novo ConsumerConnectionPoint objeto chamando o GetConsumerConnectionPoints método e passando-lhe o ID do controlo do consumidor, juntamente com o ID ou índice do objeto definido ConsumerConnectionPoint no controlo do consumidor. O objeto devolvido ConsumerConnectionPoint , juntamente com uma referência ao controlo do consumidor, uma referência ao controlo do fornecedor e um objeto correspondente ProviderConnectionPoint , são todos passados ConnectWebParts ao método para criar um novo WebPartConnection objeto.

Embora os programadores possam usar pontos de ligação do consumidor como parte do estabelecimento de ligações, seja de forma declarativa ou programática, os utilizadores também podem interagir com os pontos de ligação do consumidor para estabelecer ligações através da interface de utilizador (UI). Se os programadores declararem um ConnectionsZone controlo numa página Web, esta fornece uma interface em tempo de execução para os utilizadores criarem ligações. Se os utilizadores escolherem o controlo do fornecedor como ponto de partida para estabelecer a ligação clicando no seu verbo connect (também podem escolher o consumidor; não há diferença na ligação resultante), na interface verão um controlo de lista suspensa com os nomes de visualização do ponto de ligação do consumidor disponível (ou pontos, se houver vários) para onde o fornecedor pode enviar os dados. Os utilizadores devem selecionar um ponto de ligação do consumidor para estabelecer uma ligação.

Um objeto associa-se diretamente a um controlo específico do consumidor e armazena detalhes sobre uma ligação nas propriedades que ConsumerConnectionPoint herda da classe base ConnectionPoint . Por exemplo, na propriedade herdada InterfaceType , um ponto de ligação do consumidor mantém o tipo de interface que utiliza. Se o fornecedor e o consumidor numa ligação compreenderem ambos o tipo de interface, os controlos são compatíveis e capazes de formar uma ligação direta. Se o fornecedor e o consumidor não conseguirem trabalhar com o mesmo tipo de interface, são incompatíveis e devem usar um WebPartTransformer objeto para traduzir a propriedade do InterfaceType ponto de ligação do fornecedor num tipo com o qual o consumidor possa trabalhar. Outra propriedade herdada importante é a propriedade DisplayName , que fornece um nome amigável para mostrar na interface de utilizador para que os utilizadores possam escolher um ponto de ligação ao consumidor ao criar ligações. O nome de exibição é o parâmetro necessário quando os programadores adicionam um ConnectionConsumer atributo ao método de callback num controlo de consumidor. A propriedade herdada ID também é útil, como indicado acima, porque fornece um identificador único para um ponto de ligação do consumidor caso o consumidor tenha múltiplos pontos de ligação. Um consumidor pode ter múltiplos ConsumerConnectionPoint objetos definidos nele e, neste caso, quando os programadores adicionam o ConnectionConsumer atributo a um método, devem especificar um valor ID para distinguir cada ponto de ligação. Outra propriedade herdada notável é a AllowsMultipleConnections propriedade, que indica se um ponto de ligação do consumidor pode ligar-se simultaneamente a múltiplos fornecedores. Este valor de propriedade é false por defeito para pontos de ligação ao consumidor (enquanto que por defeito é true para pontos de ligação ao fornecedor).

A ConsumerConnectionPoint classe acrescenta vários métodos únicos aos membros que herda da classe ConnectionPoint . O SetObject método invoca o método de callback definido pelo próprio consumidor para recuperar a instância de interface do fornecedor. O SupportsConnection método devolve um valor booleano que indica se o ponto de ligação consegue estabelecer ligações, com base no estado atual do controlo do consumidor associado.

Construtores

Name Description
ConsumerConnectionPoint(MethodInfo, Type, Type, String, String, Boolean)

Inicializa uma nova instância da ConsumerConnectionPoint classe.

Propriedades

Name Description
AllowsMultipleConnections

Obtém um valor que indica se um ponto de ligação suporta múltiplas ligações simultâneas.

(Herdado de ConnectionPoint)
ControlType

Obtém o Type controlo do servidor com o qual um ponto de ligação está associado.

(Herdado de ConnectionPoint)
DisplayName

Recebe uma string que serve como nome de exibição amigável para representar um ponto de ligação na interface do utilizador (UI).

(Herdado de ConnectionPoint)
ID

Obtém uma cadeia que contém o identificador de um ponto de ligação.

(Herdado de ConnectionPoint)
InterfaceType

Obtém o tipo de interface usado por um ponto de ligação.

(Herdado de ConnectionPoint)

Métodos

Name Description
Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetEnabled(Control)

Devolve um valor que indica se um ponto de ligação pode participar nas ligações.

(Herdado de ConnectionPoint)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
SetObject(Control, Object)

Invoca o método de callback num controlo de consumidor e recupera a instância de interface de um controlo de fornecedor.

SupportsConnection(Control, ConnectionInterfaceCollection)

Determina se um ponto de ligação do consumidor é atualmente capaz de estabelecer uma ligação.

ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)

Aplica-se a

Ver também