IWebPartRow Интерфейс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет интерфейс поставщика для связи двух серверных элементов управления с использованием одного поля данных.
public interface class IWebPartRow
public interface IWebPartRow
type IWebPartRow = interface
Public Interface IWebPartRow
Примеры
В следующем примере кода показано, как создать статическое соединение между двумя элементами IWebPartRow управления с помощью интерфейса . Пример кода состоит из трех частей:
Исходный код для двух пользовательских WebPart элементов управления, которые могут сформировать соединение с помощью IWebPartRow интерфейса , при этом один элемент управления выступает в качестве поставщика, а другой — в качестве потребителя.
Веб-страница, на котором размещаются элементы управления и объявляется статическое подключение в формате сохраняемости.
Описание того, что происходит при выполнении примера кода.
Первая часть примера кода — это исходный код для двух пользовательских элементов управления. Во-первых, это код для поставщика, который реализует IWebPartRow интерфейс . Для простоты в примере поставщик создает таблицу с некоторыми данными, а не подключается к базе данных. Метод GetConnectionInterface
служит точкой подключения поставщика, методом обратного вызова, который возвращает экземпляр интерфейса потребителю. Что касается потребителя, он получает экземпляр интерфейса от поставщика в методе с именем SetConnectionInterface
, который помечен атрибутом ConnectionConsumer
. После получения экземпляра интерфейса потребитель в своем OnPreRender
методе вызывает реализацию GetRowData метода в поставщике, чтобы получить фактические данные и записать их на страницу.
Для выполнения примера кода необходимо скомпилировать этот исходный код. Ее можно скомпилировать явным образом и поместить полученную сборку в папку Bin веб-сайта или глобальный кэш сборок. Кроме того, исходный код можно поместить в папку App_Code сайта, где он будет динамически компилироваться во время выполнения. В этом примере кода используется динамическая компиляция. Пошаговое руководство, демонстрирующее компиляцию, см. в разделе Пошаговое руководство. Разработка и использование пользовательского серверного веб-элемента управления.
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
Вторая часть примера кода — это веб-страница, которая объявляет статическое подключение и размещает элементы управления. В верхней части страницы находится директива Register
, которая объявляет пространство имен исходного кода, содержащегося в каталоге App_Code. Соединение объявляется с помощью <asp:webpartconnection>
элемента . Пользовательские элементы управления-получатель и поставщик объявляются в <zonetemplate>
элементе в <asp:webpartzone>
элементе, который необходим для подключения (они должны находиться в зоне, наследуемой от WebPartZoneBase класса ).
<%@ 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>
Загрузите страницу в браузере. Элемент управления "Потребитель" отображает данные, предоставленные из указанной строки, которые поставщик делает доступными через экземпляр IWebPartRow интерфейса .
Комментарии
Этот интерфейс предназначен для использования с подключениями веб-частей. В подключении веб-частей два серверных элемента управления, которые находятся в зоне, устанавливают подключение и совместно используют данные, при этом один элемент управления выступает в WebPartZoneBase качестве потребителя, а другой — в качестве поставщика. Механизм совместного использования данных в подключении веб-частей — это экземпляр интерфейса, который поставщик обслуживает потребителю с помощью метода обратного вызова. Чтобы установить подключение, потребитель и поставщик должны работать с одинаковым типом интерфейса для совместного использования данных. Если потребитель не распознает тип интерфейса, отправленный поставщиком, все равно можно подключить элементы управления с помощью преобразователя ( WebPartTransformer объекта), который преобразует экземпляр интерфейса, отправленный поставщиком, в тип, распознаемый потребителем. Дополнительные сведения о подключениях см. в разделах и Общие сведения WebPartConnection о подключениях веб-частей.
Интерфейс IWebPartRow — это интерфейс поставщика, включенный в набор элементов управления веб-частей в качестве стандартного интерфейса для создания подключений на основе строки данных. Вы также можете создавать пользовательские интерфейсы для использования с подключениями веб-частей, но во многих веб-приложениях, управляемых данными, полезно создавать подключения на основе общего поля (дополнительные сведения см. IWebPartField в интерфейсе), таблицы (дополнительные сведения см. в интерфейсе IWebPartTable ) или строки из источника данных. В типичном соединении элемент управления, выступающий в качестве поставщика, WebPart реализует IWebPartRow интерфейс и предоставляет экземпляр интерфейса потребителям в специальном методе обратного вызова. Например, поставщик может реализовать IWebPartRow интерфейс для строки, соответствующей пользователю в таблице сведений о пользователях. Другой WebPart элемент управления, выступающий в качестве потребителя, определяет специальный метод получения экземпляра интерфейса, а затем может извлечь пользовательские данные, использовать их для поиска дополнительных сведений об учетных записях этого пользователя и отображения всей информации, связанной с этим пользователем, на странице.
Интерфейс IWebPartRow имеет два открытых члена. Свойство Schema возвращает сведения о схеме строки данных, инкапсулированной в объекте PropertyDescriptorCollection . Метод GetRowData объявляет метод, который реализует (например, элемент управления поставщика) для получения данных строки экземпляра интерфейса при вызове метода обратного вызова.
Свойства
Schema |
Получает данные схемы для строки данных, которая используется для совместного использования данных между двумя элементами управления WebPart. |
Методы
GetRowData(RowCallback) |
Возвращает данные для строки, которая используется интерфейсом в качестве основы для связи между двумя элементами управления WebPart. |