IWebPartField Interface
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Define uma interface de fornecedor para ligar dois controlos de servidor usando um único campo de dados.
public interface class IWebPartField
public interface IWebPartField
type IWebPartField = interface
Public Interface IWebPartField
- Derivado
Exemplos
O exemplo de código seguinte demonstra como criar uma ligação estática entre dois controlos usando a IWebPartField interface. O exemplo de código tem três partes:
Código-fonte para dois controlos personalizados WebPart que podem formar uma ligação usando a IWebPartField 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 IWebPartField 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. Depois de recuperar a instância da interface, o consumidor, no seu OnPreRender método, chama a implementação GetFieldValue do método no fornecedor para recuperar os dados reais.
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 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
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="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>
Carrega a página num navegador. O controlo do consumidor mostra os dados fornecidos a partir do campo especificado, que o fornecedor disponibiliza através de uma instância da IWebPartField 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 IWebPartField interface é uma interface de fornecedor incluída no conjunto de controlo Web Parts como interface padrão para criar ligações com base num campo 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 com base numa linha comum (para detalhes, veja a IWebPartRow interface), tabela (para detalhes, veja a IWebPartTable interface) ou campo a partir da fonte de dados, usando a IWebPartField interface. Numa ligação típica, um WebPart controlo que atua como fornecedor implementaria a IWebPartField interface e forneceria uma instância da interface aos consumidores num método especial de callback. Por exemplo, o fornecedor pode implementar uma IWebPartField interface para um campo na sua tabela de informações do utilizador que contenha os dados do código postal do utilizador Web. Outro WebPart controlo, atuando como consumidor, definiria um método especial para receber a instância da interface, podendo depois extrair os dados do código postal, procurando e exibindo informações meteorológicas com base no código postal.
A IWebPartField interface tem dois elementos expostos. A Schema propriedade devolve informação do esquema sobre o campo de dados encapsulado num PropertyDescriptor objeto. O GetFieldValue método declara um método que um implementador (como um controlo de fornecedor) utiliza para recuperar os dados de campo da instância da interface quando o método de callback é invocado.
Propriedades
| Name | Description |
|---|---|
| Schema |
Obtém a informação do esquema para um campo de dados que é usado para partilhar dados entre dois WebPart controlos. |
Métodos
| Name | Description |
|---|---|
| GetFieldValue(FieldCallback) |
Devolve o valor do campo que está a ser usado pela interface como base para uma ligação entre dois WebPart controlos. |