ProviderConnectionPoint Classe

Definição

Define um objeto de ponto de conexão que permite que um controle de servidor que funciona como provedor forme uma conexão com um consumidor.

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

Exemplos

O exemplo de código a seguir mostra maneiras simples de criar uma conexão declarativamente, programaticamente ou por meio da interface do usuário, em cada caso fazendo uso de um ponto de conexão do provedor.

O exemplo tem quatro partes:

  • Um controle de usuário que permite alterar o modo de exibição de Web Parts em uma página.

  • Código-fonte para uma interface e dois WebPart controles que atuam como o provedor e o consumidor de uma conexão.

  • Uma página da Web para hospedar todos os controles e executar o exemplo de código.

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

A primeira parte desse exemplo de código é o controle de usuário que permite que os usuários alterem os modos de exibição em uma página da Web. Salve o código-fonte a seguir em um arquivo .ascx, dando-lhe o nome do arquivo atribuído ao Src atributo da Register diretiva para esse controle de usuário, que está próximo à parte superior da página da Web de hospedagem. Para obter detalhes sobre modos de exibição e uma descrição do código-fonte nesse controle, consulte Passo a passo: alterando modos de exibição em uma página de Web Parts.

<%@ 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 de código é o código-fonte para a interface e os controles. O arquivo de origem contém uma interface simples chamada IZipCode. Há também uma WebPart classe chamada ZipCodeWebPart que implementa a interface e atua como o controle do provedor. Seu ProvideIZipCode método é o método de retorno de chamada que implementa o único membro da interface. O método simplesmente retorna uma instância da interface. Observe que o método é marcado com um ConnectionProvider atributo em seus metadados. Esse é o mecanismo para identificar o método como o método de retorno de chamada para o ponto de conexão do provedor. A outra WebPart classe é chamada WeatherWebPart, e atua como consumidor da conexão. Essa classe tem um método chamado GetZipCode que obtém uma instância da IZipCode interface do controle do provedor. Observe que esse método é marcado como o método de ponto de conexão do consumidor com um ConnectionConsumer atributo em seus metadados. Esse é o mecanismo para identificar o método de ponto de conexão no controle do consumidor.

Para que o exemplo de código seja executado, você deve compilar esse código-fonte. Você pode compilá-lo explicitamente e colocar o assembly resultante na pasta Bin do seu site ou no cache de assembly global. Como alternativa, você pode colocar o código-fonte na pasta App_Code do site, em que ele será compilado dinamicamente em tempo de execução. Este exemplo de código usa compilação dinâmica. Para obter um passo a passo que demonstra como compilar, consulte Passo a passo : Desenvolvendo e usando um controle 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 de código é a página da Web. Na parte superior estão Register diretivas para registrar os controles personalizados que formam a conexão e o controle de usuário que permite que os usuários alterem os modos de exibição na página. A conexão em si é criada declarativamente dentro do <staticconnections> elemento na página. Isso demonstra uma maneira de criar uma conexão – observe o ProviderConnectionPointID atributo no <asp:webpartconnection> elemento . Você também pode criar a conexão programaticamente; o código para fazer isso está no Button1_Click método . Nesse caso, um ProviderConnectionPoint objeto é criado e, em seguida, passado para um método que cria a conexão real. Se a conexão for criada declarativamente ou programaticamente, os pontos de conexão sempre devem ser especificados para o provedor e para o consumidor. O Button2_Click método acessa os ConnectionPoint objetos para o provedor e o consumidor e grava alguns de seus valores de propriedade em um rótulo 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 em um navegador, clique no botão Detalhes do Ponto de Conexão . As informações sobre os pontos de conexão do provedor e do consumidor estabelecidas na conexão declarativa são exibidas. Em seguida, use o controle suspenso Modo de Exibição para alternar a página para o modo de conexão. No menu de verbos do controle consumidor WebPart de CEP (representado por uma seta para baixo na barra de título), clique no verbo de conexão. A interface do usuário de conexão é exibida, criada automaticamente pelo <asp:connectionszone> controle declarado na página. Essa é outra maneira de criar uma conexão (por meio da interface do usuário), juntamente com os métodos declarativos e programáticos discutidos anteriormente. Clique no botão Desconectar para encerrar a conexão estática existente. Clique no link Criar uma Conexão com um Provedor . A interface do usuário agora exibe um controle suspenso que lista o nome de exibição do ponto de conexão do provedor. Selecione o ponto de conexão na lista suspensa e clique em Conectar para concluir a conexão. Em seguida, clique em Desconectar novamente. Em seguida, clique no botão Conexão Dinâmica para criar uma conexão programaticamente. Use o controle Modo de Exibição para retornar a página para o modo de navegação. Clique no botão Detalhes do Ponto de Conexão novamente para mais uma vez indicar detalhes sobre o objeto do ponto de conexão do provedor.

O exemplo demonstrou o estabelecimento de uma conexão e o uso de um ponto de conexão do provedor de três maneiras: uma conexão estática declarada na marcação de página da Web; uma conexão criada no código que usava um ProviderConnectionPoint objeto e uma conexão criada por um usuário por meio da interface do usuário de conexão.

Comentários

Em cada conexão de Web Parts entre dois controles de servidor, cada controle deve ter (entre outros requisitos) um objeto de ponto de conexão associado que permite que ele se conecte ao outro controle e forneça ou consuma dados, dependendo se o controle é designado como provedor ou consumidor para a conexão. Um ConnectionPoint objeto em geral contém os detalhes de como um controle pode se conectar a outro controle e o tipo de dados que ele pode compartilhar. Para um controle que atua como o provedor em uma conexão, seu ponto de conexão deve ser um ProviderConnectionPoint objeto . Para obter detalhes sobre conexões de Web Parts e pontos de conexão, consulte os tópicos listados na seção Veja também abaixo.

Para criar um ProviderConnectionPoint objeto, várias etapas são necessárias:

  1. Crie uma interface. Quando um provedor compartilha dados com um consumidor, ele faz isso obtendo uma instância de uma interface e retornando essa instância para um consumidor.

  2. Implemente a interface em um provedor. Um WebPart ou outro controle de servidor (qualquer tipo de controle de servidor em uma WebPartZoneBase zona pode ser usado) que será o provedor deve implementar a interface criada na primeira etapa.

  3. Identifique um método de retorno de chamada. Um método no provedor deve ser identificado como o método de retorno de chamada para estabelecer uma conexão. Esse método retorna uma instância da interface implementada para um consumidor. A abordagem de Web Parts para identificar um método de retorno de chamada no provedor é adicionar um ConnectionProvider atributo de metadados (definido pela ConnectionProviderAttribute classe) ao método que retorna a instância da interface. Quando o atributo é adicionado, o único parâmetro necessário é um nome de exibição a ser usado para o ponto de conexão do provedor. Parâmetros opcionais também podem ser adicionados, como uma ID para o ponto de conexão.

Depois que um controle tiver sido equipado para atuar como um provedor, o controle poderá participar de conexões (supondo que um controle do consumidor esteja igualmente equipado e disponível). Para criar uma conexão estática e declarativa na marcação de uma página da Web, os desenvolvedores podem usar o <asp:webpartconnection> elemento . Se o ConnectionProvider atributo no código-fonte do provedor que identifica o método de retorno de chamada especificar uma ID para o ponto de conexão, esse valor deverá ser atribuído ao ProviderConnectionPointID atributo no elemento em <asp:webpartconnection> uma página. Um dos motivos pelos quais um desenvolvedor pode especificar uma ID para um ponto de conexão do provedor é se houver vários pontos de conexão no controle do provedor. Se uma ID não for especificada para o ponto de conexão do provedor no controle do provedor, um valor também não precisará ser atribuído ao ProviderConnectionPointID atributo na página, pois a conexão será criada usando um valor padrão obtido do DefaultID campo.

Para criar uma conexão no código, os desenvolvedores devem criar um novo ProviderConnectionPoint objeto chamando o GetProviderConnectionPoints método e passando para ele a ID do controle do provedor, juntamente com a ID ou o índice do objeto definido ProviderConnectionPoint no controle do provedor. O objeto retornado ProviderConnectionPoint , juntamente com uma referência ao controle do provedor, uma referência ao controle do consumidor e um objeto correspondente ConsumerConnectionPoint , são todos passados para o ConnectWebParts método para criar um novo WebPartConnection objeto.

Embora os desenvolvedores possam usar pontos de conexão do provedor como parte do estabelecimento de conexões de forma declarativa ou programática, os usuários também podem interagir com pontos de conexão do provedor para estabelecer conexões por meio da interface do usuário (interface do usuário). Se os desenvolvedores declararem um ConnectionsZone controle em uma página da Web, ele fornecerá uma interface do usuário em tempo de execução para que os usuários criem conexões. Se os usuários escolherem o controle do consumidor como o ponto de partida para estabelecer a conexão clicando em seu verbo de conexão (eles também podem escolher o provedor; não há diferença na conexão resultante), na interface do usuário eles verão um controle de lista suspensa com o nome de exibição do ponto de conexão do provedor disponível (ou pontos, se houver vários). Os usuários devem selecionar um ponto de conexão do provedor para criar uma conexão.

Um ProviderConnectionPoint objeto é associado diretamente a um controle de provedor específico e armazena detalhes sobre uma conexão nas propriedades herdadas da classe base ConnectionPoint . Por exemplo, na propriedade herdada InterfaceType , um ponto de conexão do provedor mantém o tipo de interface retornado pelo provedor. Se o provedor e o consumidor em uma conexão funcionarem com o mesmo tipo de interface, os controles serão compatíveis e capazes de formar uma conexão direta. Se o provedor e o consumidor não puderem trabalhar com o mesmo tipo de interface, eles serão incompatíveis e deverão usar um WebPartTransformer objeto para converter o valor do ponto de conexão do InterfaceType provedor em um tipo com o qual o consumidor possa trabalhar. Outra propriedade herdada importante é a DisplayName propriedade , que fornece um nome amigável a ser exibido na interface do usuário para que os usuários escolham um ponto de conexão do provedor ao criar conexões. O nome de exibição é o parâmetro necessário quando os desenvolvedores adicionam um ConnectionProvider atributo ao método de retorno de chamada em um controle de provedor. A propriedade herdada ID também é útil, conforme indicado acima, porque fornece um identificador exclusivo para um ponto de conexão do provedor no caso de um provedor ter vários pontos de conexão. Um provedor pode ter vários ProviderConnectionPoint objetos definidos nele e, nesse caso, quando os desenvolvedores adicionam o ConnectionProvider atributo a um método, eles devem especificar um valor de ID para distinguir cada ponto de conexão. Uma outra propriedade herdada notável é a AllowsMultipleConnections propriedade , que indica se um ponto de conexão do provedor pode se conectar simultaneamente a vários consumidores. Esse valor de propriedade é true , por padrão, para pontos de conexão do provedor (enquanto o padrão é para false pontos de conexão do consumidor).

A ProviderConnectionPoint classe adiciona vários métodos exclusivos aos membros herdados da ConnectionPoint classe . O GetObject método recupera uma instância da interface que o método de retorno de chamada retornará aos consumidores. O GetSecondaryInterfaces método recupera interfaces de consumidor adicionais que fazem parte de uma conexão existente, mas não são as interfaces usadas para estabelecer a conexão.

Construtores

ProviderConnectionPoint(MethodInfo, Type, Type, String, String, Boolean)

Inicializa uma nova instância da classe ProviderConnectionPoint.

Propriedades

AllowsMultipleConnections

Obtém um valor que indica se um ponto de conexão é compatível com várias conexões simultâneas.

(Herdado de ConnectionPoint)
ControlType

Obtém o Type do controle do servidor ao qual um ponto de conexão é associado.

(Herdado de ConnectionPoint)
DisplayName

Obtém uma cadeia de caracteres que funciona como um nome de exibição amigável para representar um ponto de conexão na IU (interface do usuário).

(Herdado de ConnectionPoint)
ID

Obtém uma cadeia de caracteres que contém o identificador para um ponto de conexão.

(Herdado de ConnectionPoint)
InterfaceType

Obtém o tipo da interface usada por um ponto de conexão.

(Herdado de ConnectionPoint)

Métodos

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetEnabled(Control)

Retorna um valor que indica se um ponto de conexão pode participar de conexões.

(Herdado de ConnectionPoint)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetObject(Control)

Invoca o método de retorno de chamada em um controle do provedor que obtém uma instância da interface para retornar a consumidores.

GetSecondaryInterfaces(Control)

Obtém uma coleção opcional de interfaces secundárias que podem ser compatíveis com um ponto de conexão do provedor.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Aplica-se a

Confira também