共用方式為


IWebPartTable 介面

定義

使用整個資料表,定義連接兩個伺服器控制項的提供者介面。

public interface class IWebPartTable
public interface IWebPartTable
type IWebPartTable = interface
Public Interface IWebPartTable

範例

下列程式代碼範例示範如何使用 介面,在兩個控件 IWebPartTable 之間建立靜態連接。 程式代碼範例有三個部分:

  • 兩個自定義 WebPart 控件的原始程式碼,這些控制件可以使用 介面形成連接 IWebPartTable ,其中一個控件做為提供者,另一個控件則做為取用者。

  • 裝載控件並以持續性格式宣告靜態連線的網頁。

  • 範例程式代碼執行時會發生什麼情況的描述。

程式代碼範例的第一個部分是兩個自定義控件的原始程式碼。 首先,是實作 介面之提供者 IWebPartTable 的程序代碼。 為了簡單起見,提供者會建立含有某些數據的數據表,而不是連接到資料庫。 方法 GetConnectionInterface 可作為提供者的連接點,這個回呼方法會將介面實例傳回給取用者。 就取用者而言,它會從名為的 提供者 SetConnectionInterface中擷取介面實例,並以 屬性標示 ConnectionConsumer 。 擷取介面的實例之後,取用者在其 方法中 OnPreRender 呼叫 方法的實 GetTableData 作,以擷取實際數據,並將其寫入頁面。

若要執行程式碼範例,您必須編譯此原始程式碼。 您可以明確地編譯它,並將產生的元件放在網站的 Bin 資料夾或全域程式集緩存中。 或者,您也可以將原始程式碼放在月臺的 App_Code資料夾中,在運行時間會動態編譯原始程式碼。 此程式代碼範例使用動態編譯。 如需示範如何編譯的逐步解說,請參閱逐步解說 :開發和使用自定義 Web 伺服器控制件

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 table data.
  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
    public sealed class TableProviderWebPart : WebPart, IWebPartTable
    {
        DataTable _table;

        public TableProviderWebPart()
        {
            _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);
        }

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

        public void GetTableData(TableCallback callback)
        {
                callback(_table.Rows);
        }

        public bool ConnectionPointEnabled
        {
            get
            {
                object o = ViewState["ConnectionPointEnabled"];
                return (o != null) ? (bool)o : true;
            }
            set
            {
                ViewState["ConnectionPointEnabled"] = value;
            }
        }

        [ConnectionProvider("Table", typeof(TableProviderConnectionPoint), 
      AllowsMultipleConnections = true)]
        public IWebPartTable GetConnectionInterface()
        {
            return new TableProviderWebPart();
        }

        public class TableProviderConnectionPoint : ProviderConnectionPoint
        {
            public TableProviderConnectionPoint(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 ((TableProviderWebPart)control).ConnectionPointEnabled;
            }
        }
    }

  // This code sample creates a Web Parts control that acts as a consumer 
  // of information provided by the TableProvider.ascx control.
  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class TableConsumer : WebPart
  {
    private IWebPartTable _provider;
    private ICollection _tableData;

    private void GetTableData(object tableData)
    {
      _tableData = (ICollection)tableData;
    }

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

    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("Table")]
    public void SetConnectionInterface(IWebPartTable provider)
    {
      _provider = provider;
    }

    public class TableConsumerConnectionPoint : ConsumerConnectionPoint
    {
      public TableConsumerConnectionPoint(MethodInfo callbackMethod,
        Type interfaceType, Type controlType, string name, string id,
        bool allowsMultipleConnections)
        : base(callbackMethod, interfaceType, controlType, name, id,
        allowsMultipleConnections)
      {
      }
    } // TableConsumerConnectionPoint
  } // TableConsumer
} // 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 table data.
  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public NotInheritable Class TableProviderWebPart
    Inherits WebPart
    Implements IWebPartTable
    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


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

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

    End Property


    Public Sub GetTableData(ByVal callback As TableCallback) _
      Implements IWebPartTable.GetTableData

      callback(_table.Rows)

    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


    <ConnectionProvider("Table", GetType(TableProviderConnectionPoint), _
      AllowsMultipleConnections:=True)> _
    Public Function GetConnectionInterface() As IWebPartTable

      Return New TableProviderWebPart()

    End Function

  End Class

  ' The connection point for the provider control.
  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class TableProviderConnectionPoint
    Inherits ProviderConnectionPoint

    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, TableProviderWebPart).ConnectionPointEnabled

    End Function
  End Class


  ' This code sample creates a Web Parts control that acts as a consumer 
  ' of information provided by the TableProvider.ascx control.
  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class TableConsumer
    Inherits WebPart
    Private _provider As IWebPartTable
    Private _tableData As ICollection


    Private Sub GetTableData(ByVal tableData As ICollection)
      _tableData = CType(tableData, ICollection)

    End Sub


    Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
      If Not (_provider Is Nothing) Then
        _provider.GetTableData(New TableCallback(AddressOf GetTableData))
      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))
            Next o
            writer.WriteBreak()
            writer.WriteLine()
            count = count + 1
          Next prop
        Else
          writer.Write("No data")
        End If
      Else
        writer.Write("Not connected")
      End If

    End Sub


    <ConnectionConsumer("Table")> _
    Public Sub SetConnectionInterface(ByVal provider As IWebPartTable)
      _provider = provider

    End Sub

  End Class

  ' The connection point for the consumer control.
  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class TableConsumerConnectionPoint
    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
  End Class

End Namespace  ' Samples.AspNet.CS.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>

在瀏覽器中載入頁面。 取用者控件會顯示指定數據表所提供的數據,提供者會透過介面的 IWebPartTable 實例提供。

備註

此介面的設計目的是要與網頁元件連線搭配使用。 在網頁元件連線中,位於區域中 WebPartZoneBase 的兩個伺服器控件會建立連線並共享數據,其中一個控件做為取用者,另一個控件做為提供者。 在 Web 元件連線中共用數據的機制是介面實例,提供者會透過回呼方法提供給取用者。 若要建立連線,取用者和提供者必須同時使用相同的介面類型來共享數據。 如果取用者無法辨識提供者所傳送的介面類型,您仍然可以透過轉換程式 WebPartTransformer 來連接控件, (物件) ,將提供者傳送的介面實例轉譯為取用者辨識的類型。 如需連線的詳細資訊,請參閱 WebPartConnectionWeb 元件連線概觀

介面 IWebPartTable 是網頁元件控制件所隨附的提供者介面,設定為根據數據表建立連接的標準介面。 您也可以建立自定義介面來與 Web 元件連線搭配使用,但在許多數據驅動 Web 應用程式中,根據通用 (字段建立聯機會很有用,如需詳細資訊,請參閱介面) 、數據列 (、請參閱IWebPartFieldIWebPartRow介面) 或數據源中的數據表。 在一般連線中, WebPart 做為提供者的控件會實 IWebPartTable 作 介面,並在特殊回呼方法中將介面的實例提供給取用者。 例如,提供者可能會針對包含財務效能數據的數據表實 IWebPartTable 作介面。 另一個 WebPart 做為取用者的控件會定義特殊方法來接收介面實例,然後擷取數據並轉譯圖表以顯示結果資訊。

介面 IWebPartTable 有兩個公開的成員。 屬性 Schema 會傳回 物件中所 PropertyDescriptorCollection 封裝之數據表的架構資訊。 方法 GetTableData 會宣告實作者 (的方法,例如提供者控件,) 叫用回呼方法時,用來擷取介面實例的數據表數據。

屬性

Schema

取得資料表的結構描述資訊,這個資料表是用於兩個 WebPart 控制項之間共用資料。

方法

GetTableData(TableCallback)

傳回資料表的資料,介面正在將此資料表用作兩個 WebPart 控制項之間連接的基礎。

適用於

另請參閱