IWebPartRow Interface

Definição

Define uma interface de fornecedor para ligar dois controlos de servidor usando um único campo de dados.

public interface class IWebPartRow
public interface IWebPartRow
type IWebPartRow = interface
Public Interface IWebPartRow

Exemplos

O exemplo de código seguinte demonstra como criar uma ligação estática entre dois controlos usando a IWebPartRow interface. O exemplo de código tem três partes:

  • Código-fonte para dois controlos personalizados WebPart que podem formar uma ligação através da IWebPartRow interface, com um controlo a atuar como fornecedor e o outro como consumidor.

  • Uma página Web que aloja os controlos e declara a ligação estática em formato de persistência.

  • Uma descrição do que acontece quando o código de exemplo é executado.

A primeira parte do exemplo de código é o código-fonte dos dois controlos personalizados. O primeiro é o código do fornecedor, que implementa a IWebPartRow interface. Para simplificar no exemplo, o fornecedor cria uma tabela com alguns dados em vez de se ligar a uma base de dados. O GetConnectionInterface método serve como ponto de ligação do fornecedor, o método de callback que devolve a instância de interface ao consumidor. Quanto ao consumidor, recupera a instância de interface do fornecedor no seu método chamado SetConnectionInterface, que é marcado com um ConnectionConsumer atributo. Após recuperar a instância da interface, o consumidor, no seu OnPreRender método, chama a implementação do GetRowData método no fornecedor, para recuperar os dados reais e escrevê-los na página.

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.

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Reflection;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

namespace Samples.AspNet.CS.Controls 
{
  // This sample code creates a Web Parts control that acts as a provider 
  // of row data.
  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public sealed class RowProviderWebPart : WebPart, IWebPartRow 
    {
    private DataTable _table;
    
    public RowProviderWebPart() 
        {
      _table = new DataTable();

      DataColumn col = new DataColumn();
      col.DataType = typeof(string);
      col.ColumnName = "Name";
      _table.Columns.Add(col);

      col = new DataColumn();
      col.DataType = typeof(string);
      col.ColumnName = "Address";
      _table.Columns.Add(col);

      col = new DataColumn();
      col.DataType = typeof(int);
      col.ColumnName = "ZIP Code";
      _table.Columns.Add(col);

      DataRow row = _table.NewRow();
      row["Name"] = "John Q. Public";
      row["Address"] = "123 Main Street";
      row["ZIP Code"] = 98000;
      _table.Rows.Add(row);
    }

    [ConnectionProvider("Row")]
    public IWebPartRow GetConnectionInterface()
        {
      return new RowProviderWebPart();
    }

    public PropertyDescriptorCollection Schema 
        {
      get 
      {
        return TypeDescriptor.GetProperties(_table.DefaultView[0]);
            }
    }

        public void GetRowData(RowCallback callback)
        {
            callback(_table.Rows);
        }
  } // RowProviderWebPart

  // This sample code creates a Web Parts control that acts as a consumer 
  // of row data.
  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]  
  public sealed class RowConsumerWebPart : WebPart 
  {
    private IWebPartRow _provider;
        private ICollection _tableData;
    
        private void GetRowData(object rowData)
        {
            _tableData = (ICollection)rowData;
        }

        protected override void OnPreRender(EventArgs e)
        {
            if (_provider != null)
            {
                _provider.GetRowData(new RowCallback(GetRowData));
            }
        }

    protected override void RenderContents(HtmlTextWriter writer) 
    {
      if (_provider != null) 
      {
        PropertyDescriptorCollection props = _provider.Schema;
            int count = 0;
        if (props != null && props.Count > 0 && _tableData != null) 
        {
            foreach (PropertyDescriptor prop in props) 
                  {
                      foreach (DataRow o in _tableData)
                      {
                          writer.Write(prop.DisplayName + ": " + o[count]);
                          writer.WriteBreak();
                          writer.WriteLine();
                          count = count + 1;
                      }
            }
        }
        else 
        {
          writer.Write("No data");
        }
      }
      else 
      {
        writer.Write("Not connected");
      }
    }

    [ConnectionConsumer("Row")]
    public void SetConnectionInterface(IWebPartRow provider) 
        {
      _provider = provider;
    }
  } // RowConsumerWebPart
} // Samples.AspNet.CS.Controls
Imports System.Collections
Imports System.ComponentModel
Imports System.Data
Imports System.Reflection
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts

Namespace Samples.AspNet.VB.Controls

  ' This sample code creates a Web Parts control that acts as a provider 
  ' of row data.
  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public NotInheritable Class RowProviderWebPart
    Inherits WebPart
    Implements IWebPartRow
    Private _table As DataTable


    Public Sub New()
      _table = New DataTable()

      Dim col As New DataColumn()
      col.DataType = GetType(String)
      col.ColumnName = "Name"
      _table.Columns.Add(col)

      col = New DataColumn()
      col.DataType = GetType(String)
      col.ColumnName = "Address"
      _table.Columns.Add(col)

      col = New DataColumn()
      col.DataType = GetType(Integer)
      col.ColumnName = "ZIP Code"
      _table.Columns.Add(col)

      Dim row As DataRow = _table.NewRow()
      row("Name") = "John Q. Public"
      row("Address") = "123 Main Street"
      row("ZIP Code") = 98000
      _table.Rows.Add(row)

    End Sub


    <ConnectionProvider("Row")> _
    Public Function GetConnectionInterface() As IWebPartRow
      Return New RowProviderWebPart()

    End Function 'GetConnectionInterface


    Public ReadOnly Property Schema() As _
      ComponentModel.PropertyDescriptorCollection Implements IWebPartRow.Schema

      Get
        Return TypeDescriptor.GetProperties(_table.DefaultView(0))
      End Get

    End Property


    Public Sub GetRowData(ByVal callback As RowCallback) _
      Implements IWebPartRow.GetRowData
      callback(_table.Rows)

    End Sub

  End Class


  ' This sample code creates a Web Parts control that acts as a consumer 
  ' of row data.
  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public NotInheritable Class RowConsumerWebPart
    Inherits WebPart
    Private _provider As IWebPartRow
    Private _tableData As ICollection


    Private Sub GetRowData(ByVal rowData As Object)
      _tableData = CType(rowData, ICollection)

    End Sub


    Protected Overrides Sub OnPreRender(ByVal e As EventArgs)

      If Not (_provider Is Nothing) Then
        _provider.GetRowData(New RowCallback(AddressOf GetRowData))
      End If

    End Sub

    Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)

      If Not (_provider Is Nothing) Then
        Dim props As PropertyDescriptorCollection = _provider.Schema
        Dim count As Integer = 0
        If Not (props Is Nothing) AndAlso props.Count > 0 _
          AndAlso Not (_tableData Is Nothing) Then

          Dim prop As PropertyDescriptor
          For Each prop In props
            Dim o As DataRow
            For Each o In _tableData
              writer.Write(prop.DisplayName & ": " & o(count))
              writer.WriteBreak()
              writer.WriteLine()
              count = count + 1
            Next o
          Next prop
        Else
          writer.Write("No data")
        End If
      Else
        writer.Write("Not connected")
      End If

    End Sub


    <ConnectionConsumer("Row")> _
    Public Sub SetConnectionInterface(ByVal provider As IWebPartRow)
      _provider = provider

    End Sub

  End Class

End Namespace  ' Samples.AspNet.VB.Controls

A segunda parte do exemplo do código é a página Web que declara a ligação estática e aloja os controlos. Perto do topo da página há uma Register diretiva que declara o espaço de nomes do código-fonte contido no diretório App_Code. A ligação é declarada usando um <asp:webpartconnection> elemento. Os controlos personalizados do consumidor e do fornecedor são declarados num <zonetemplate> elemento dentro de um <asp:webpartzone> elemento, que é necessário para que possam conectar-se (devem residir numa zona que herde da WebPartZoneBase classe).

<%@ page language="C#" %>
<%@ Register tagprefix="IRow" 
    Namespace="Samples.AspNet.CS.Controls" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>IRow Test Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:webpartmanager ID="WebPartManager1" runat="server">
        <staticconnections>
          <asp:webpartconnection ID="wp1" ProviderID="provider1" 
            ConsumerID="consumer1">
          </asp:webpartconnection>
        </staticconnections>
      </asp:webpartmanager>
       
        <asp:webpartzone ID="WebPartZone1" runat="server">
          <ZoneTemplate>
            <irow:RowProviderWebPart ID="provider1" runat="server" 
              Title="Row Provider Control" />
            <irow:RowConsumerWebPart ID="consumer1" runat="server" 
              Title="Row Consumer Control" />
          </ZoneTemplate>
        </asp:webpartzone>
    </div>
    </form>
</body>
</html>
<%@ page language="VB" %>
<%@ Register tagprefix="IRow" 
    Namespace="Samples.AspNet.VB.Controls" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>IRow Test Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:webpartmanager ID="WebPartManager1" runat="server">
        <staticconnections>
          <asp:webpartconnection ID="wp1" ProviderID="provider1" 
            ConsumerID="consumer1">
          </asp:webpartconnection>
        </staticconnections>
      </asp:webpartmanager>
       
        <asp:webpartzone ID="WebPartZone1" runat="server">
          <ZoneTemplate>
            <irow:RowProviderWebPart ID="provider1" runat="server" 
              Title="Row Provider Control" />
            <irow:RowConsumerWebPart ID="consumer1" runat="server" 
              Title="Row Consumer Control" />
          </ZoneTemplate>
        </asp:webpartzone>
    </div>
    </form>
</body>
</html>

Carrega a página num navegador. O controlo do consumidor apresenta os dados fornecidos da linha especificada, que o fornecedor disponibiliza através de uma instância da IWebPartRow interface.

Observações

Esta interface foi concebida para ser usada com ligações Web Parts. Numa ligação Web Parts, dois controlos de servidor que residem numa WebPartZoneBase zona estabelecem uma ligação e partilham dados, sendo que um controlo atua como consumidor e o outro como fornecedor. O mecanismo para partilhar dados numa ligação Web Parts é uma instância de interface, que o fornecedor fornece ao consumidor através de um método de callback. Para estabelecer uma ligação, o consumidor e o fornecedor devem ambos trabalhar com o mesmo tipo de interface para partilhar dados. Se o consumidor não reconhecer o tipo de interface enviado pelo fornecedor, ainda é possível ligar os controlos através de um transformador (um WebPartTransformer objeto) que traduz a instância de interface enviada pelo fornecedor para um tipo que o consumidor reconheça. Para detalhes sobre ligações, consulte WebPartConnectionVisão Geral das Conexões de Partes Web.

A IWebPartRow interface é uma interface de fornecedor incluída no conjunto de controlo Web Parts como interface padrão para criar ligações baseadas numa linha de dados. Também pode criar interfaces personalizadas para usar com ligações Web Parts, mas em muitas aplicações Web orientadas por dados, é útil criar ligações baseadas num campo comum (para detalhes, veja a IWebPartField interface), tabela (para detalhes, veja a IWebPartTable interface) ou linha a partir da fonte de dados. Numa ligação típica, um WebPart controlo que atua como fornecedor implementaria a IWebPartRow interface e forneceria uma instância da interface aos consumidores num método especial de callback. Por exemplo, o fornecedor pode implementar uma IWebPartRow interface para uma linha que corresponde a um utilizador na sua tabela de informações de utilizador. Outro WebPart controlo, atuando como consumidor, definiria um método especial para receber a instância da interface, podendo depois extrair os dados do utilizador, usá-los para procurar informações adicionais sobre as contas desse utilizador e exibir toda a informação relacionada com esse utilizador na página.

A IWebPartRow interface tem dois elementos expostos. A Schema propriedade devolve informação do esquema sobre a linha de dados encapsulada num PropertyDescriptorCollection objeto. O GetRowData método declara um método que um implementador (como um controlo de fornecedor) utiliza para recuperar os dados da linha da instância de interface quando o método de callback é invocado.

Propriedades

Name Description
Schema

Obtém a informação do esquema para uma linha de dados que é usada para partilhar dados entre dois WebPart controlos.

Métodos

Name Description
GetRowData(RowCallback)

Devolve os dados da linha que está a ser usada pela interface como base para uma ligação entre dois WebPart controlos.

Aplica-se a

Ver também